AWS CLI로 Amazon ECS Managed Instances용 태스크를 만드는 방법 배우기

AWS CLI로 Amazon ECS Managed Instances용 태스크를 만드는 방법 배우기

다음 단계는 AWS CLI를 사용해 Amazon ECS Managed Instances로 Amazon ECS에서 클러스터를 설정하고, 용량 공급자를 만들고, 태스크 정의를 등록하고, Linux 태스크를 실행하는 방법과 기타 일반적인 시나리오를 수행하는 데 도움이 돼요. 최신 버전의 AWS CLI를 사용하세요. 최신 버전으로 업그레이드하는 방법은 최신 버전의 AWS CLI 설치 또는 업데이트(Installing or updating to the latest version of the AWS CLI)를 참고하세요.

출처: 문서

본문

참고: dual-stack 서비스 엔드포인트를 사용해 AWS CLI, SDK, Amazon ECS API에서 IPv4와 IPv6 모두로 Amazon ECS와 상호 작용할 수 있어요. 자세한 내용은 Amazon ECS dual-stack 엔드포인트 사용(Using Amazon ECS dual-stack endpoints)을 참고하세요.

주제:

  • 사전 요구 사항(Prerequisites)
  • 1단계: 클러스터 만들기
  • 2단계: Amazon ECS Managed Instances 용량 공급자 만들기
  • 3단계: 클러스터의 기본 용량 공급자 전략 구성
  • 4단계: Linux 태스크 정의 등록
  • 5단계: 태스크 정의 나열
  • 6단계: 서비스 만들기
  • 7단계: 서비스 나열
  • 8단계: 실행 중인 서비스 describe
  • 9단계: 테스트
  • 10단계: 정리

사전 요구 사항

튜토리얼을 시작하기 전에 다음을 완료하세요:

  • Amazon ECS 사용 설정(Set up to use Amazon ECS) 단계를 완료했습니다.
  • 최신 버전의 AWS CLI가 설치되고 구성되었습니다. AWS CLI 설치 또는 업그레이드에 대한 자세한 내용은 AWS Command Line Interface 사용자 가이드의 최신 버전의 AWS CLI 설치 또는 업데이트를 참고하세요.
  • Amazon ECS Managed Instances에 필요한 IAM 역할이 있습니다. 여기에는 다음이 포함됩니다:
    • 인프라 역할(Infrastructure role) – Amazon ECS가 사용자를 대신해 Amazon ECS Managed Instances 인프라를 관리하기 위해 AWS 서비스를 호출할 수 있게 합니다. 자세한 내용은 Amazon ECS 인프라 IAM 역할(Amazon ECS infrastructure IAM role)을 참고하세요.
    • 인스턴스 프로파일(Instance profile) – 관리형 인스턴스에서 실행되는 Amazon ECS 컨테이너 에이전트와 Docker 데몬에 권한을 제공합니다. 인스턴스 역할 이름은 인프라 역할의 iam:PassRole 작업과 일치하도록 ecsInstanceRole 접두사를 포함해야 해요. 자세한 내용은 Amazon ECS Managed Instances 인스턴스 프로파일(Amazon ECS Managed Instances instance profile)을 참고하세요.
  • 사용할 VPC와 보안 그룹이 있습니다. 이 튜토리얼은 Amazon ECR Public에 호스팅된 컨테이너 이미지를 사용하므로 인스턴스에 인터넷 액세스가 있어야 해요. 인스턴스에 인터넷 라우트를 제공하려면 다음 옵션 중 하나를 사용하세요:
    • 탄력적 IP 주소가 있는 NAT 게이트웨이가 설정된 프라이빗 서브넷 사용
    • 퍼블릭 서브넷을 사용하고 인스턴스에 퍼블릭 IP 주소 할당
    • 자세한 내용은 가상 프라이빗 클라우드 만들기(Create a virtual private cloud)를 참고하세요. 보안 그룹과 규칙에 대한 정보는 Amazon Virtual Private Cloud 사용자 가이드의 VPC용 기본 보안 그룹(Default security groups for your VPCs)과 규칙 예시(Example rules)를 참고하세요.
  • (선택 사항) AWS CloudShell은 자체 EC2 인스턴스를 만들 필요 없이 고객에게 명령줄을 제공하는 도구예요. 자세한 내용은 AWS CloudShell 사용자 가이드의 AWS CloudShell이란 무엇인가요?(What is AWS CloudShell?)를 참고하세요.

1단계: 클러스터 만들기

기본적으로 계정에는 기본 클러스터(default cluster)가 제공돼요. 참고: 제공된 기본 클러스터를 사용하면 이후 명령에서 --cluster cluster_name 옵션을 지정할 필요가 없는 이점이 있습니다. 자체 비기본 클러스터를 만들면, 그 클러스터에 사용하려는 각 명령에 --cluster cluster_name을 지정해야 해요.

