AWS CLI로 EC2용 Amazon ECS 태스크 생성

AWS CLI로 EC2용 Amazon ECS 태스크 생성

다음 단계는 클러스터를 설정하고, 태스크 정의를 등록하고, 태스크를 실행하고, AWS CLI로 Amazon ECS의 다른 일반적인 시나리오를 수행하는 데 도움을 줘요. 최신 버전의 AWS CLI를 사용하세요. 최신 버전으로 업그레이드하는 방법은 Installing or updating to the latest version of the AWS CLI를 참고하세요. 참고: 듀얼 스택 서비스 엔드포인트를 사용해 AWS CLI, SDK, Amazon ECS API에서 IPv4와 IPv6 모두를 통해 Amazon ECS와 상호 작용할 수 있어요. 자세한 내용은 Using Amazon ECS dual-stack endpoints를 참고하세요.

출처: 문서

본문

토픽

  • 사전 준비 (Prerequisites)
  • 클러스터 생성 (Create a cluster)
  • Amazon ECS AMI로 컨테이너 인스턴스 실행
  • 컨테이너 인스턴스 나열 (List container instances)
  • 컨테이너 인스턴스 설명 (Describe your container instance)
  • 태스크 정의 등록 (Register a task definition)
  • 태스크 정의 나열 (List task definitions)
  • 서비스 생성 (Create a service)
  • 서비스 나열 (List services)
  • 서비스 설명 (Describe the service)
  • 실행 중인 태스크 설명 (Describe the running task)
  • 웹 서버 테스트 (Test the web server)
  • 리소스 정리 (Clean up resources)

사전 준비 (Prerequisites)

이 튜토리얼은 다음 사전 준비가 완료되었음을 가정해요.

  • 최신 버전의 AWS CLI가 설치되고 구성되어 있어요. AWS CLI 설치 또는 업그레이드에 대한 자세한 내용은 Installing or updating to the latest version of the AWS CLI를 참고하세요.
  • Set up to use Amazon ECS의 단계가 완료되었어요.
  • IAM 사용자가 AmazonECS_FullAccess IAM 정책 예제에 지정된 필수 권한을 갖고 있어요.
  • 사용할 컨테이너 인스턴스 IAM 역할이 생성되어 있어요. 자세한 내용은 Amazon ECS container instance IAM role을 참고하세요.
  • 사용할 VPC가 생성되어 있어요. 자세한 내용은 Create a virtual private cloud을 참고하세요.
  • (선택 사항) AWS CloudShell은 자체 EC2 인스턴스를 만들 필요 없이 명령 줄을 제공하는 도구예요. 자세한 내용은 AWS CloudShell User Guide의 What is AWS CloudShell?을 참고하세요.

클러스터 생성 (Create a cluster)

기본적으로 계정은 첫 번째 컨테이너 인스턴스를 실행할 때 기본 클러스터를 받아요. 참고: 제공된 기본 클러스터를 사용할 때의 이점은 이후 명령에서 --cluster cluster_name 옵션을 지정할 필요가 없다는 점이에요. 자체 기본이 아닌 클러스터를 만든다면 그 클러스터와 함께 사용하려는 각 명령에 --cluster cluster_name을 지정해야 해요.

다음 명령으로 고유한 이름을 가진 클러스터를 만드세요.

aws ecs create-cluster --cluster-name MyCluster

출력:

{
    "cluster": {
        "clusterName": "MyCluster",
        "status": "ACTIVE",
        "clusterArn": "arn:aws:ecs:region:aws_account_id:cluster/MyCluster"
    }
}

Amazon ECS AMI로 컨테이너 인스턴스 실행

컨테이너 인스턴스는 Amazon ECS 컨테이너 에이전트를 실행하고 클러스터에 등록된 EC2 인스턴스예요. 이 섹션에서는 ECS-optimized AMI를 사용해 EC2 인스턴스를 실행할 거예요.

