AWS CLI를 사용해 첫 번째 Express Mode 서비스 만들기

AWS CLI를 사용해 첫 번째 Express Mode 서비스 만들기

이 튜토리얼에서는 AWS CLI를 사용해 Express Mode 서비스 애플리케이션을 만드는 방법을 보여드려요. Express Mode의 핵심 기능을 보여주는 간단한 웹 애플리케이션을 배포해요.

출처: 문서

본문

이 튜토리얼에서는 AWS CLI를 사용해 Express Mode 서비스 애플리케이션을 만드는 방법을 보여줍니다. Express Mode 서비스의 핵심 기능을 보여주는 간단한 웹 애플리케이션을 배포합니다.

사전 준비 사항

시작하기 전에 다음이 있는지 확인하세요.

  • 적절한 권한이 있는 AWS 계정
  • 설치되고 구성된 AWS CLI
  • Amazon ECR 또는 프라이빗 레지스트리에 저장된 컨테이너 이미지
  • 서비스를 만드는 AWS 리전에 공용 서브넷이 있는 기본 VPC. 기본적으로 Express Mode 서비스는 계정의 기본 VPC와 공용 서브넷에 인터넷 연결 로드 밸런서를 만듭니다. 계정에 기본 VPC가 없다면 시작 전에 만들거나, 서비스를 만들 때 자신의 서브넷을 지정하세요. 자세한 내용은 Amazon VPC User Guide의 Default VPCs를 참고하세요.

1단계: IAM 역할 만들기

Express Mode 서비스에는 두 개의 IAM 역할이 필요합니다. 작업 실행 역할(Task Execution Role)은 Amazon ECS가 사용자를 대신해 컨테이너 이미지를 풀하고 로그를 쓰도록 합니다.

다음 정책을 사용해 작업 실행 역할과 인프라 역할을 만드세요.

#Create the roles with ECS trust policies
aws iam create-role --role-name ecsTaskExecutionRole \
    --assume-role-policy-document '{
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Service": "ecs-tasks.amazonaws.com"
                },
                "Action": "sts:AssumeRole"
            }
        ]
    }'

aws iam create-role --role-name ecsInfrastructureRoleForExpressServices \
    --assume-role-policy-document '{
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "AllowAccessInfrastructureForECSExpressServices",
                "Effect": "Allow",
                "Principal": {
                    "Service": "ecs.amazonaws.com"
                },
                "Action": "sts:AssumeRole"
            }
        ]
    }'
#Attach the AWS managed policies
aws iam attach-role-policy --role-name ecsTaskExecutionRole \
    --policy-arn arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy
aws iam attach-role-policy --role-name ecsInfrastructureRoleForExpressServices \
    --policy-arn arn:aws:iam::aws:policy/service-role/AmazonECSInfrastructureRoleforExpressGatewayServices

자세한 내용은 Amazon ECS task execution IAM role을 참고하세요.

참고: IAM 역할은 최종적으로 일관됩니다(eventually consistent). 따라서 새로 만든 역할이 즉시 사용 가능하지 않을 수 있습니다. 역할을 만든 직후 첫 create-express-gateway-service 호출이 Unable to assume the service linked role(또는 유사한 assume-role 오류)로 실패하면 역할이 전파될 때까지 잠시(약 1분) 기다린 후 명령을 다시 시도하세요.

2단계: 첫 Express Mode 서비스 애플리케이션 만들기

최소 필수 매개변수로 Express Mode 서비스 애플리케이션을 만드세요.

aws ecs create-express-gateway-service \
    --primary-container "image"="public.ecr.aws/nginx/nginx:latest" \
    --execution-role-arn arn:aws:iam::123456789012:role/ecsTaskExecutionRole \
    --infrastructure-role-arn arn:aws:iam::123456789012:role/ecsInfrastructureRoleForExpressServices \
    --monitor-resources

이 명령은 다음을 포함한 Express Mode 서비스 애플리케이션을 만듭니다.

  • 이미지 이름에서 생성된 고유한 서비스 이름
  • 1 vCPU와 2 GB 메모리
  • HTTPS 트래픽용 포트 80
  • CPU 사용률에 기반한 자동 확장
  • 기본 VPC와 공용 서브넷의 인터넷 연결 Application Load Balancer
  • servicename.ecs.region.on.aws 형식의 이 서비스에 고유한 URL

이 명령은 리소스가 프로비저닝되는 동안 지속적으로 모니터링하고 상태를 반환합니다. 서비스 배포가 완료되면 애플리케이션 URL이 트래픽을 받을 준비가 됩니다. 모니터링을 중단하면 서비스 ARN과 URL을 포함한 생성된 서비스 정보가 반환됩니다.