다음 명령으로 고유한 이름의 클러스터를 만듭니다:

aws ecs create-cluster --cluster-name managed-instances-cluster

출력:

{
    "cluster": {
        "status": "ACTIVE",
        "defaultCapacityProviderStrategy": [],
        "statistics": [],
        "capacityProviders": [],
        "tags": [],
        "clusterName": "managed-instances-cluster",
        "settings": [
            {
                "name": "containerInsights",
                "value": "disabled"
            }
        ],
        "registeredContainerInstancesCount": 0,
        "pendingTasksCount": 0,
        "runningTasksCount": 0,
        "activeServicesCount": 0,
        "clusterArn": "arn:aws:ecs:region:aws_account_id:cluster/managed-instances-cluster"
    }
}

2단계: Amazon ECS Managed Instances 용량 공급자 만들기

Amazon ECS Managed Instances로 태스크를 실행하기 전에 인프라 구성을 정의하는 용량 공급자를 만들어야 해요. 용량 공급자는 관리형 인스턴스에 대한 IAM 역할, 네트워크 구성, 기타 설정을 지정합니다.

용량 공급자 구성이 담긴 JSON 파일을 만듭니다. 자리 표시자 값을 실제 리소스 식별자로 바꾸세요:

{
    "name": "managed-instances-cp",
    "cluster": "managed-instances-cluster",
    "managedInstancesProvider": {
        "infrastructureRoleArn": "arn:aws:iam::aws_account_id:role/ecsInfrastructureRole",
        "instanceLaunchTemplate": {
            "ec2InstanceProfileArn": "arn:aws:iam::aws_account_id:instance-profile/ecsInstanceRole",
            "networkConfiguration": {
                "subnets": [
                    "subnet-abcdef01234567890",
                    "subnet-1234567890abcdef0"
                ],
                "securityGroups": [
                    "sg-0123456789abcdef0"
                ]
            },
            "storageConfiguration": {
                "storageSizeGiB": 100
            },
            "monitoring": "basic"
        }
    }
}

이 구성을 managed-instances-cp.json으로 저장하고 용량 공급자를 만듭니다:

aws ecs create-capacity-provider --cli-input-json file://managed-instances-cp.json

이 명령은 생성이 완료된 후 용량 공급자에 대한 설명을 반환합니다.

3단계: 클러스터의 기본 용량 공급자 전략 구성

클러스터를 업데이트해 Amazon ECS Managed Instances 용량 공급자를 기본 용량 공급자 전략으로 사용하게 합니다. 이렇게 하면 태스크와 서비스가 용량 공급자를 명시적으로 지정하지 않고도 자동으로 Amazon ECS Managed Instances를 사용하게 됩니다.

클러스터 용량 공급자 구성이 담긴 JSON 파일을 만듭니다:

{
    "cluster": "managed-instances-cluster",
    "capacityProviders": [
        "managed-instances-cp"
    ],
    "defaultCapacityProviderStrategy": [
        {
            "capacityProvider": "managed-instances-cp",
            "weight": 1
        }
    ]
}

이 구성을 cluster-cp-strategy.json으로 저장하고 클러스터를 업데이트합니다:

aws ecs put-cluster-capacity-providers --cli-input-json file://cluster-cp-strategy.json

4단계: Linux 태스크 정의 등록

클러스터에서 태스크를 실행하려면 먼저 태스크 정의를 등록해야 해요. 태스크 정의는 함께 그룹화된 컨테이너 목록입니다. 다음 예시는 Docker Hub에 호스팅된 httpd 컨테이너 이미지를 사용해 PHP 웹 앱을 만드는 간단한 태스크 정의입니다. 사용 가능한 태스크 정의 파라미터에 대한 자세한 내용은 Fargate용 Amazon ECS 태스크 정의 파라미터(Amazon ECS task definition parameters for Fargate)를 참고하세요.

{
    "family": "sample-managed-instances",
    "networkMode": "awsvpc",
    "containerDefinitions": [
        {
            "name": "managed-instances-app",
            "image": "public.ecr.aws/docker/library/httpd:latest",
            "portMappings": [
                {
                    "containerPort": 80,
                    "hostPort": 80,
                    "protocol": "tcp"
                }
            ],
            "essential": true,
            "entryPoint": [
                "sh",
                "-c"
            ],
            "command": [
                "/bin/sh -c \"echo '<html><head><title>Amazon ECS Sample App</title><style>body {margin-top: 40px; background-color: #333;} </style></head><body><div style=color:white;text-align:center><h1>Amazon ECS Sample App</h1><h2>Congratulations!</h2><p>Your application is now running on a container in Amazon ECS using Amazon ECS Managed Instances.</p></div></body></html>' >  /usr/local/apache2/htdocs/index.html && httpd-foreground\""
            ]
        }
    ],
    "requiresCompatibilities": [
        "MANAGED_INSTANCES"
    ],
    "cpu": "256",
    "memory": "512"
}