AWS CLI로 컨테이너 인스턴스를 실행하려면

  1. 다음 명령으로 AWS 리전의 최신 ECS-optimized Amazon Linux 2 AMI ID를 검색합니다. 이 명령은 Systems Manager Parameter Store를 사용해 최신 ECS-optimized AMI ID를 가져와요. AMI에는 Amazon ECS 컨테이너 에이전트와 Docker 런타임이 사전 설치되어 있어요.
aws ssm get-parameters --names /aws/service/ecs/optimized-ami/amazon-linux-2/recommended --query 'Parameters[0].Value' --output text | jq -r '.image_id'

출력:

ami-abcd1234
  1. 컨테이너 인스턴스 관리를 위한 SSH 접근과 웹 서버를 위한 HTTP 접근을 허용하는 보안 그룹을 생성합니다.
aws ec2 create-security-group --group-name ecs-tutorial-sg --description "ECS tutorial security group"

출력:

{
    "GroupId": "sg-abcd1234"
}
  1. 다음 명령을 실행해 보안 그룹에 인바운드 규칙을 추가합니다.
aws ec2 authorize-security-group-ingress --group-id sg-abcd1234 --protocol tcp --port 80 --cidr 0.0.0.0/0

출력:

{
    "Return": true,
    "SecurityGroupRules": [
        {
            "SecurityGroupRuleId": "sgr-efgh5678",
            "GroupId": "sg-abcd1234",
            "GroupOwnerId": "123456789012",
            "IsEgress": false,
            "IpProtocol": "tcp",
            "FromPort": 80,
            "ToPort": 80,
            "CidrIpv4": "0.0.0.0/0"
        }
    ]
}

보안 그룹은 이제 지정된 IP 범위에서 SSH 접근을 허용하고 어디서나 HTTP 접근을 허용해요. 프로덕션 환경에서는 SSH 접근을 특정 IP 주소로 제한하고 필요에 따라 HTTP 접근을 제한하는 것을 고려해야 해요.

  1. 컨테이너 인스턴스에 SSH 접근할 EC2 키 페어를 생성합니다.
aws ec2 create-key-pair --key-name ecs-tutorial-key --query 'KeyMaterial' --output text > ecs-tutorial-key.pem
chmod 400 ecs-tutorial-key.pem

프라이빗 키는 SSH 접근에 적절한 권한으로 로컬 머신에 저장됩니다.

  1. ECS-optimized AMI를 사용해 EC2 인스턴스를 실행하고 클러스터에 조인하도록 구성합니다.
aws ec2 run-instances --image-id ami-abcd1234 --instance-type t3.micro --key-name ecs-tutorial-key --security-group-ids sg-abcd1234 --iam-instance-profile Name=ecsInstanceRole --user-data '#!/bin/bash
echo ECS_CLUSTER=MyCluster >> /etc/ecs/ecs.config'
{
    "Instances": [
        {
            "InstanceId": "i-abcd1234",
            "ImageId": "ami-abcd1234",
            "State": {
                "Code": 0,
                "Name": "pending"
            },
            "PrivateDnsName": "",
            "PublicDnsName": "",
            "StateReason": {
                "Code": "pending",
                "Message": "pending"
            },
            "InstanceType": "t3.micro",
            "KeyName": "ecs-tutorial-key",
            "LaunchTime": "2025-01-13T10:30:00.000Z"
        }
    ]
}

사용자 데이터 스크립트는 Amazon ECS 에이전트가 인스턴스를 MyCluster에 등록하도록 구성해요. 인스턴스는 에이전트에 필요한 권한을 제공하는 ecsInstanceRole IAM 역할을 사용해요.

컨테이너 인스턴스 나열 (List container instances)

컨테이너 인스턴스를 실행한 후 몇 분 내에 Amazon ECS 에이전트가 인스턴스를 MyCluster 클러스터에 등록해요. 다음 명령을 실행해 클러스터의 컨테이너 인스턴스를 나열할 수 있어요.

aws ecs list-container-instances --cluster MyCluster

출력:

