AWS CLI로 Amazon ECS Service Connect 구성
AWS CLI로 Amazon ECS Service Connect 구성
AWS CLI로 Service Connect를 사용하는 Fargate 태스크용 Amazon ECS 서비스를 만들 수 있습니다. 이 글에서는 클러스터와 네임스페이스를 만들고 Service Connect가 구성된 서비스를 만드는 전체 과정을 알아봅니다.
출처: 문서
본문
AWS CLI로 Service Connect를 사용하는 Fargate 태스크용 Amazon ECS 서비스를 만들 수 있어요.
참고: 듀얼 스택(dual-stack) 서비스 엔드포인트를 사용하면 AWS CLI, SDK, Amazon ECS API에서 IPv4와 IPv6 모두를 통해 Amazon ECS와 상호작용할 수 있습니다. 자세한 내용은 Amazon ECS 듀얼 스택 엔드포인트 사용 문서를 참고하세요.
사전 요구 사항 (Prerequisites)
Service Connect의 사전 요구 사항은 다음과 같습니다:
- 최신 버전의 AWS CLI가 설치되고 구성되었는지 확인합니다. 자세한 내용은 최신 버전의 AWS CLI 설치 또는 업데이트 문서를 참고하세요.
- IAM 사용자가 AmazonECS_FullAccess IAM 정책 예시에 지정된 필수 권한을 가지고 있습니다.
- 사용할 VPC, 서브넷, 라우트 테이블, 보안 그룹이 생성되어 있습니다. 자세한 내용은 가상 프라이빗 클라우드 생성 문서를 참고하세요.
ecsTaskExecutionRole이라는 이름의 태스크 실행 역할이 있고AmazonECSTaskExecutionRolePolicy관리형 정책이 역할에 연결되어 있습니다. 이 역할은 Fargate가 NGINX 애플리케이션 로그와 Service Connect 프록시 로그를 Amazon CloudWatch Logs에 쓸 수 있게 합니다. 자세한 내용은 태스크 실행 역할 생성 문서를 참고하세요.
1단계: 클러스터 생성 (Step 1: Create the cluster)
Amazon ECS 클러스터와 AWS Cloud Map 네임스페이스를 만들려면
- 사용할
tutorial이라는 Amazon ECS 클러스터를 만듭니다.--service-connect-defaults파라미터는 클러스터의 기본 네임스페이스를 설정합니다. 예시 출력에서service-connect라는 이름의 AWS Cloud Map 네임스페이스가 이 계정과 AWS 리전에 없으므로 네임스페이스가 Amazon ECS에 의해 생성됩니다. 네임스페이스는 계정의 AWS Cloud Map에 만들어지며 다른 모든 네임스페이스와 함께 표시되므로 목적을 나타내는 이름을 사용하세요.
aws ecs create-cluster --cluster-name tutorial --service-connect-defaults namespace=service-connect
출력:
{
"cluster": {
"clusterArn": "arn:aws:ecs:us-west-2:123456789012:cluster/tutorial",
"clusterName": "tutorial",
"serviceConnectDefaults": {
"namespace": "arn:aws:servicediscovery:us-west-2:123456789012:namespace/ns-EXAMPLE"
},
"status": "PROVISIONING",
"registeredContainerInstancesCount": 0,
"runningTasksCount": 0,
"pendingTasksCount": 0,
"activeServicesCount": 0,
"statistics": [],
"tags": [],
"settings": [
{
"name": "containerInsights",
"value": "disabled"
}
],
"capacityProviders": [],
"defaultCapacityProviderStrategy": [],
"attachments": [
{
"id": "a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
"type": "sc",
"status": "ATTACHING",
"details": []
}
],
"attachmentsStatus": "UPDATE_IN_PROGRESS"
}
}
- 클러스터가 생성되었는지 확인합니다:
aws ecs describe-clusters --clusters tutorial
출력:
{
"clusters": [
{
"clusterArn": "arn:aws:ecs:us-west-2:123456789012:cluster/tutorial",
"clusterName": "tutorial",
"serviceConnectDefaults": {
"namespace": "arn:aws:servicediscovery:us-west-2:123456789012:namespace/ns-EXAMPLE"
},
"status": "ACTIVE",
"registeredContainerInstancesCount": 0,
"runningTasksCount": 0,
"pendingTasksCount": 0,
"activeServicesCount": 0,
"statistics": [],
"tags": [],
"settings": [],
"capacityProviders": [],
"defaultCapacityProviderStrategy": []
}
],
"failures": []
}
- (선택 사항) AWS Cloud Map에 네임스페이스가 생성되었는지 확인합니다. 이는 AWS Cloud Map에 생성되므로 AWS Management Console 또는 일반 AWS CLI 구성을 사용할 수 있어요. 예를 들어 AWS CLI를 사용합니다:
aws servicediscovery get-namespace --id ns-EXAMPLE
출력:
{
"Namespace": {
"Id": "ns-EXAMPLE",
"Arn": "arn:aws:servicediscovery:us-west-2:123456789012:namespace/ns-EXAMPLE",
"Name": "service-connect",
"Type": "HTTP",
"Properties": {
"DnsProperties": {
"SOA": {}
},
"HttpProperties": {
"HttpName": "service-connect"
}
},
"CreateDate": 1661749852.422,
"CreatorRequestId": "service-connect"
}
}
2단계: 서버용 서비스 생성 (Step 2: Create the service for the server)
Service Connect 기능은 Amazon ECS에서 여러 애플리케이션을 상호 연결하기 위한 것입니다. 그 애플리케이션 중 적어도 하나는 연결할 웹 서비스를 제공해야 합니다. 이 단계에서는 다음을 만듭니다:
- 수정되지 않은 공식 NGINX 컨테이너 이미지를 사용하고 Service Connect 구성을 포함하는 태스크 정의.
- Service Connect가 이 서비스로의 트래픽에 대한 서비스 검색과 서비스 메시 프록시를 제공하도록 구성하는 Amazon ECS 서비스 정의. 이 구성은 각 서비스에 대해 수행하는 서비스 구성 양을 줄이기 위해 클러스터 구성의 기본 네임스페이스를 재사용합니다.
- Amazon ECS 서비스. 태스크 정의를 사용해 하나의 태스크를 실행하고, Service Connect 프록시용 컨테이너를 추가로 삽입합니다. 프록시는 태스크 정의의 컨테이너 포트 매핑의 포트에서 수신합니다. Amazon ECS에서 실행되는 클라이언트 애플리케이션에서 클라이언트 태스크의 프록시는 태스크 정의 포트 이름, 서비스 검색 이름 또는 서비스 클라이언트 별칭 이름, 그리고 클라이언트 별칭의 포트 번호로의 아웃바운드 연결을 수신합니다.
Service Connect로 웹 서비스를 만들려면
Fargate와 호환되고 awsvpc 네트워크 모드를 사용하는 태스크 정의를 등록합니다. 다음 단계를 따르세요:
- 다음 태스크 정의의 내용으로
service-connect-nginx.json이라는 파일을 만듭니다. 이 태스크 정의는 포트 매핑에name과appProtocol파라미터를 추가하여 Service Connect를 구성합니다. 포트 이름은 여러 포트를 사용할 때 서비스 구성에서 이 포트를 더 식별 가능하게 만듭니다. 포트 이름은 기본적으로 네임스페이스의 다른 애플리케이션이 사용할 검색 가능한 이름으로도 사용됩니다. 태스크 정의는 서비스에 ECS Exec이 활성화되어 있으므로 태스크 IAM 역할을 포함합니다.중요: 이 태스크 정의는
logConfiguration을 사용해 nginx의 stdout과 stderr 출력을 Amazon CloudWatch Logs로 보냅니다. 이 태스크 실행 역할은 CloudWatch Logs 로그 그룹을 만드는 데 필요한 추가 권한이 없습니다. AWS Management Console 또는 AWS CLI를 사용해 CloudWatch Logs에 로그 그룹을 만드세요. nginx 로그를 CloudWatch Logs로 보내지 않으려면logConfiguration을 제거할 수 있어요. 태스크 실행 역할의 AWS 계정 ID를 자신의 AWS 계정 ID로 바꾸세요.
{
"family": "service-connect-nginx",
"executionRoleArn": "arn:aws:iam::123456789012:role/ecsTaskExecutionRole",
"taskRoleArn": "arn:aws:iam::123456789012:role/ecsTaskRole",
"networkMode": "awsvpc",
"containerDefinitions": [
{
"name": "webserver",
"image": "public.ecr.aws/docker/library/nginx:latest",
"cpu": 100,
"portMappings": [
{
"name": "nginx",
"containerPort": 80,
"protocol": "tcp",
"appProtocol": "http"
}
],
"essential": true,
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/ecs/service-connect-nginx",
"awslogs-region": "region",
"awslogs-stream-prefix": "nginx"
}
}
}
],
"cpu": "256",
"memory": "512"
}
service-connect-nginx.json파일을 사용해 태스크 정의를 등록합니다:
aws ecs register-task-definition --cli-input-json file://service-connect-nginx.json
- 서비스를 만듭니다:
- 생성 중인 Amazon ECS 서비스의 내용으로
service-connect-nginx-service.json이라는 파일을 만듭니다. 이 예시는 이전 단계에서 만든 태스크 정의를 사용합니다. 예시 태스크 정의가awsvpc네트워크 모드를 사용하므로awsvpcConfiguration이 필요합니다. - ECS 서비스를 만들 때 Fargate와 Service Connect를 지원하는
LATEST플랫폼 버전을 지정합니다.securityGroups와subnets는 Amazon ECS 사용 요구 사항이 있는 VPC에 속해야 합니다. 보안 그룹과 서브넷 ID는 Amazon VPC 콘솔에서 얻을 수 있어요. - 이 서비스는
serviceConnectConfiguration파라미터를 추가하여 Service Connect를 구성합니다. 클러스터에 기본 네임스페이스가 구성되어 있으므로 네임스페이스는 필요하지 않습니다. 네임스페이스에서 ECS에서 실행되는 클라이언트 애플리케이션은portName과clientAliases의 포트를 사용해 이 서비스에 연결합니다. 예를 들어 이 서비스는 nginx가 루트 위치/에 환영 페이지를 제공하므로http://nginx:80/으로 접근할 수 있습니다. Amazon ECS에서 실행되지 않거나 같은 네임스페이스에 없는 외부 애플리케이션은 태스크의 IP 주소와 태스크 정의의 포트 번호를 사용해 Service Connect 프록시를 통해 이 애플리케이션에 도달할 수 있어요. tls 구성의 경우awsPcaAuthorityArn에 대한 인증서 ARN,kmsKey, IAM 역할의roleArn을 추가하세요. - 이 서비스는
logConfiguration을 사용해 서비스 커넥트 프록시의 stdout과 stderr 출력을 Amazon CloudWatch Logs로 보냅니다. 이 태스크 실행 역할은 CloudWatch Logs 로그 그룹을 만드는 데 필요한 추가 권한이 없습니다. AWS Management Console 또는 AWS CLI를 사용해 CloudWatch Logs에 로그 그룹을 만드세요. 로그 그룹을 만들고 CloudWatch Logs에 프록시 로그를 저장할 것을 권장합니다. 프록시 로그를 CloudWatch Logs로 보내지 않으려면logConfiguration을 제거할 수 있어요.
- 생성 중인 Amazon ECS 서비스의 내용으로
{
"cluster": "tutorial",
"deploymentConfiguration": {
"maximumPercent": 200,
"minimumHealthyPercent": 0
},
"deploymentController": {
"type": "ECS"
},
"desiredCount": 1,
"enableECSManagedTags": true,
"enableExecuteCommand": true,
"launchType": "FARGATE",
"networkConfiguration": {
"awsvpcConfiguration": {
"assignPublicIp": "ENABLED",
"securityGroups": [
"sg-EXAMPLE"
],
"subnets": [
"subnet-EXAMPLE",
"subnet-EXAMPLE",
"subnet-EXAMPLE"
]
}
},
"platformVersion": "LATEST",
"propagateTags": "SERVICE",
"serviceName": "service-connect-nginx-service",
"serviceConnectConfiguration": {
"enabled": true,
"services": [
{
"portName": "nginx",
"clientAliases": [
{
"port": 80
}
],
"tls": {
"issuerCertificateAuthority": {
"awsPcaAuthorityArn": "certificateArn"
},
"kmsKey": "kmsKey",
"roleArn": "iamRoleArn"
}
}
],
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/ecs/service-connect-proxy",
"awslogs-region": "region",
"awslogs-stream-prefix": "service-connect-proxy"
}
}
},
"taskDefinition": "service-connect-nginx"
}
service-connect-nginx-service.json파일을 사용해 서비스를 만듭니다:
aws ecs create-service --cluster tutorial --cli-input-json file://service-connect-nginx-service.json
출력:
{
"service": {
"serviceArn": "arn:aws:ecs:us-west-2:123456789012:service/tutorial/service-connect-nginx-service",
"serviceName": "service-connect-nginx-service",
"clusterArn": "arn:aws:ecs:us-west-2:123456789012:cluster/tutorial",
"loadBalancers": [],
"serviceRegistries": [],
"status": "ACTIVE",
"desiredCount": 1,
"runningCount": 0,
"pendingCount": 0,
"launchType": "FARGATE",
"platformVersion": "LATEST",
"platformFamily": "Linux",
"taskDefinition": "arn:aws:ecs:us-west-2:123456789012:task-definition/service-connect-nginx:1",
"deploymentConfiguration": {
"deploymentCircuitBreaker": {
"enable": false,
"rollback": false
},
"maximumPercent": 200,
"minimumHealthyPercent": 0
},
"deployments": [
{
"id": "ecs-svc/3763308422771520962",
"status": "PRIMARY",
"taskDefinition": "arn:aws:ecs:us-west-2:123456789012:task-definition/service-connect-nginx:1",
"desiredCount": 1,
"pendingCount": 0,
"runningCount": 0,
"failedTasks": 0,
"createdAt": 1661210032.602,
"updatedAt": 1661210032.602,
"launchType": "FARGATE",
"platformVersion": "1.4.0",
"platformFamily": "Linux",
"networkConfiguration": {
"awsvpcConfiguration": {
"assignPublicIp": "ENABLED",
"securityGroups": [
"sg-EXAMPLE"
],
"subnets": [
"subnet-EXAMPLEf",
"subnet-EXAMPLE",
"subnet-EXAMPLE"
]
}
},
"rolloutState": "IN_PROGRESS",
"rolloutStateReason": "ECS deployment ecs-svc/3763308422771520962 in progress.",
"failedLaunchTaskCount": 0,
"replacedTaskCount": 0,
"serviceConnectConfiguration": {
"enabled": true,
"namespace": "service-connect",
"services": [
{
"portName": "nginx",
"clientAliases": [
{
"port": 80
}
]
}
],
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/ecs/service-connect-proxy",
"awslogs-region": "us-west-2",
"awslogs-stream-prefix": "service-connect-proxy"
},
"secretOptions": []
}
},
"serviceConnectResources": [
{
"discoveryName": "nginx",
"discoveryArn": "arn:aws:servicediscovery:us-west-2:123456789012:service/srv-EXAMPLE"
}
]
}
],
"roleArn": "arn:aws:iam::123456789012:role/aws-service-role/ecs.amazonaws.com/AWSServiceRoleForECS",
"version": 0,
"events": [],
"createdAt": 1661210032.602,
"placementConstraints": [],
"placementStrategy": [],
"networkConfiguration": {
"awsvpcConfiguration": {
"assignPublicIp": "ENABLED",
"securityGroups": [
"sg-EXAMPLE"
],
"subnets": [
"subnet-EXAMPLE",
"subnet-EXAMPLE",
"subnet-EXAMPLE"
]
}
},
"schedulingStrategy": "REPLICA",
"enableECSManagedTags": true,
"propagateTags": "SERVICE",
"enableExecuteCommand": true
}
}
제공한 serviceConnectConfiguration은 출력의 첫 번째 배포 안에 나타납니다. 태스크를 변경해야 하는 방식으로 ECS 서비스를 변경할 때마다 Amazon ECS가 새 배포를 만듭니다.
3단계: 연결할 수 있는지 확인 (Step 3: Verify that you can connect)
Service Connect가 구성되고 작동하는지 확인하려면 다음 단계에 따라 외부 애플리케이션에서 웹 서비스에 연결합니다. 그런 다음 Service Connect 프록시가 만드는 CloudWatch의 추가 지표를 확인합니다.
외부 애플리케이션에서 웹 서비스에 연결하려면
- 태스크 IP 주소와 컨테이너 포트를 사용해 연결합니다.
aws ecs list-tasks --cluster tutorial을 사용해 AWS CLI로 태스크 ID를 얻습니다. - 서브넷과 보안 그룹이 태스크 정의의 포트에서 퍼블릭 인터넷의 트래픽을 허용한다면 컴퓨터에서 퍼블릭 IP로 연결할 수 있어요. 다만 퍼블릭 IP는
describe-tasks에서 사용할 수 없으므로, 탄력적 네트워크 인터페이스의 세부 정보를 얻기 위해 Amazon EC2 AWS Management Console 또는 AWS CLI로 이동하는 단계가 포함됩니다. 이 예시에서 같은 VPC의 Amazon EC2 인스턴스는 태스크의 프라이빗 IP를 사용합니다. 애플리케이션은 nginx이지만server: envoy헤더는 Service Connect 프록시가 사용됨을 보여줍니다. Service Connect 프록시는 태스크 정의의 컨테이너 포트에서 수신합니다.
$ curl -v 10.0.19.50:80/
* Trying 10.0.19.50:80...
* Connected to 10.0.19.50 (10.0.19.50) port 80 (#0)
> GET / HTTP/1.1
> Host: 10.0.19.50
> User-Agent: curl/7.79.1
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< server: envoy
< date: Tue, 23 Aug 2022 03:53:06 GMT
< content-type: text/html
< content-length: 612
< last-modified: Tue, 16 Apr 2019 13:08:19 GMT
< etag: "5cb5d3c3-264"
< accept-ranges: bytes
< x-envoy-upstream-service-time: 0
<
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
Service Connect 지표를 보려면
Service Connect 프록시는 애플리케이션(HTTP, HTTP2, gRPC 또는 TCP 연결) 지표를 CloudWatch 지표에 생성합니다. CloudWatch 콘솔을 사용할 때 Amazon ECS 네임스페이스 아래의 DiscoveryName, (DiscoveryName, ServiceName, ClusterName), TargetDiscoveryName, (TargetDiscoveryName, ServiceName, ClusterName) 추가 지표 차원을 확인하세요. 이러한 지표와 차원에 대한 자세한 내용은 Amazon CloudWatch Logs 사용자 가이드의 사용 가능한 지표 보기 문서를 참고하세요.
더 알아보기 (Learn more)
- Service Connect 구성과 지표에 대한 자세한 내용은 AWS 개발자 가이드의 관련 문서를 참고하세요.