태스크 정의 JSON을 파일로 저장하고 --cli-input-json file://path_to_file.json 옵션과 함께 전달합니다.

컨테이너 정의용 JSON 파일을 사용하려면:

aws ecs register-task-definition --cli-input-json file://$HOME/tasks/managed-instances-task.json

register-task-definition 명령은 등록이 완료된 후 태스크 정의에 대한 설명을 반환합니다.

5단계: 태스크 정의 나열

list-task-definitions 명령으로 계정의 태스크 정의를 언제든 나열할 수 있어요. 이 명령의 출력은 run-task나 start-task를 호출할 때 함께 사용할 수 있는 family와 revision 값을 보여줍니다.

aws ecs list-task-definitions

출력:

{
    "taskDefinitionArns": [
        "arn:aws:ecs:region:aws_account_id:task-definition/sample-managed-instances:1"
    ]
}

6단계: 서비스 만들기

계정에 태스크를 등록한 후에는 등록된 태스크에 대한 서비스를 클러스터에 만들 수 있어요. 이 예시에서는 클러스터에서 sample-managed-instances:1 태스크 정의의 인스턴스 하나를 실행하는 서비스를 만듭니다. 태스크는 인터넷으로의 라우트가 필요하므로 두 가지 방법이 있습니다. 하나는 퍼블릭 서브넷의 탄력적 IP 주소가 있는 NAT 게이트웨이로 구성된 프라이빗 서브넷을 사용하는 것입니다. 다른 하나는 퍼블릭 서브넷을 사용하고 태스크에 퍼블릭 IP 주소를 할당하는 것입니다. 아래에 두 예시를 모두 제공합니다.

프라이빗 서브넷을 사용한 예시:

aws ecs create-service --cluster managed-instances-cluster --service-name managed-instances-service --task-definition sample-managed-instances:1 --desired-count 1 --network-configuration "awsvpcConfiguration={subnets=[subnet-abcd1234],securityGroups=[sg-abcd1234]}"

퍼블릭 서브넷을 사용한 예시:

aws ecs create-service --cluster managed-instances-cluster --service-name managed-instances-service --task-definition sample-managed-instances:1 --desired-count 1 --network-configuration "awsvpcConfiguration={subnets=[subnet-abcd1234],securityGroups=[sg-abcd1234],assignPublicIp=ENABLED}"

create-service 명령은 생성이 완료된 후 서비스에 대한 설명을 반환합니다.

7단계: 서비스 나열

클러스터의 서비스를 나열합니다. 이전 섹션에서 만든 서비스가 보여야 해요. 이 명령에서 반환된 서비스 이름이나 전체 ARN을 가져와 나중에 서비스를 describe하는 데 사용할 수 있습니다.

aws ecs list-services --cluster managed-instances-cluster

출력:

{
    "serviceArns": [
        "arn:aws:ecs:region:aws_account_id:service/managed-instances-cluster/managed-instances-service"
    ]
}

8단계: 실행 중인 서비스 describe

앞서 가져온 서비스 이름으로 서비스를 describe해 태스크에 대한 자세한 정보를 얻습니다:

aws ecs describe-services --cluster managed-instances-cluster --services managed-instances-service

성공하면 이 호출은 서비스 실패(failures)와 서비스(services)에 대한 설명을 반환해요. 예를 들어 services 섹션에서는 실행 중 또는 보류 중인 태스크 상태 같은 배포 정보를 찾을 수 있습니다. 태스크 정의, 네트워크 구성, 타임스탬프 이벤트에 대한 정보도 찾을 수 있어요. failures 섹션에서는 호출과 관련된 실패 정보가 있다면 볼 수 있습니다.

출력은 서비스가 Amazon ECS Managed Instances 용량 공급자를 사용하고 있음을 보여줍니다:

{
    "services": [
        {
            "capacityProviderStrategy": [
                {
                    "capacityProvider": "managed-instances-cp",
                    "weight": 1,
                    "base": 0
                }
            ],
            "networkConfiguration": {
                "awsvpcConfiguration": {
                    "subnets": [
                        "subnet-abcd1234"
                    ],
                    "securityGroups": [
                        "sg-abcd1234"
                    ],
                    "assignPublicIp": "ENABLED"
                }
            },
            "enableECSManagedTags": false,
            "loadBalancers": [],
            "deploymentController": {
                "type": "ECS"
            },
            "desiredCount": 1,
            "clusterArn": "arn:aws:ecs:region:aws_account_id:cluster/managed-instances-cluster",
            "serviceArn": "arn:aws:ecs:region:aws_account_id:service/managed-instances-cluster/managed-instances-service",
            "serviceName": "managed-instances-service",
            "taskDefinition": "arn:aws:ecs:region:aws_account_id:task-definition/sample-managed-instances:1"
        }
    ],
    "failures": []
}

