Docker Compose로 만든 여러 컨테이너를 AWS ECS로 올려 봅니다.

AWS의 서비스 기사는 여러가지 혼란스러워서 베타판 시절의 기사가 히트하거나 튜토리얼만 히트하여 결국 업무에서 사용할 수 있게 되었을 때 어디서부터 시작해야 할지 모르겠습니다. 그래.
나도 이것 어디서부터 시작할까라고 생각하고 있었습니다. 우선은 로컬 측에서 준비합니다.

AWS CLI 준비


AWS 명령줄 도구입니다. 저는 Windows에 서브시스템으로 들어 있는(WSL이라고 하는 사람입니다) Ubuntu 를 사용하고 있기 때문에 Linux 판의 CLI 를 넣을 수 있습니다.
설치 방법의 공식 문서 을 읽고 그대로 복사하면 들어갑니다.
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
들어갔는지 확인합니다.
$ aws --version
aws-cli/2.1.29 Python/3.8.8 Linux/5.4.72-microsoft-standard-WSL2 exe/x86_64.ubuntu.20 prompt/off
오늘 시점에서 최신 2.1.29가 들어갔습니다.

프로필 만들기


AWS에 대한 연결 정보가 포함된 프로필을 생성합니다.
$ aws configure --profile dev
AWS Access Key ID [None]: XXXXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXX
Default region name [None]: ap-northeast-1
Default output format [None]: json
할 수 있었습니다.

Amazon ECS용 docker context 생성

$ docker context create ecs ecs_dev_context
? Create a Docker context using: An existing AWS profile
? Select AWS Profile dev
Successfully created ecs context "ecs_dev_context"
할 수 있었다
$   docker context ls
NAME                TYPE                DESCRIPTION                               DOCKER ENDPOINT               KUBERNETES ENDPOINT   ORCHESTRATOR
default *           moby                Current DOCKER_HOST based configuration   unix:///var/run/docker.sock                         swarm
ecs_dev_context     ecs 

설정 확인


잘 모르겠지만 LongArnFormat에 대한 설정이 Enable
해야 한다고 합니다. 전부 Enable이 되어 있는 것을 확인했습니다.
$ aws ecs list-account-settings --effective-settings
{
    "settings": [
        {
            "name": "awsvpcTrunking",
            "value": "disabled",
            "principalArn": "arn:aws:iam::XXXXXXXXXXXX:user/sugimoto-dev"
        },
        {
            "name": "containerInsights",
            "value": "disabled",
            "principalArn": "arn:aws:iam::XXXXXXXXXXXX:user/sugimoto-dev"
        },
        {
            "name": "containerInstanceLongArnFormat",
            "value": "enabled",
            "principalArn": "arn:aws:iam::XXXXXXXXXXXX:user/sugimoto-dev"
        },
        {
            "name": "dualStackIPv6",
            "value": "enabled",
            "principalArn": "arn:aws:iam::XXXXXXXXXXXX:user/sugimoto-dev"
        },
        {
            "name": "serviceLongArnFormat",
            "value": "enabled",
            "principalArn": "arn:aws:iam::XXXXXXXXXXXX:user/sugimoto-dev"
        },
        {
            "name": "taskLongArnFormat",
            "value": "enabled",
            "principalArn": "arn:aws:iam::XXXXXXXXXXXX:user/sugimoto-dev"
        }
    ]
}

ECR 리포지토리 준비


웹 브라우저에서 AWS 콘솔에 로그인하여 여기에서 생성합니다.

ECR에 로그인


