Amazon ECS Fargate에 자동 배포

오늘날의 소프트웨어 개발 라이프사이클 세계에서는 신속하고 중단 없는 제품 게시 방법이 필요합니다. 특히 컨테이너 영역에서는 컨테이너화된 애플리케이션을 환경에 배포하는 방법이 많이 있습니다.

이 게시물에서는 AWS CLI 및 GitLab CI/CD를 사용하여 자동화된 방식으로 인프라를 관리할 필요 없이 컨테이너를 실행하는 서버리스 옵션인 Amazon ECS Fargate에 컨테이너화된 애플리케이션을 배포하는 방법을 언급하고 싶습니다.

시작하기 전에 필요한 환경은 다음과 같습니다. 따라서 아래에서 언급한 기술 스택에 대해 이미 사용 중이거나 익숙하다고 가정합니다.
  • Amazon ECS Cluster - Fargate
  • GitLab CI/CD
  • AWS CLI

  • ECS 클러스터를 생성한 다음 컨테이너화된 애플리케이션의 첫 번째 릴리스를 ECS Fargate에 배포했다고 가정해 보십시오. 그러나 계속해서 컨테이너의 새 릴리스 배포를 자동화하는 데 필요할 것입니다.

    이를 위해 GitLab CI/CD와 결합하여 AWS CLI를 활용합니다.

    1단계 - ECS 작업 정의 생성



    컨테이너화된 애플리케이션의 도커 관련 명령을 참조하는 정의와 유사한 정의ECS task definition를 생성해야 합니다.

    myapp-ecs-task-definition.json

    {
        "family": "myapp-preprod-fargate",
        "executionRoleArn": "arn:aws:iam::<aws_account_id>:role/ecsTaskExecutionRole",
        "taskRoleArn": "arn:aws:iam::<aws_account_id>:role/ecsTaskExecutionRole",
        "cpu": "1 vCPU",
        "memory": "4GB",
        "networkMode": "awsvpc",
        "containerDefinitions": [
            {
                "name": "myapp-preprod",
                "image": "<aws_account_id>.dkr.ecr.eu-central-1.amazonaws.com/myapp:latest",
                "logConfiguration": {
                    "logDriver": "awslogs",
                    "options": {
                        "awslogs-group": "/ecs/myapp-preprod-fargate",
                        "awslogs-region": "eu-central-1",
                        "awslogs-stream-prefix": "ecs"
                    }
                },
                "portMappings": [
                    {
                        "protocol": "tcp",
                        "containerPort": 3000
                    }
                ],
                "cpu": 0,
                "essential": true
            }
        ],
        "requiresCompatibilities": [
            "FARGATE"
        ]
    }
    
    


    Pay attention to "image": ".dkr.ecr.eu-central-1.amazonaws.com/myapp:latest"


  • 여기에서 "최신"태그를 적절한 컨테이너 이미지 버전 태그로 대체합니다.

  • 2단계 - gitlab-ci.yml 준비



    이제 업데이트된 컨테이너화된 애플리케이션을 ECS Fargate에 자동으로 배포하는 데 사용할 CI/CD 측을 준비해야 합니다.

  • ecs-gitlab-ci.yml은 빌드 및 배포 단계를 포함하는 완전히 준비된 .gitlab-ci.yml 파일입니다. Amazon ECS Fargate 관련 섹션을 살펴보겠습니다.

  • 고유한 컨테이너 이미지 버전 태그 설정


  • 아래 명령은 이미지 태그를 최신에서 *환경 이름 preprod 및 파이프라인 번호인 관련 태그로 바꿉니다. *

  • sed -i 's/latest/'"${CI_ENVIRONMENT_NAME}-${CI_PIPELINE_IID}"'/g' myapp-ecs-task-definition.json
    


    위의 명령을 실행하면 컨테이너 이미지가 아래와 같이 표시됩니다.

    <aws_account_id>.dkr.ecr.eu-central-1.amazonaws.com/myapp:preprod-1 
    


    이를 통해 우리가 실행하는 모든 CI/CD 파이프라인에서 고유한 컨테이너 이미지 태그가 ECS 작업 정의 파일에 주입됩니다.

    ECS 작업 개정 번호 가져오기



    이제 업데이트된 작업 정의 파일을 등록하여 새 작업 정의를 생성하고 개정 번호를 얻습니다.

    export TASK_REVISION=$(aws ecs register-task-definition \
    --family ${ECS_TASK_FAMILY} \
    --cli-input-json file://myapp-ecs-task-definition.json \
    --region eu-central-1 | jq --raw-output '.taskDefinition.revision')
    
    echo "Registered ECS Task Definition = " $TASK_REVISION
    


    위의 명령을 실행하면 고유 개정 번호가 있는 ECS 작업 정의 파일이 생성됩니다.

  • aws ecs register-task-definition 명령은 기본적으로 개정 번호를 하나씩 증가시켜 새 작업 정의 파일을 생성합니다. 그리고 아래와 같이 보일 것입니다.

  • echo "Updated Task Definition = " $ECS_TASK_FAMILY:$TASK_REVISION
    myapp-preprod-fargate:1
    


    ECS 서비스 업데이트 - 롤링 업데이트



    마지막 단계에서는 업데이트된 작업 개정으로 ECS 서비스를 업데이트해야 합니다. 아래 명령은 ECS 서비스에 대한 롤링 업데이트를 트리거합니다.

    UPDATE_ECS_SERVICE=$(aws ecs update-service \
    --cluster $ECS_CLUSTER_NAME \
    --service $ECS_SERVICE_NAME \
    --task-definition $ECS_TASK_FAMILY:$TASK_REVISION \
    --desired-count 1 \
    --region eu-central-1 | jq --raw-output '.service.serviceName')
    
    echo "Deployment of $UPDATE_ECS_SERVICE has been completed"
    


    그게 다야! 이제 다운타임 없이 자동화된 방식으로 컨테이너화된 애플리케이션을 배포할 수 있습니다.

    이 게시물에서는 AWS CLI 및 GitLab CI/CD를 사용하여 Amazon ECS Fargate에 대한 컨테이너 배포 프로세스를 자동화하는 방법에 대해 언급하고 싶었습니다.

    좋은 웹페이지 즐겨찾기