9단계: 테스트

배포를 테스트하려면 태스크를 실행하는 관리형 인스턴스의 퍼블릭 IP 주소를 찾아야 해요.

퍼블릭 서브넷을 사용해 배포된 태스크 테스트

먼저 서비스에서 태스크 ARN을 가져옵니다:

aws ecs list-tasks --cluster managed-instances-cluster --service managed-instances-service

출력에 태스크 ARN이 포함됩니다:

{
    "taskArns": [
        "arn:aws:ecs:region:aws_account_id:task/managed-instances-cluster/EXAMPLE"
    ]
}

컨테이너 인스턴스 ARN을 얻으려면 태스크를 describe합니다. tasks 파라미터에 태스크 ARN을 사용하세요:

aws ecs describe-tasks --cluster managed-instances-cluster --tasks arn:aws:ecs:region:aws_account_id:task/managed-instances-cluster/EXAMPLE

출력은 태스크가 Amazon ECS Managed Instances에서 실행 중임을 보여주고 컨테이너 인스턴스 ARN을 포함합니다:

{
    "tasks": [
        {
            "launchType": "MANAGED_INSTANCES",
            "capacityProviderName": "managed-instances-cp",
            "containerInstanceArn": "arn:aws:ecs:region:aws_account_id:container-instance/managed-instances-cluster/CONTAINER_INSTANCE_ID",
            "taskArn": "arn:aws:ecs:region:aws_account_id:task/managed-instances-cluster/EXAMPLE",
            "taskDefinitionArn": "arn:aws:ecs:region:aws_account_id:task-definition/sample-managed-instances:1"
        }
    ]
}

EC2 인스턴스 ID를 얻으려면 컨테이너 인스턴스를 describe합니다:

aws ecs describe-container-instances --cluster managed-instances-cluster --container-instances CONTAINER_INSTANCE_ID

출력에 EC2 인스턴스 ID가 포함됩니다:

{
    "containerInstances": [
        {
            "ec2InstanceId": "i-1234567890abcdef0",
            "capacityProviderName": "managed-instances-cp",
            "containerInstanceArn": "arn:aws:ecs:region:aws_account_id:container-instance/managed-instances-cluster/CONTAINER_INSTANCE_ID"
        }
    ]
}

퍼블릭 IP 주소를 얻으려면 EC2 인스턴스를 describe합니다:

aws ec2 describe-instances --instance-ids i-1234567890abcdef0

퍼블릭 IP 주소가 출력에 있습니다:

{
    "Reservations": [
        {
            "Instances": [
                {
                    "PublicIpAddress": "198.51.100.2",
                    "InstanceId": "i-1234567890abcdef0"
                }
            ]
        }
    ]
}

웹 브라우저에 퍼블릭 IP 주소를 입력하면 Amazon ECS Managed Instances에서 실행되는 Amazon ECS 샘플 애플리케이션을 표시하는 웹페이지를 볼 수 있어요.

프라이빗 서브넷을 사용해 배포된 태스크 테스트

프라이빗 서브넷에 배포된 태스크는 Amazon ECS Exec을 사용해 컨테이너에 연결하고 인스턴스 안에서 배포를 테스트할 수 있어요. 앞선 단계를 따라 태스크 ARN을 얻은 다음 ECS Exec을 사용합니다:

aws ecs execute-command --cluster managed-instances-cluster \
    --task arn:aws:ecs:region:aws_account_id:task/managed-instances-cluster/EXAMPLE \
    --container managed-instances-app \
    --interactive \
    --command "/bin/sh"

대화형 셸이 실행된 후 웹 서버를 테스트할 수 있습니다:

curl localhost

Amazon ECS 샘플 애플리케이션 웹페이지에 해당하는 HTML을 볼 수 있을 거예요.

10단계: 정리

튜토리얼을 마치면 관련 리소스를 정리해 사용하지 않는 리소스에 대한 요금이 부과되지 않도록 해야 해요.

서비스를 삭제합니다:

aws ecs delete-service --cluster managed-instances-cluster --service managed-instances-service --force

서비스가 삭제되고 모든 태스크가 중지될 때까지 기다린 다음 용량 공급자를 삭제합니다:

aws ecs delete-capacity-provider --capacity-provider managed-instances-cp

클러스터를 삭제합니다:

aws ecs delete-cluster --cluster managed-instances-cluster

참고: 용량 공급자를 삭제하면 관리형 인스턴스가 자동으로 종료됩니다.