또한 로컬 명령입니다.
로그인이 필요합니다.
$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin  XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com
username 은 자신의 것을 넣는 것이 아니라 고정으로 AWS 와 넣는 것 같습니다.
푸시해 둔다.
docker-compose push
Pushing api (XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/hogehoge:latest)...
The push refers to repository [XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/hogehoge]
1f6de88c2dc9: Preparing                                                                                                 73e3e78bfd9a: Preparing                                                                                                 7384658657bf: Preparing                                                                                                 c1ae2439e41e: Preparing                                                                                                 72fd383bd06f: Preparing                                                                                                 7e918812cca3: Waiting                                                                                                   b45d11f9e6b5: Waiting                                                                                                   3676846f14f0: Waiting                                                                                                   10c7b2ce5f37: Waiting                                                                                                   e3d73f29c674: Waiting                                                                                                   10bf86ff9f6a: Waiting                                                                                                   da654bc8bc80: Waiting                                                                                                   4ef81dc52d99: Waiting                                                                                                   909e93c71745: Waiting                                                                                                   7f03bfe4d6dc: Waiting                                                                                                   ERROR: denied: User: arn:aws:iam::XXXXXXXXXXXX:user/hogefuga-user is not authorized to perform: ecr:InitiateLayerUpload on resource: arn:aws:ecr:ap-northeast-1:XXXXXXXXXXXX:repository/hogehoge
오류가 발생했습니다. ? ? ? ? ?
아.
version: '3.8'
services:
  api:
    build: ./app
    image: XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/api-hawk:latest
    ports:
      - 5000:5000
docker-compose의 이미지에서 XXXXXXXXXXXX에 잘못된 사용자 ID를 넣었습니다. 아호입니다. 제대로 콘솔에서 얻은 리포지토리 URL을 넣으십시오.
$ docker-compose push
Pushing api (XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/hogehoge:latest)...
The push refers to repository [XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/hogehoge]
1f6de88c2dc9: Pushed                                                                                                    73e3e78bfd9a: Pushed                                                                                                    7384658657bf: Pushed                                                                                                    c1ae2439e41e: Pushed                                                                                                    72fd383bd06f: Pushed                                                                                                    7e918812cca3: Pushed                                                                                                    b45d11f9e6b5: Pushed                                                                                                    3676846f14f0: Pushed                                                                                                    10c7b2ce5f37: Pushed                                                                                                    e3d73f29c674: Pushed                                                                                                    10bf86ff9f6a: Pushed                                                                                                    da654bc8bc80: Pushed                                                                                                    4ef81dc52d99: Pushed                                                                                                    909e93c71745: Pushed                                                                                                    7f03bfe4d6dc: Pushed                                                                                                    latest: digest: sha256:7e949d6732a116f81811c4520b505391a6da4db7d34c9e50d179becc390539c8 size: 3475

성공했습니다. 콘솔에서 보면 제대로 리포지토리에 들어갔습니다.

ECS에 배포


ECS에 배포하기 위한 컨텍스트(예전에 만든 ecs_dev_context)를 사용하도록 Docker 설정을 변경합니다.
$ docker context use ecs_dev_context
ecs_dev_context
이 문맥에서 docker-compose up 하면 어떻게 AWS에 올라 버린 것 같습니다. 대단해.
[+] Running 14/14
 ⠿ docker-api-hawk           CreateComplete                                                                                                291.0s
 ⠿ LogGroup                  CreateComplete                                                                                                  2.0sh
 ⠿ ApiTCP5000TargetGroup     CreateComplete                                                                                                  1.0s
 ⠿ LoadBalancer              CreateComplete                                                                                                152.0s
 ⠿ DefaultNetwork            CreateComplete                                                                                                  5.0s
 ⠿ CloudMap                  CreateComplete                                                                                                 48.1s
 ⠿ ApiTaskExecutionRole      CreateComplete                                                                                                 22.0s
 ⠿ Cluster                   CreateComplete                                                                                                  7.0s
 ⠿ Default5000Ingress        CreateComplete                                                                                                  1.0s
 ⠿ DefaultNetworkIngress     CreateComplete                                                                                                  1.0s
 ⠿ ApiTaskDefinition         CreateComplete                                                                                                  3.0s
 ⠿ ApiServiceDiscoveryEntry  CreateComplete                                                                                                  2.0s
 ⠿ ApiTCP5000Listener        CreateComplete                                                                                                  3.0s
 ⠿ ApiService                CreateComplete                                                                                                121.0s
올랐습니다.

좋은 웹페이지 즐겨찾기