diff --git a/.github/workflows/deploy-to-ec2.yml b/.github/workflows/deploy-to-ec2.yml index 292de29..f8aac14 100644 --- a/.github/workflows/deploy-to-ec2.yml +++ b/.github/workflows/deploy-to-ec2.yml @@ -1,4 +1,3 @@ -# CI/CD pipeline to deploy a Flask app to AWS EC2 instances and Autoscaling EC2 instances name: Build and Deploy to AWS on: @@ -35,6 +34,7 @@ jobs: SPOTIFY_CLIENT_ID=${{ secrets.SPOTIFY_CLIENT_ID }} SPOTIFY_SECRET_ID=${{ secrets.SPOTIFY_SECRET_ID }} ENVIRONMENT=${{ secrets.ENVIRONMENT }} + - name: Set up AWS CLI uses: aws-actions/configure-aws-credentials@v1 with: @@ -42,7 +42,7 @@ jobs: aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region: ${{ secrets.AWS_REGION }} - - name: Retrieve EC2 instance IP + - name: Retrieve EC2 instance IPs id: get_instances_ips run: | aws ec2 describe-instances --filters "Name=tag:Name,Values=ec2-1" "Name=instance-state-name,Values=running" --query "Reservations[*].Instances[*].PublicIpAddress" --output text > ec2_instance_ip.txt @@ -63,49 +63,40 @@ jobs: - name: Update EC2 with new Docker image run: | - - - ssh -o StrictHostKeyChecking=no -i /home/runner/.ssh/id_rsa ubuntu@${{ env.EC2_1_IP }} << EOF - docker pull ${{ secrets.DOCKER_HUB_USERNAME }}/flask-app-image-repository:latest - docker stop my-container || true - docker rm my-container || true - docker run -d --name my-container -p 80:5000 ${{ secrets.DOCKER_HUB_USERNAME }}/flask-app-image-repository:latest - EOF - ssh -o StrictHostKeyChecking=no -i /home/runner/.ssh/id_rsa ubuntu@${{ env.EC2_2_IP }} << EOF - docker pull ${{ secrets.DOCKER_HUB_USERNAME }}/flask-app-image-repository:latest - docker stop my-container || true - docker rm my-container || true - docker run -d --name my-container -p 80:5000 ${{ secrets.DOCKER_HUB_USERNAME }}/flask-app-image-repository:latest - EOF - ssh -o StrictHostKeyChecking=no -i /home/runner/.ssh/id_rsa ubuntu@${{ env.EC2_3_IP }} << EOF - docker pull ${{ secrets.DOCKER_HUB_USERNAME }}/flask-app-image-repository:latest - docker stop my-container || true - docker rm my-container || true - docker run -d --name my-container -p 80:5000 ${{ secrets.DOCKER_HUB_USERNAME }}/flask-app-image-repository:latest + for ip in ${{ env.EC2_1_IP }} ${{ env.EC2_2_IP }} ${{ env.EC2_3_IP }}; do + ssh -o StrictHostKeyChecking=no -i /home/runner/.ssh/id_rsa ubuntu@$ip << EOF + docker pull ${{ secrets.DOCKER_HUB_USERNAME }}/flask-app-image-repository:latest + docker stop my-container || true + docker rm my-container || true + docker run -d --name my-container -p 80:5000 ${{ secrets.DOCKER_HUB_USERNAME }}/flask-app-image-repository:latest + EOF + done + - name: Retrieve Autoscaling EC2 instance IDs + run: | + aws autoscaling describe-auto-scaling-instances --query "AutoScalingInstances[*].InstanceId" --output text > autoscaling_instance_ids.txt + echo "Autoscaling instance IDs: $(cat autoscaling_instance_ids.txt)" - - name: Retrieve Autoscaling EC2 server ips + - name: Retrieve Autoscaling EC2 instance IPs id: get_autoscaling_instances_ips run: | - aws ec2 describe-instances --instance-ids $(cat autoscaling_instance_ids.txt) --query "Reservations[*].Instances[*].PublicIpAddress" --output text > autoscaling_instance_ips.txt << EOF + aws ec2 describe-instances --instance-ids $(cat autoscaling_instance_ids.txt) --query "Reservations[*].Instances[*].PublicIpAddress" --output text > autoscaling_instance_ips.txt + echo "Autoscaling instance IPs: $(cat autoscaling_instance_ips.txt)" ips_file="autoscaling_instance_ips.txt" IFS=$'\n' read -d '' -r -a ips < "$ips_file" for i in "${!ips[@]}"; do - echo "Auto_Instance_ID_$((i+1)): ${ids[i]}" >> $GITHUB_ENV - echo "Auto_Instance_IP_$((i+1)): ${ips[i]}" >> $GITHUB_ENV + echo "Auto_Instance_IP_$((i+1))=${ips[i]}" >> $GITHUB_ENV done - EOF + - name: Update Autoscaling EC2 with new Docker image - run: | - aws ec2 describe-instances --instance-ids $(cat autoscaling_instance_ids.txt) --query "Reservations[*].Instances[*].PublicIpAddress" --output text > autoscaling_instance_ips.txt << EOF + run: | ips_file="autoscaling_instance_ips.txt" IFS=$'\n' read -d '' -r -a ips < "$ips_file" - for i in "${!ips[@]}"; do - ssh -o StrictHostKeyChecking=no -i /home/runner/.ssh/id_rsa ubuntu@${ips[i]} << EOF - docker pull ${{ secrets.DOCKER_HUB_USERNAME }}/flask-app-image-repository:latest - docker stop my-container || true - docker rm my-container || true - docker run -d --name my-container -p 80:5000 ${{ secrets.DOCKER_HUB_USERNAME }}/flask-app-image-repository:latest - EOF - done - + for ip in "${ips[@]}"; do + ssh -o StrictHostKeyChecking=no -i /home/runner/.ssh/id_rsa ubuntu@$ip << EOF + docker pull ${{ secrets.DOCKER_HUB_USERNAME }}/flask-app-image-repository:latest + docker stop my-container || true + docker rm my-container || true + docker run -d --name my-container -p 80:5000 ${{ secrets.DOCKER_HUB_USERNAME }}/flask-app-image-repository:latest + EOF + done