{
    "containerInstanceArns": [
        "arn:aws:ecs:us-east-1:aws_account_id:container-instance/container_instance_ID"
    ]
}

컨테이너 인스턴스 설명 (Describe your container instance)

컨테이너 인스턴스의 ARN 또는 ID가 있으면 describe-container-instances 명령을 사용해 남아 있는 리소스와 등록된 CPU/메모리 리소스 같은 인스턴스에 대한 유용한 정보를 얻을 수 있어요.

aws ecs describe-container-instances --cluster MyCluster --container-instances container_instance_ID

출력:

{
    "failures": [],
    "containerInstances": [
        {
            "status": "ACTIVE",
            "registeredResources": [
                {
                    "integerValue": 1024,
                    "longValue": 0,
                    "type": "INTEGER",
                    "name": "CPU",
                    "doubleValue": 0.0
                },
                {
                    "integerValue": 995,
                    "longValue": 0,
                    "type": "INTEGER",
                    "name": "MEMORY",
                    "doubleValue": 0.0
                },
                {
                    "name": "PORTS",
                    "longValue": 0,
                    "doubleValue": 0.0,
                    "stringSetValue": [
                        "22",
                        "2376",
                        "2375",
                        "51678"
                    ],
                    "type": "STRINGSET",
                    "integerValue": 0
                },
                {
                    "name": "PORTS_UDP",
                    "longValue": 0,
                    "doubleValue": 0.0,
                    "stringSetValue": [],
                    "type": "STRINGSET",
                    "integerValue": 0
                }
            ],
            "ec2InstanceId": "instance_id",
            "agentConnected": true,
            "containerInstanceArn": "arn:aws:ecs:us-west-2:aws_account_id:container-instance/container_instance_ID",
            "pendingTasksCount": 0,
            "remainingResources": [
                {
                    "integerValue": 1024,
                    "longValue": 0,
                    "type": "INTEGER",
                    "name": "CPU",
                    "doubleValue": 0.0
                },
                {
                    "integerValue": 995,
                    "longValue": 0,
                    "type": "INTEGER",
                    "name": "MEMORY",
                    "doubleValue": 0.0
                },
                {
                    "name": "PORTS",
                    "longValue": 0,
                    "doubleValue": 0.0,
                    "stringSetValue": [
                        "22",
                        "2376",
                        "2375",
                        "51678"
                    ],
                    "type": "STRINGSET",
                    "integerValue": 0
                },
                {
                    "name": "PORTS_UDP",
                    "longValue": 0,
                    "doubleValue": 0.0,
                    "stringSetValue": [],
                    "type": "STRINGSET",
                    "integerValue": 0
                }
            ],
            "runningTasksCount": 0,
            "attributes": [
                {
                    "name": "com.amazonaws.ecs.capability.privileged-container"
                },
                {
                    "name": "com.amazonaws.ecs.capability.docker-remote-api.1.17"
                },
                {
                    "name": "com.amazonaws.ecs.capability.docker-remote-api.1.18"
                },
                {
                    "name": "com.amazonaws.ecs.capability.docker-remote-api.1.19"
                },
                {
                    "name": "com.amazonaws.ecs.capability.logging-driver.json-file"
                },
                {
                    "name": "com.amazonaws.ecs.capability.logging-driver.syslog"
                }
            ],
            "versionInfo": {
                "agentVersion": "1.5.0",
                "agentHash": "b197edd",
                "dockerVersion": "DockerVersion: 1.7.1"
            }
        }
    ]
}

Amazon EC2 콘솔 또는 aws ec2 describe-instances --instance-id instance_id 명령으로 인스턴스를 모니터링하는 데 사용할 수 있는 Amazon EC2 인스턴스 ID도 찾을 수 있어요.

태스크 정의 등록 (Register a task definition)

Amazon ECS 클러스터에서 태스크를 실행하려면 먼저 태스크 정의를 등록해야 해요. 태스크 정의는 함께 그룹화된 컨테이너의 목록이에요. 다음 예제는 nginx 이미지를 사용하는 간단한 태스크 정의예요.