{
    "service": {
        "cluster": "arn:aws:ecs:region:123456789012:cluster/default",
        "serviceName": "nginx-1234",
        "serviceArn": "arn:aws:ecs:region:123456789012:service/default/nginx-1234",
        "infrastructureRoleArn": "arn:aws:iam::123456789012:role/ecsInfrastructureRoleForExpressServices",
        "status": {
            "statusCode": "ACTIVE"
        },
        "createdAt": "UNIXTIMESTAMP"
    }
}

3단계: 사용자 지정 설정으로 Express Mode 서비스 애플리케이션 만들기

추가 매개변수를 지정해 Express Mode 서비스 애플리케이션을 사용자 지정할 수 있습니다.

aws ecs create-express-gateway-service \
    --execution-role-arn arn:aws:iam::123456789012:role/ecsTaskExecutionRole \
    --infrastructure-role-arn arn:aws:iam::123456789012:role/ecsInfrastructureRoleForExpressServices \
    --primary-container '{"image":"123456789012.dkr.ecr.region.amazonaws.com/my-app:latest","containerPort":8080,"environment":[{"name":"ENV","value":"production"},{"name":"DEBUG","value":"false"}]}' \
    --service-name "my-web-app" \
    --cpu 2 \
    --memory 4 \
    --cpu-architecture ARM64 \
    --health-check-path "/health" \
    --scaling-target '{"minTaskCount":3,"maxTaskCount":100}' \
    --monitor-resources

이 명령은 다음을 포함한 애플리케이션을 만듭니다.

  • 사용자 지정 이름 "my-web-app"
  • 2 vCPU와 4 GB 메모리
  • AWS Graviton 기반 컴퓨팅에서 실행되는 ARM64 CPU 아키텍처
  • 애플리케이션 트래픽용 포트 8080
  • 사용자 지정 상태 확인 엔드포인트
  • 환경 변수
  • 자동 확장용 최소 3개, 최대 100개 작업

자신의 작업 정의로 Express Mode 서비스 만들기

자신의 작업 정의로 Express Mode 서비스를 만들 수도 있습니다. 자신의 작업 정의를 사용하면 작업 수준 구성을 완전히 제어할 수 있습니다. Express Mode는 로드 밸런싱, 자동 확장, 카나리아 배포를 포함한 인프라를 계속 관리합니다.

다음 AWS CLI 명령은 사용자 지정 작업 정의로 Express Mode 서비스를 만듭니다.

aws ecs create-express-gateway-service \
    --infrastructure-role-arn arn:aws:iam::123456789012:role/ecsInfrastructureRoleForExpressServices \
    --task-definition-arn arn:aws:ecs:us-west-2:123456789012:task-definition/my-td:3 \
    --health-check-path "/health" \
    --monitor-resources

작업 정의는 다음 요구 사항을 충족해야 합니다.

  • Main이라는 이름의 컨테이너
  • Main 컨테이너는 컨테이너 포트와 포트 이름이 있는 단일 TCP 포트 매핑이 있어야 함
  • 작업 정의의 compatibilities에 FARGATE가 있어야 함

참고: taskDefinitionArn 매개변수는 같은 API 호출에서 primaryContainer, executionRoleArn, taskRoleArn, cpu, memory와 함께 지정할 수 없습니다. Express Mode는 제공된 작업 정의에서 이 값을 파생합니다.

4단계: 배포 모니터링하기

--monitor-resources 플래그는 Express Mode 서비스에 대한 모든 Create, Update, Delete 호출에서 동작합니다. 또한 변경 작업과 별개로 언제든지 서비스의 리소스를 모니터링할 수 있습니다. 배포 시간은 프로비저닝해야 하는 리소스에 따라 달라질 수 있습니다.

상태가 ACTIVE로 변경되면 애플리케이션이 트래픽을 받을 준비가 된 것입니다.

aws ecs monitor-express-gateway-service --service-arn arn:aws:ecs:region:123456789012:service/default/app-23d97h88

Express Mode 서비스 애플리케이션의 현재 구성과 상태도 확인할 수 있습니다.

aws ecs describe-express-gateway-service --service-arn arn:aws:ecs:region:123456789012:service/default/app-23d97h88

5단계: 애플리케이션 접근하기

활성 상태가 되면 제공된 URL로 Express Mode 서비스 애플리케이션에 접근하세요. URL 형식은 다음과 같습니다.

https://<service-name>.ecs.<region>.on.aws/

예를 들어:

https://app-23d97h88.ecs.us-west-2.on.aws/

이제 애플리케이션이 다음과 함께 실행됩니다.

  • 자동 SSL/TLS 종료
  • 여러 가용 영역에 걸친 로드 밸런싱
  • CPU 사용률에 기반한 자동 확장
  • CloudWatch 로깅 및 모니터링
  • 향후 업데이트를 위한 5XX 롤백 알람과 카나리아 배포

더 알아보기 (Learn more)