1. Cloud9 인스턴스의 IDE로 이동

  2. 애플리케이션 소스코드의 src/main/java/com/example/demo/DemoApplication.java 파일 열기

    Untitled

  3. 31번 라인의 메세지를 원하는 값으로 변경하고 저장

    Untitled

  4. 변경 사항을 CodeCommit에 반영

    {
    	cd ~/environment/backend
    	git add .
    	git commit -m "update greeting message"
    	git push
    }
    
  5. Commit ID를 확인하고 환경변수로 지정

    {
    	export COMMIT_ID=$(git rev-parse --short HEAD)
    	echo $COMMIT_ID
    }
    
  6. 컨테이너 이미지 빌드

    docker build -t backend:$COMMIT_ID .
    
  7. 위에서 생성한 컨테이너 이미지에 새로운 태그 부여

    {
      export ECR_REPO=$(aws ecr describe-repositories --repository-name backend \\
      --query 'repositories[0].repositoryUri' \\
      --output text)
      
      docker image tag backend:$COMMIT_ID $ECR_REPO:$COMMIT_ID
    }
    
  8. 컨테이너 이미지를 ECR 리포지토리로 업로드

    docker image push $ECR_REPO:$COMMIT_ID
    
  9. 인증 실패로 업로드에 실패할 경우에 ECR 레지스트리에 로그인 후 위의 명령어 재실행

    {
        export ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
        aws ecr get-login-password | docker login --username AWS --password-stdin $ACCOUNT_ID.dkr.ecr.ap-northeast-2.amazonaws.com
    }
    
  10. 이미지가 정상적으로 업로드 되었는지 확인

    aws ecr list-images --repository-name backend --no-cli-pager
    
  11. 위에서 업로드한 이미지를 사용하는 태스크 정의 파일 생성

    {
      export ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
      export ECR_REPO=$(aws ecr describe-repositories --repository-name backend \\
      --query 'repositories[0].repositoryUri' \\
      --output text)
      cat <<EOF | tee ~/environment/taskdef.json
    {
        "family": "backend",
        "requiresCompatibilities": [
            "EC2",
            "FARGATE"
        ],
        "runtimePlatform": {
            "cpuArchitecture": "X86_64",
            "operatingSystemFamily": "LINUX"
        },
        "networkMode": "awsvpc",
        "cpu": "512",
        "memory": "1024",
        "executionRoleArn": "arn:aws:iam::$ACCOUNT_ID:role/ecsTaskExecutionRole",
        "containerDefinitions": [
            {
                "name": "backend",
                "image": "$ECR_REPO:$COMMIT_ID",
                "portMappings": [
                    {
                        "containerPort": 8080,
                        "hostPort": 8080,
                        "protocol": "tcp"
                    }
                ],
                "essential": true,
                "logConfiguration": {
                    "logDriver": "awslogs",
                    "options": {
                        "awslogs-create-group": "true",
                        "awslogs-group": "/ecs/backend",
                        "awslogs-region": "ap-northeast-2",
                        "awslogs-stream-prefix": "ecs"
                    }
                }
            }
        ]
    }
    EOF
    }
    
  12. 태스크 정의 생성

    aws ecs register-task-definition \\
    --cli-input-json file://~/environment/taskdef.json \\
    --no-cli-pager
    
  13. 태스크 정의가 정상적으로 등록되었는지 확인

    aws ecs list-task-definitions --family-prefix backend
    
  14. AWS 관리 콘솔에서 ECS로 이동해서 backend 서비스 클릭

    Untitled

  15. 오른쪽 위에 서비스 업데이트 클릭

    Untitled

  16. 개정에 **2 (최신)**을 선택 - 만약 최신 개정이 2가 아닐 경우에는 (최신) 태그를 가진 버전 선택

    Untitled

  17. 스크롤을 페이지 맨 아래로 내려서 오른쪽 아래에 있는 업데이트 클릭

    Untitled

  18. 배포가 완료될때까지 대기

    Untitled

  19. 아래와 같이 배포가 완료되었으면 Cloud9 인스턴스 IDE로 이동

    Untitled

  20. 애플리케이션 업데이트가 정상적으로 완료되었는지 확인

    {
    	export ALB_DNS=$(aws elbv2 describe-load-balancers --names my-backend-alb \\
    	--query 'LoadBalancers[0].DNSName' \\
    	--output text)
    
    	curl -w "\\n" $ALB_DNS/api/greeting
    }