

# Amazon ECS 서비스 상호 연결
<a name="interconnecting-services"></a>

Amazon ECS 작업에서 실행되는 애플리케이션은 종종 인터넷으로부터 연결을 받거나 Amazon ECS 서비스에서 실행되는 다른 애플리케이션에 연결해야 합니다. 인터넷을 통한 외부 연결이 필요한 경우 Elastic Load Balancing을 사용하는 것이 좋습니다. 통합 로드 밸런싱에 대한 자세한 내용은 [로드 밸런싱을 사용하여 Amazon ECS 서비스 트래픽 분산](service-load-balancing.md) 섹션을 참조하세요.

애플리케이션이 Amazon ECS 서비스에서 실행되는 다른 애플리케이션에 연결해야 하는 경우 Amazon ECS에서는 다음과 같은 방법으로 로드 밸런서 없이 할 수 있습니다.
+ *Amazon ECS Service Connect*

  서비스 검색, 연결 및 트래픽 모니터링을 위한 Amazon ECS 구성을 제공하는 Service Connect를 사용하는 것이 좋습니다. Service Connect를 사용하면 애플리케이션dms 짧은 이름과 표준 포트를 사용하여 동일한 AWS 리전에 있는 여러 VCP에 있는 항목을 포함하여 동일한 클러스터, 다른 클러스터의 Amazon ECS 서비스에 연결할 수 있습니다.

  Service Connect를 사용하면 Amazon ECS가 서비스 검색의 모든 부분을 관리합니다. 즉, 검색할 수 있는 이름을 생성하고, 작업이 시작 및 중지될 때 각 작업에 대한 항목을 동적으로 관리하며, 이름을 검색하도록 구성된 각 작업에서 에이전트를 실행할 수 있습니다. 애플리케이션은 DNS 이름에 대한 표준 기능을 사용하고 연결을 설정하여 이름을 조회할 수 있습니다. 애플리케이션이 이미 이 작업을 수행하는 경우 Service Connect를 사용하기 위해 애플리케이션을 수정할 필요가 없습니다.

  각 서비스 및 작업 정의 내에 전체 구성을 제공합니다. Amazon ECS는 각 서비스 배포에서 이 구성의 변경 내용을 관리하여 배포의 모든 작업이 동일한 방식으로 작동하도록 합니다. 예를 들어, 서비스 검색으로 DNS에서 흔히 발생하는 문제는 마이그레이션 제어와 관련됩니다. 새 교체 IP 주소를 가리키도록 DNS 이름을 변경하는 경우 모든 클라이언트가 새 서비스를 사용하기 시작하는 데 최대 TTL 시간이 걸릴 수 있습니다. Service Connect를 사용하면 클라이언트 배포에서 클라이언트 작업을 교체하여 구성을 업데이트합니다. 다른 배포와 동일한 방식으로 Service Connect 변경 내용에 영향을 주도록 배포 회로 차단기 및 기타 배포 구성을 구성할 수 있습니다.

  자세한 내용은 [Service Connect를 사용하여 짧은 이름으로 Amazon ECS 서비스 연결](service-connect.md) 섹션을 참조하세요.
+ *Amazon ECS 서비스 검색*

  서비스 간 통신의 또 다른 접근 방식으로, 서비스 검색을 사용하는 직접 통신이 있습니다. 이 접근 방식에서는 Amazon ECS와의 AWS Cloud Map 서비스 검색 통합을 사용할 수 있습니다. Amazon ECS는 서비스 검색을 사용하여 시작된 작업 목록을 AWS Cloud Map과 동기화합니다. 이 제품에서는 해당 특정 서비스에서 하나 이상 작업에 대한 내부 IP 주소로 확인되는 DNS 호스트 이름을 유지 관리합니다. Amazon VPC의 다른 서비스는 이 DNS 호스트 이름을 사용하여 내부 IP 주소를 통해 다른 컨테이너로 직접 트래픽을 보낼 수 있습니다.

  서비스 간 통신에 대한 이러한 접근 방식은 지연 시간을 줄여줍니다. 컨테이너 사이에 추가 구성 요소가 없습니다. 트래픽은 한 컨테이너에서 다른 컨테이너로 직접 이동합니다.

  이 접근 방식은 각 작업의 IP 주소가 고유한 `awsvpc` 네트워크 모드를 사용할 때 적합합니다. 대부분의 소프트웨어는 IP 주소로 직접 확인되는 DNS `A` 레코드 사용만 지원합니다. `awsvpc` 네트워크 모드를 사용하는 경우 각 작업의 IP 주소는 `A` 레코드입니다. 하지만 `bridge` 네트워크 모드를 사용하는 경우 여러 컨테이너가 동일한 IP 주소를 공유할 수 있습니다. 또한 동적 포트 매핑으로 해당 단일 IP 주소에서 컨테이너에 포트 번호가 무작위로 할당됩니다. 이 경우 `A` 레코드는 더 이상 서비스 검색에 충분하지 않습니다. 또한 `SRV` 레코드를 사용해야 합니다. 이 유형의 레코드는 IP 주소와 포트 번호를 모두 추적할 수 있지만 애플리케이션을 적절하게 구성해야 합니다. 사용하는 일부 사전 구축된 애플리케이션은 `SRV` 레코드를 지원하지 않을 수 있습니다.

  `awsvpc` 네트워크 모드의 또 다른 이점은 각 서비스에 대해 고유한 보안 그룹이 보유한다는 점입니다. 해당 서비스와 통신해야 하는 특정 업스트림 서비스의 수신 연결만 허용하도록 이 보안 그룹을 구성할 수 있습니다.

  서비스 검색을 사용하는 서비스 간 직접 통신의 주된 단점은 재시도 및 연결 실패 처리를 위해 추가 로직을 구현해야 한다는 점입니다. DNS 레코드에는 캐싱되는 시간을 제어하는 TTL(Time To Live) 기간이 있습니다. 애플리케이션이 최신 버전의 DNS 레코드를 선택할 수 있도록 DNS 레코드를 업데이트하고 캐시가 만료되기까지 어느 정도 시간이 걸립니다. 따라서 애플리케이션이 DNS 레코드를 확인할 때 더 이상 존재하지 않는 다른 컨테이너를 가리킬 수 있습니다. 애플리케이션은 재시도를 처리하고 잘못된 백엔드를 무시할 수 있는 로직을 포함해야 합니다.

  자세한 내용은 [서비스 검색을 사용하여 Amazon ECS 서비스를 DNS 이름으로 연결](service-discovery.md) 섹션을 참조하세요.
+ *Amazon VPC Lattice *

  Amazon VPC Lattice는 Amazon ECS 고객이 코드를 수정하지 않고 AWS 컴퓨팅 서비스, VPC 및 계정에 구축된 애플리케이션을 관찰, 보안 유지 및 모니터링하는 데 사용하는 관리형 애플리케이션 네트워킹 서비스입니다.

  VPC Lattice에서는 컴퓨팅 리소스 모음인 대상 그룹을 사용합니다. 이러한 대상은 애플리케이션 또는 서비스를 실행하며, Amazon EC2 인스턴스, IP 주소, Lambda 함수 및 Application Load Balancer일 수 있습니다. 이제는 고객이 Amazon ECS 서비스를 VPC Lattice 대상 그룹과 연결하여 Amazon ECS 작업을 VPC Lattice의 IP 대상으로 활성화할 수 있습니다. Amazon ECS에서는 등록된 서비스에 대한 태스크가 시작될 때 VPC Lattice 대상 그룹에 태스크를 자동으로 등록합니다.

  자세한 내용은 [Amazon VPC Lattice를 사용하여 Amazon ECS 서비스 연결, 관찰 및 보안 유지](ecs-vpc-lattice.md) 섹션을 참조하세요.

## 네트워크 모드 호환성 표
<a name="interconnect-network-mode-compatibility-table"></a>

다음 표에서는 이러한 옵션과 작업 네트워크 모드 간의 호환성에 대해 설명합니다. 표에서 '클라이언트'는 Amazon ECS 작업 내에서 연결하는 애플리케이션을 가리킵니다.


****  

| 상호 연결 옵션 | 브리징 | `awsvpc` | Host | 
| --- | --- | --- | --- | 
| 서비스 검색 | 예, 하지만 클라이언트는 hostPort 없이 DNS에서 SRV 레코드를 인식해야 합니다. | yes | 예, 하지만 클라이언트는 hostPort 없이 DNS에서 SRV 레코드를 인식해야 합니다. | 
| Service Connect  | 예 | 예 | 아니요 | 
| VPC Lattice | 예 | 예 | 예 | 

# Service Connect를 사용하여 짧은 이름으로 Amazon ECS 서비스 연결
<a name="service-connect"></a>

Amazon ECS Service Connect는 서비스 간 통신 관리를 Amazon ECS 구성으로 제공합니다. Amazon ECS에서 서비스 검색과 서비스 메시를 모두 구축합니다. 이를 통해 서비스 배포에서 관리하는 각 서비스 내부의 전체 구성, VPC DNS 구성에 의존하지 않는 네임스페이스 내 서비스를 참조하는 통합된 방법, 모든 애플리케이션을 모니터링하는 표준화된 지표와 로그를 제공합니다. Service Connect는 서비스만 상호 연결합니다.

다음 다이어그램에서는 VPC의 서브넷 2개와 서비스 2개가 있는 서비스 연결 네트워크 예제를 보여줍니다. 클라이언트 서비스는 각 서브넷에서 1개 작업으로 WordPress를 실행합니다. 서버 서비스는 각 서브넷에서 1개 작업으로 MySQL을 실행합니다. 각 서비스가 2개의 서브넷에 분산된 여러 작업을 실행하므로 두 서비스 모두 가용성이 높고 작업 및 가용 영역 문제에 대한 복원력이 뛰어납니다. 실선 화살표는 WordPress에서 MySQL로의 연결을 나타냅니다. 예를 들어, `mysql --host=mysql` CLI 명령은 작업의 WordPress 컨테이너 내에서 IP 주소 `172.31.16.1`로 실행됩니다. 이 명령은 MySQL의 기본 포트에서 약식 이름 `mysql`을 사용합니다. 이 이름과 포트는 동일한 작업의 서비스 연결 프록시에 연결합니다. WordPress 작업의 프록시는 라운드 로빈 로드 밸런싱과 이상값 탐지의 이전 실패 정보를 사용하여 연결할 MySQL 작업을 선택합니다. 다이어그램에서 실선 화살표로 표시된 것처럼 프록시는 IP 주소 `172.31.16.2`를 사용하여 MySQL 작업의 두 번째 프록시에 연결합니다. 두 번째 프록시는 동일한 작업의 로컬 MySQL 서버에 연결합니다. 두 프록시 모두 Amazon ECS 및 Amazon CloudWatch 콘솔에서 그래프로 확인할 수 있는 연결 성능을 보고하므로 동일한 방법으로 모든 종류의 애플리케이션에서 성능 지표를 얻을 수 있습니다.

![\[최소 HA 서비스를 표시하는 서비스 연결 네트워크 예제\]](http://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/images/serviceconnect.png)


다음 용어는 Service Connect에서 사용됩니다.

**포트 이름**  
특정 포트 매핑에 이름을 할당하는 Amazon ECS 작업 정의 구성입니다. 이 구성은 Amazon ECS Service Connect에서만 사용됩니다.

**클라이언트 별칭**  
엔드포인트에서 사용되는 포트 번호를 할당하는 Amazon ECS 서비스 구성입니다. 추가로 클라이언트 별칭은 엔드포인트의 DNS 이름을 할당하여 검색 이름을 재정의할 수 있습니다. 검색 이름이 Amazon ECS 서비스에 제공되지 않은 경우 클라이언트 별칭 이름이 엔드포인트 이름인 포트 이름보다 우선합니다. 엔드포인트 예제는 *엔드포인트* 정의를 참조하세요. 여러 클라이언트 별칭을 Amazon ECS 서비스에 할당할 수 있습니다. 이 구성은 Amazon ECS Service Connect에서만 사용됩니다.

**검색 이름**  
작업 정의에서 지정된 포트에 대해 생성할 수 있는 선택적 중간 이름입니다. 이 이름은 AWS Cloud Map 서비스를 생성하는 데 사용됩니다. 이 이름이 제공되지 않으면 작업 정의의 포트 이름이 사용됩니다. 특정 포트 및 Amazon ECS 서비스에 여러 검색 이름을 할당할 수 있습니다. 이 구성은 Amazon ECS Service Connect에서만 사용됩니다.  
AWS Cloud Map 서비스 이름은 네임스페이스 내에서 고유해야 합니다. 이러한 제한 때문에 각 네임스페이스의 특정 작업 정의에 대한 검색 이름이 없는 Service Connect 구성은 하나만 있을 수 있습니다.

**엔드포인트**  
API 또는 웹 사이트에 연결하기 위한 URL입니다. URL에는 프로토콜, DNS 이름 및 포트가 포함됩니다. 일반적인 엔드포인트에 대한 자세한 내용은 Amazon Web Services 일반 참조의 *AWS 용어집*에 있는 [엔드포인트](https://docs.aws.amazon.com/glossary/latest/reference/glos-chap.html#endpoint)를 참조하세요.  
Service Connect는 Amazon ECS 서비스에 연결하는 엔드포인트를 생성하고 Amazon ECS 서비스에서 엔드포인트에 연결할 작업을 구성합니다. URL에는 프로토콜, DNS 이름 및 포트가 포함됩니다. 포트는 컨테이너 이미지 내에 있는 애플리케이션과 일치해야 하므로 작업 정의에서 프로토콜 및 포트 이름을 선택합니다. 서비스에서 이름에 따라 각 포트를 선택하고 DNS 이름을 할당할 수 있습니다. Amazon ECS 서비스 구성에서 DNS 이름을 지정하지 않으면 기본적으로 작업 정의의 포트 이름이 사용됩니다. 예를 들어, Service Connect 엔드포인트는 `http://blog:80`, `grpc://checkout:8080` 또는 `http://_db.production.internal:99`일 수 있습니다.

**Service Connect 서비스**  
Amazon ECS 서비스의 단일 엔드포인트 구성입니다. 이는 Service Connect 구성의 일부로 콘솔의 **Service Connect and discovery name configuration**(Service Connect 및 검색 이름 구성)의 단일 행 또는 Amazon ECS 서비스의 JSON 구성에 있는 `services` 목록의 한 객체로 구성됩니다. 이 구성은 Amazon ECS Service Connect에서만 사용됩니다.  
자세한 내용은 Amazon Elastic Container Service API 참조의 [ServiceConnectService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ServiceConnectService.html)를 참조하세요.

**네임스페이스**  
Service Connect와 함께 사용할 AWS Cloud Map 네임스페이스의 약식 이름 또는 전체 Amazon 리소스 이름(ARN)입니다. 네임스페이스는 Amazon ECS 서비스 및 클러스터와 같은 AWS 리전에 있어야 합니다. AWS Cloud Map의 네임스페이스 유형은 Service Connect에 영향을 주지 않습니다. 네임스페이스는 AWS RAM 가 사용 가능한 AWS 리전에서 AWS Resource Access Manager(AWS RAM)를 사용하여 AWS 계정과 공유되는 네임스페이스일 수 있습니다. 공유 네임스페이스에 대한 자세한 내용은 *AWS Cloud Map 개발자 안내서*의 [Cross-account AWS Cloud Map namespace sharing](https://docs.aws.amazon.com/cloud-map/latest/dg/sharing-namespaces.html)을 참조하세요.  
Service Connect는 AWS Cloud Map 네임스페이스를 서로 통신하는 Amazon ECS 작업의 논리적 그룹으로 사용합니다. 각 Amazon ECS 서비스는 하나의 네임스페이스에만 속할 수 있습니다. 네임스페이스 내 서비스는 동일한 AWS 리전에 있는 여러 Amazon ECS 클러스터에 분산될 수 있습니다. 네임스페이스가 공유 네임스페이스인 경우 서비스는 네임스페이스 소유자 및 네임스페이스 소비자 AWS 계정에서 분산될 수 있습니다. 어떤 기준으로든 서비스를 자유롭게 구성할 수 있습니다.

**클라이언트 서비스**  
네트워크 클라이언트 애플리케이션을 실행하는 서비스입니다. 이 서비스에는 네임스페이스가 구성되어 있어야 합니다. 서비스의 각 작업은 Service Connect 프록시 컨테이너를 통해 네임스페이스의 모든 엔드포인트를 검색하고 연결할 수 있습니다.  
작업의 컨테이너에서 네임스페이스의 서비스에서 엔드포인트에 연결해야 하는 경우 클라이언트 서비스를 선택합니다. 프런트엔드, 리버스 프록시 또는 로드 밸런서 애플리케이션이 Elastic Load Balancing 등의 다른 방법을 통해 외부 트래픽을 수신하는 경우 이 유형의 Service Connect 구성 유형을 사용할 수 있습니다.

**클라이언트-서버 서비스**  
네트워크 또는 웹 서비스 애플리케이션을 실행하는 Amazon ECS 서비스입니다. 이 서비스에는 네임스페이스와 하나 이상의 엔드포인트가 구성되어 있어야 합니다. 서비스의 각 작업은 엔드포인트를 사용하여 연결할 수 있습니다. Service Connect 프록시 컨테이너는 엔드포인트 이름과 포트에서 수신 대기하여 트래픽을 작업의 앱 컨테이너로 보냅니다.  
네트워크 트래픽을 위해 포트를 노출하고 해당 포트에서 수신 대기하는 컨테이너가 있는 경우 클라이언트-서버 서비스를 선택합니다. 이러한 애플리케이션은 동일한 네임스페이스의 다른 클라이언트-서버 서비스에 연결할 필요는 없지만 클라이언트 구성이 필요합니다. 백엔드, 미들웨어, 비즈니스 티어 또는 대부분의 마이크로서비스는 이 유형의 Service Connect 구성을 사용할 수 있습니다. 프런트엔드, 리버스 프록시 또는 로드 밸런서 애플리케이션이 동일한 네임스페이스의 Service Connect로 구성된 다른 서비스로부터 트래픽을 수신하도록 하려면 이러한 서비스가 이 유형의 Service Connect 구성을 사용해야 합니다.

Service Connect 기능은 관련 서비스의 가상 네트워크를 생성합니다. 동일한 서비스 구성을 여러 네임스페이스에서 사용하여 독립적이면서도 동일한 애플리케이션 세트를 실행할 수 있습니다. Service Connect는 Amazon ECS 서비스의 프록시 컨테이너를 정의합니다. 이렇게 하면 동일한 작업 정의를 사용하여 Service Connect 구성이 다른 여러 네임스페이스에서 동일한 애플리케이션을 실행할 수 있습니다. 서비스가 만드는 각 태스크는 태스크의 프록시 컨테이너를 실행합니다.

Service Connect는 동일한 네임스페이스 내의 Amazon ECS 서비스 간 연결에 적합합니다. 다음 애플리케이션의 경우 추가 상호 연결 방법을 사용하여 Service Connect로 구성된 Amazon ECS 서비스에 연결해야 합니다.
+ 다른 네임스페이스에서 구성된 태스크
+ Service Connect에 대해 구성되지 않은 태스크
+ Amazon ECS 외부의 기타 애플리케이션

이러한 애플리케이션은 Service Connect 프록시를 통해 연결할 수 있지만 Service Connect 엔드포인트 이름을 확인할 수는 없습니다.

이러한 애플리케이션이 Amazon ECS 작업의 IP 주소를 확인하려면 다른 상호 연결 방법을 사용해야 합니다.

**Topics**
+ [가격 책정](#service-connect-pricing)
+ [Amazon ECS Service Connect 구성 요소](service-connect-concepts-deploy.md)
+ [Amazon ECS Service Connect 구성 개요](service-connect-concepts.md)
+ [공유 AWS Cloud Map 네임스페이스를 사용하는 Amazon ECS Service Connect](service-connect-shared-namespaces.md)
+ [Amazon ECS Service Connect 액세스 로그](service-connect-envoy-access-logs.md)
+ [Amazon ECS Service Connect 트래픽 암호화](service-connect-tls.md)
+ [AWS CLI를 사용한 Amazon ECS Service Connect 구성](create-service-connect.md)

## 가격 책정
<a name="service-connect-pricing"></a>
+ Amazon ECS Service Connect 요금은 AWS Fargate 또는 컨테이너식 워크로드를 호스팅하는 Amazon EC2 인프라의 사용 여부에 따라 달라집니다. AWS Outposts에서 Amazon ECS를 사용하는 경우 요금은 Amazon EC2를 직접 사용할 때와 동일한 모델을 따릅니다. 자세한 내용은 [Amazon ECS 요금](https://aws.amazon.com/ecs/pricing)을 참조하세요.
+ Amazon ECS Service Connect 사용에 따른 추가 요금은 없습니다.
+ Service Connect에서 사용하는 경우 AWS Cloud Map 사용에 따른 추가 요금은 없습니다.
+ 고객은 vCPU 및 메모리를 비롯하여 Amazon ECS Service Connect에서 사용하는 컴퓨팅 리소스에 대한 비용을 지불합니다. Amazon ECS Service Connect 에이전트는 고객 태스크 내에서 실행되므로 실행에 따른 추가 요금은 없습니다. 태스크 리소스는 고객 워크로드와 Amazon ECS Service Connect 에이전트 간에 공유됩니다.
+ AWS Private CA에서 Amazon ECS Service Connect 트래픽 암호화 기능을 사용하는 경우, 고객은 생성한 프라이빗 인증 기관과 발급된 각 TLS 인증서에 대한 비용을 지불합니다. 자세한 내용은 [AWS Private Certificate Authority 요금](https://aws.amazon.com/private-ca/pricing/)을 참조하세요. TLS 인증서의 월별 비용을 추정하려면 고객은 TLS가 활성화된 Amazon ECS 서비스의 수를 파악하여 인증서 비용을 곱한 다음 6을 곱해야 합니다. Amazon ECS Service Connect는 5일마다 TLS 인증서를 자동으로 교체하므로, Amazon ECS 서비스당 월 평균 6개의 인증서가 발급됩니다.

# Amazon ECS Service Connect 구성 요소
<a name="service-connect-concepts-deploy"></a>

Amazon ECS Service Connect를 사용하는 경우에는 네트워크 요청을 받는 서버 애플리케이션(클라이언트-서버 서비스)을 실행하거나 요청을 생성하는 클라이언트 애플리케이션(클라이언트 서비스)을 실행하도록 각 Amazon ECS 서비스를 구성합니다.

Service Connect 사용을 시작할 준비가 되면 클라이언트-서버 서비스로 시작합니다. 새 서비스 또는 기존 서비스에 Service Connect 구성을 추가할 수 있습니다. Amazon ECS는 네임스페이스에 Service Connect 엔드포인트를 생성합니다. 추가로 Amazon ECS는 서비스에 새 배포를 생성하여 현재 실행 중인 작업을 대체합니다.

기존 작업 및 기타 애플리케이션은 기존 엔드포인트 및 외부 애플리케이션에 계속 연결할 수 있습니다. 클라이언트-서버 서비스가 스케일 아웃을 통해 태스크를 추가하면 클라이언트의 새 연결이 모든 태스크 간에 즉시 밸런싱됩니다. 클라이언트-서버 서비스가 업데이트된 경우 클라이언트의 새 연결은 새 버전의 태스크 사이에서 밸런싱됩니다.

기존 작업은 확인할 수 없으며 새 엔드포인트에 연결할 수 없습니다. 동일한 네임스페이스에 Service Connect 구성이 있고 이 배포 이후에 실행을 시작하는 새 태스크만 이 엔드포인트를 확인하고 여기에 연결할 수 있습니다.

즉, 서버 애플리케이션 운영자가 언제든지 구성을 변경할 수 있더라도 클라이언트 애플리케이션 운영자가 앱 구성이 변경되는 시기를 결정합니다. 네임스페이스의 엔드포인트 목록은 네임스페이스의 서비스가 배포될 때마다 변경될 수 있습니다. 기존 태스크와 대체 태스크는 최근 배포 후에도 동일하게 작동합니다.

다음 예제를 살펴보세요.

먼저 퍼블릭 인터넷에서 사용할 수 있는 애플리케이션을 단일 AWS CloudFormation 템플릿 및 단일 CloudFormation 스택으로 생성하고 있다고 가정해 보겠습니다. 공개 검색 및 연결 가능성은 프런트엔드 클라이언트 서비스를 포함하여 CloudFormation에서 마지막으로 생성해야 합니다. 프런트엔드 클라이언트 서비스가 실행되고 퍼블릭에서 사용 가능하지만 백엔드는 사용할 수 없는 기간을 방지하려면 이 순서로 서비스를 생성해야 합니다. 이렇게 하면 해당 기간 동안 오류 메시지가 퍼블릭으로 전송되는 것을 방지할 수 있습니다. AWS CloudFormation에서는 `dependsOn`을 사용하여 CloudFormation에 여러 Amazon ECS 서비스를 병렬로 또는 동시에 만들 수 없음을 나타내야 합니다. 클라이언트 작업이 연결되는 각 백엔드 클라이언트-서버 서비스의 프런트엔드 클라이언트 서비스에 `dependsOn`을 추가해야 합니다.

두 번째로 프런트엔드 서비스가 Service Connect 구성 없이 존재한다고 가정합니다. 작업은 기존 백엔드 서비스에 연결되고 있습니다. 먼저 **DNS** 또는 프런트엔드가 사용하는 `clientAlias`에서의 동일한 이름을 사용하여 백엔드 서비스에 클라이언트-서버 Service Connect 구성을 추가합니다. 이렇게 하면 새 배포가 생성되므로 모든 배포 롤백 탐지 또는 AWS Management Console, AWS CLI, AWS SDK 및 기타 메서드가 백엔드 서비스를 롤백하고 이전 배포 및 구성으로 되돌릴 수 있습니다. 백엔드 서비스의 성능과 동작이 만족스러우면 프런트엔드 서비스에 클라이언트 또는 클라이언트-서버 Service Connect 구성을 추가합니다. 새 배포의 작업만 새 작업에 추가된 Service Connect 프록시를 사용합니다. 이 구성에 문제가 있는 경우 배포 롤백 탐지 또는 AWS Management Console, AWS CLI, AWS SDK 및 기타 메서드를 사용하여 백엔드 서비스를 롤백하고 이전 배포 및 구성으로 되돌려 이전 구성으로 롤백하고 되돌릴 수 있습니다. Service Connect 대신 DNS를 기반으로 하는 다른 서비스 검색 시스템을 사용하는 경우 로컬 DNS 캐시가 만료된 후 프런트엔드 또는 클라이언트 애플리케이션이 새 엔드포인트를 사용하고 엔드포인트 구성을 변경하기 시작하며, 일반적으로 몇 시간이 걸립니다.

## 네트워킹
<a name="service-connect-concepts-network"></a>

기본적으로 Service Connect 프록시는 태스크 정의 포트 매핑의 `containerPort`에서 수신 대기합니다. 보안 그룹 규칙은 클라이언트가 실행될 서브넷에서 이 포트로 들어오는(수신) 트래픽을 허용해야 합니다.

Service Connect 서비스 구성에서 포트 번호를 설정하더라도 Service Connect 프록시가 수신 대기하는 클라이언트-서버 서비스용 포트는 변경되지 않습니다. 이 포트 번호를 설정하면 Amazon ECS는 해당 작업 내의 Amazon ECS 프록시에서 클라이언트 서비스가 연결하는 엔드포인트의 포트를 변경합니다. 클라이언트 서비스의 프록시는 `containerPort`를 사용하여 클라이언트-서버 서비스의 프록시에 연결합니다.

Service Connect 프록시가 수신 대기하는 포트를 변경하려면 클라이언트-서버 서비스의 Service Connect 구성에서 `ingressPortOverride`를 변경합니다. 이 포트 번호를 변경하는 경우 이 서비스에 대한 트래픽에 사용되는 이 포트의 인바운드 트래픽을 허용해야 합니다.

애플리케이션이 Service Connect용으로 구성된 Amazon ECS 서비스로 전송하는 트래픽의 경우 Amazon VPC 및 서브넷에 사용 중인 `containerPort` 및 `ingressPortOverride` 포트 번호를 허용하는 라우팅 테이블 규칙 및 네트워크 ACL 규칙이 있어야 합니다.

 Service Connect를 사용하여 VPC 간에 트래픽을 보낼 수 있습니다. 라우팅 테이블 규칙, 네트워크 ACL, 보안 그룹에 대한 동일한 요구 사항이 두 VPC에 모두 적용됩니다.

예를 들어, 두 개의 클러스터는 서로 다른 VPC에서 작업을 생성합니다. 각 클러스터의 서비스는 동일한 네임스페이스를 사용하도록 구성됩니다. 이 두 서비스의 애플리케이션은 VPC DNS 구성 없이 네임스페이스의 모든 엔드포인트를 확인할 수 있습니다. 하지만 VPC 피어링, VPC 또는 서브넷 라우팅 테이블, VPC 네트워크 ACL이 `containerPort` 및 `ingressPortOverride` 포트 번호의 트래픽을 허용하는 경우를 제외하면 프록시를 연결할 수 없습니다.

`bridge` 네트워킹 모드를 사용하는 작업의 경우 상위 동적 포트 범위에서 트래픽을 허용하는 인바운드 규칙이 포함된 보안 그룹을 생성해야 합니다. 그런 다음, Service Connect 클러스터의 모든 EC2 인스턴스에 보안 그룹을 할당합니다.

## Service Connect 프록시
<a name="service-connect-concepts-proxy"></a>

Service Connect 구성을 사용하여 서비스를 생성하거나 업데이트하는 경우 Amazon ECS는 새 태스크가 시작될 때마다 새 컨테이너를 추가합니다. 별도의 컨테이너를 사용하는 이러한 패턴을 `sidecar`라고 합니다. 이 컨테이너는 작업 정의에 없으며 구성할 수 없습니다. Amazon ECS는 서비스에서 컨테이너 구성을 관리합니다. 이렇게 하면 Service Connect 없이도 여러 서비스, 네임스페이스, 태스크 간에 동일한 태스크 정의를 재사용할 수 있습니다.

**프록시 리소스**
+ 태스크 정의의 경우 CPU 및 메모리 파라미터를 설정해야 합니다.

  Service Connect 프록시 컨테이너용 작업 CPU 및 메모리에 256개의 추가 CPU 유닛과 최소 64MiB의 메모리를 추가하는 것이 좋습니다. AWS Fargate에서 설정할 수 있는 최소 메모리양은 512MiB입니다. Amazon EC2에는 태스크 정의 메모리가 필요합니다.
+ 서비스의 경우 Service Connect 구성에서 로그 구성을 설정합니다.
+ 이 서비스의 작업이 피크 부하 시 초당 500개 이상의 요청을 받을 것으로 예상되는 경우 이 작업 정의에서 Service Connect 프록시 컨테이너에 대한 작업 CPU에 512개의 CPU 유닛을 추가하는 것이 좋습니다.
+ 네임스페이스에서 100개 이상의 Service Connect 서비스를 생성하거나 네임스페이스 내의 모든 Amazon ECS 서비스에서 총 2000개 이상의 작업을 생성할 것으로 예상되는 경우 Service Connect 프록시 컨테이너의 작업 메모리에 128MiB의 메모리를 추가하는 것이 좋습니다. 네임스페이스의 모든 Amazon ECS 서비스에서 사용하는 모든 작업 정의에서 이 작업을 수행해야 합니다.

**프록시 구성**  
애플리케이션은 수행 중인 동일한 작업에서 사이드카 컨테이너의 프록시에 연결합니다. Amazon ECS는 애플리케이션이 동일한 네임스페이스의 엔드포인트 이름에 연결되는 경우에만 애플리케이션이 프록시에 연결되도록 태스크와 컨테이너를 구성합니다. 다른 모든 트래픽은 프록시를 사용하지 않습니다. 다른 트래픽에는 동일한 VPC의 IP 주소, AWS 서비스 엔드포인트 및 외부 트래픽이 포함됩니다.

**로드 밸런싱**  
서비스 연결은 서비스 연결 엔드포인트의 작업 간의 로드 밸런싱에 라운드 로빈 전략을 사용하도록 프록시를 구성합니다. 연결이 시작되는 작업에 있는 로컬 프록시는 엔드포인트를 제공하는 클라이언트-서버 서비스의 작업 중 하나를 선택합니다.  
예를 들어 **로컬이라는 네임스페이스에 **클라이언트 서비스로 구성된 서비스에서 WordPress를 실행하는 태스크가 있다고 가정합니다. MySQL 데이터베이스를 실행하는 2개의 작업이 있는 다른 서비스도 있습니다. 이 서비스는 동일한 네임스페이스에서 서비스 연결을 통해 `mysql`이라는 엔드포인트를 제공하도록 구성되어 있습니다. WordPress작업에서 WordPress 애플리케이션은 엔드포인트 이름을 사용하여 데이터베이스에 연결합니다. 이 이름에 대한 연결은 동일한 태스크의 사이드카 컨테이너에서 실행되는 프록시로 이동합니다. 그러면 프록시는 라운드 로빈 전략을 사용하여 MySQL 작업 중 하나에 연결할 수 있습니다.  
로드 밸런싱 전략: 라운드 로빈

**이상치 탐지**  
이 기능은 프록시에 있는 이전에 실패한 연결에 대한 데이터를 사용하여 연결이 실패한 호스트에 새 연결이 전송되지 않도록 합니다. 서비스 연결은 프록시의 이상치 탐지 기능을 구성하여 수동 상태 확인을 제공합니다.  
이전 예제를 사용하여 프록시는 MySQL 태스크 중 하나에 연결할 수 있습니다. 프록시가 특정 MySQL 작업에 여러 번 연결했는데 지난 30초간 5개 이상의 연결이 실패한 경우 프록시는 30\$1300초간 해당 MySQL 작업을 방지합니다.

**재시도**  
서비스 연결은 프록시를 통과하여 실패한 연결을 다시 시도하도록 프록시를 구성하고, 두 번째 시도에서는 이전 연결의 호스트를 사용하지 않습니다. 이렇게 하면 서비스 연결을 통한 각 연결이 일회성 이유로 실패하지 않게 됩니다.  
재시도 횟수: 2

**제한 시간**  
서비스 연결은 클라이언트-서버 애플리케이션이 응답할 때까지 최대 시간을 대기하도록 프록시를 구성합니다. 기본 제한 시간 값은 15초이지만 업데이트할 수 있습니다.  
선택적 파라미터:  
**idleTimeout** - 유휴 상태에서 연결이 활성 상태로 유지되는 시간(초)입니다. 값이 `0`이면 `idleTimeout`이 비활성화됩니다.  
`HTTP`/`HTTP2`/`GRPC`의 `idleTimeout` 기본값은 5분입니다.  
`TCP`의 `idleTimeout` 기본값은 1시간입니다.  
**perRequestTimeout** - 업스트림이 요청당 완전한 응답으로 응답할 때까지 기다리는 시간입니다. 값이 `0`이면 `perRequestTimeout`이 꺼집니다. 애플리케이션 컨테이너에 대한 `appProtocol`이 `HTTP`/`HTTP2`/`GRPC`인 경우에만 설정할 수 있습니다. 기본값은 15초입니다.  
`idleTimeout`이 `perRequestTimeout`보다 짧은 시간으로 설정되는 경우 `perRequestTimeout`가 아닌 `idleTimeout`에 도달하면 연결이 닫힙니다.

## 고려 사항
<a name="service-connect-considerations"></a>

Service Connect를 사용할 때는 다음을 고려하세요.
+ Service Connect를 사용하려면 Fargate에서 실행되는 태스크가 Fargate Linux 플랫폼 버전 `1.4.0` 이상을 사용해야 합니다.
+ 컨테이너 인스턴스의 Amazon ECS 에이전트 버전은 `1.67.2` 이상이어야 합니다.
+ 서비스 연결을 사용하려면 컨테이너 인스턴스가 Amazon ECS 최적화 Amazon Linux 2023 AMI 버전 `20230428` 이상 또는 Amazon ECS 최적화 Amazon Linux 2 AMI 버전 `2.0.20221115`를 실행해야 합니다. 이러한 버전에는 Amazon ECS 컨테이너 에이전트 외에 서비스 연결 에이전트가 있습니다. 서비스 연결 에이전트에 대한 자세한 내용은 GitHub의 [Amazon ECS Service Connect Agent](https://github.com/aws/amazon-ecs-service-connect-agent)를 참조하세요.
+ 컨테이너 인스턴스에 리소스 `arn:aws:ecs:region:0123456789012:task-set/cluster/*`에 대한 `ecs:Poll` 권한이 있어야 합니다. `ecsInstanceRole`을 사용하는 경우에는 권한을 더 추가할 필요가 없습니다. `AmazonEC2ContainerServiceforEC2Role` 관리형 정책에 필요한 권한이 있습니다. 자세한 내용은 [Amazon ECS 컨테이너 인스턴스 IAM 역할](instance_IAM_role.md) 섹션을 참조하세요.
+ `bridge` 네트워크 모드를 사용하고 Service Connect를 사용하는 작업은 `hostname` 컨테이너 정의 파라미터를 지원하지 않습니다.
+ 작업 정의는 Service Connect를 사용하는 작업 메모리 제한을 설정해야 합니다. 자세한 내용은 [Service Connect 프록시](#service-connect-concepts-proxy) 섹션을 참조하세요.
+ 컨테이너 메모리 제한을 설정하는 태스크 정의는 지원되지 않습니다.

  컨테이너에 컨테이너 메모리 제한을 설정할 수 있지만 작업 메모리 제한을 컨테이너 메모리 제한의 합보다 큰 값으로 설정해야 합니다. 컨테이너 제한에 할당되지 않은 작업 제한의 추가 CPU 및 메모리는 Service Connect 프록시 컨테이너 및 컨테이너 제한을 설정하지 않은 다른 컨테이너에서 사용됩니다. 자세한 내용은 [Service Connect 프록시](#service-connect-concepts-proxy) 섹션을 참조하세요.
+ 동일한 AWS 계정에 있거나 AWS Resource Access Manager를 사용하여 AWS 계정에서 공유되는 동일한 리전 내 모든 AWS Cloud Map 네임스페이스를 사용하도록 Service Connect를 구성할 수 있습니다. 공유 네임스페이스 사용에 대한 자세한 내용은 [공유 AWS Cloud Map 네임스페이스를 사용하는 Amazon ECS Service Connect](service-connect-shared-namespaces.md) 섹션을 참조하세요.
+ 각 서비스는 하나의 네임스페이스에만 속할 수 있습니다.
+ 서비스에서 생성하는 태스크만 지원됩니다.
+ 모든 엔드포인트는 네임스페이스 내에서 고유해야 합니다.
+ 모든 검색 이름은 네임스페이스 내에서 고유해야 합니다.
+ 애플리케이션이 새 엔드포인트를 확인하기 전에 기존 서비스를 다시 배포해야 합니다. 최신 배포 후 네임스페이스에 추가된 새 엔드포인트는 작업 구성에 추가되지 않습니다. 자세한 내용은 [Amazon ECS Service Connect 구성 요소](#service-connect-concepts-deploy) 섹션을 참조하세요.
+ Service Connect는 클러스터가 삭제될 때 네임스페이스를 삭제하지 않습니다. AWS Cloud Map에서 네임스페이스를 삭제해야 합니다.
+ Application Load Balancer 트래픽은 기본적으로 `awsvpc` 네트워크 모드에서 Service Connect 에이전트를 통해 라우팅됩니다. 서비스 이외의 트래픽이 Service Connect 에이전트를 우회하도록 하려면 Service Connect 서비스 구성에서 `[ingressPortOverride](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ServiceConnectService.html)` 파라미터를 사용합니다.
+ TLS를 사용하는 Service Connect는 `bridge` 네트워킹 모드를 지원하지 않습니다. `awsvpc` 네트워킹 모드만 지원됩니다.
+ `awsvpc` 모드에서 Service Connect 프록시는 IPv4 전용 및 듀얼 스택 구성의 서비스에 대해 IPv4 localhost `127.0.0.1`로 트래픽을 전달합니다. IPv6 전용 구성의 서비스인 경우 프록시는 IPv6 로컬 호스트 `::1`에 트래픽을 전달합니다. 서비스가 IPv4 전용 또는 듀얼 스택 구성에서 IPv6 전용으로 업데이트될 때 원활한 경험을 위해 두 localhost를 모두 수신하도록 애플리케이션을 구성하는 것이 좋습니다. 자세한 내용은 [EC2에 대한 Amazon ECS 태스크 네트워킹 옵션](task-networking.md) 및 [Fargate에 대한 Amazon ECS 태스크 네트워킹 옵션](fargate-task-networking.md)(을)를 참조하세요.

**Service Connect는 다음을 지원하지 않습니다.**
+ Windows 컨테이너
+ HTTP 1.0
+ 독립 실행형 작업
+ CodeDeploy 및 외부 배포 유형에서 지원하는 블루/그린을 사용하는 서비스
+ Amazon ECS Anywhere용 `External` 컨테이너 인스턴스는 Service Connect에서 지원되지 않습니다.
+ PPv2
+ FIPS 모드

# Amazon ECS Service Connect 구성 개요
<a name="service-connect-concepts"></a>

Service Connect를 사용하는 경우 리소스에서 구성해야 하는 파라미터가 있습니다.

다음 표에는 Amazon ECS 리소스의 구성 파라미터가 설명되어 있습니다.


| 파라미터 위치 | 앱 유형 | 설명 | 필수 | 
| --- | --- | --- | --- | 
| 태스크 정의 | 클라이언트 | 클라이언트 작업 정의에서 Service Connect에 사용할 수 있는 변경 사항이 없습니다. | 해당 사항 없음 | 
| 태스크 정의 | 클라이언트-서버 | 서버는 컨테이너의 portMappings에 있는 포트에 name 필드를 추가해야 합니다. 자세한 내용은 [portMappings](task_definition_parameters.md#ContainerDefinition-portMappings) 섹션을 참조하세요. | 예 | 
| 태스크 정의 | 클라이언트-서버 | 서버는 선택적으로 애플리케이션 프로토콜(예: HTTP)을 제공하여 서버 애플리케이션에 대한 프로토콜별 지표를 수신할 수 있습니다(예: HTTP 5xx). | 아니요 | 
| 서비스 정의 | 클라이언트 | 조인할 네임스페이스를 구성하려면 클라이언트 서비스에서 serviceConnectConfiguration을 추가해야 합니다. 이 네임스페이스에는 이 서비스가 검색해야 하는 모든 서버 서비스가 포함되어야 합니다. 자세한 내용은 [serviceConnectConfiguration](service_definition_parameters.md#Service-serviceConnectConfiguration) 섹션을 참조하세요. | 예 | 
| 서비스 정의 | 클라이언트-서버 | 서버 서비스에서 serviceConnectConfiguration을 추가하여 서비스에서 사용할 수 있는 DNS 이름, 포트 번호 및 네임스페이스를 구성해야 합니다. 자세한 내용은 [serviceConnectConfiguration](service_definition_parameters.md#Service-serviceConnectConfiguration) 섹션을 참조하세요. | 예 | 
| 클러스터 | 클라이언트 | 클러스터는 기본 Service Connect 네임스페이스를 추가할 수 있습니다. 클러스터의 새 서비스는 Service Connect가 서비스에서 구성된 경우 네임스페이스를 상속합니다. | 아니요 | 
| 클러스터 | 클라이언트-서버 | 서버 서비스에 적용되는 클러스터의 Service Connect에 사용할 수 있는 변경 사항이 없습니다. 서버 작업 정의 및 서비스는 해당 구성을 설정해야 합니다. | 해당 사항 없음 | 

**Service Connect 구성 단계 개요**  
다음 단계는 Service Connect 구성 방법의 개요를 제공합니다.

**중요**  
 Service Connect에서 사용자 계정에 AWS Cloud Map 서비스를 생성합니다. 인스턴스를 수동으로 등록/등록 취소하거나, 인스턴스 속성을 변경하거나, 서비스를 삭제하여 이러한 AWS Cloud Map 리소스를 수정하면 애플리케이션 트래픽 또는 후속 배포에서 예상치 못한 동작이 발생할 수 있습니다.
 Service Connect는 태스크 정의에서 링크를 지원하지 않습니다.

1. 작업 정의의 포트 매핑에 포트 이름을 추가합니다. 또한 애플리케이션의 계층 7 프로토콜을 식별하여 추가 지표를 얻을 수 있습니다.

1. AWS Cloud Map 네임스페이스를 사용하거나 ECS 클러스터를 생성하거나 네임스페이스를 별도로 생성합니다. 간단한 구성을 위해 네임스페이스에 원하는 이름을 사용하여 클러스터를 생성하고 네임스페이스에 동일한 이름을 지정합니다. 이 경우 Amazon ECS는 필요한 구성으로 새 HTTP 네임스페이스를 생성합니다. Service Connect는 Amazon Route 53에서 DNS 호스팅 영역을 사용하거나 생성하지 않습니다.

1. 네임스페이스 내에 Service Connect 엔드포인트를 생성하도록 서비스를 구성합니다.

1. 서비스를 배포하여 엔드포인트를 생성합니다. Amazon ECS는 각 작업에 Service Connect 프록시 컨테이너를 추가하고 AWS Cloud Map에 Service Connect 엔드포인트를 생성합니다. 이 컨테이너는 작업 정의에 구성되어 있지 않고, 작업 정의를 수정하지 않고 재사용하여 동일한 네임스페이스 또는 여러 네임스페이스에 여러 서비스를 생성할 수 있습니다.

1. 엔드포인트에 연결할 클라이언트 앱을 서비스로 배포합니다. Amazon ECS는 각 작업에서 Service Connect 프록시를 통해 이를 Service Connect 엔드포인트에 연결합니다.

   애플리케이션은 프록시를 서비스 연결 엔드포인트에 연결하는 데에만 사용합니다. 프록시를 사용하기 위한 추가 구성은 없습니다. 프록시는 라운드 로빈 로드 밸런싱, 이상값 탐지 및 재시도를 수행합니다. 프록시에 대한 자세한 내용은 [Service Connect 프록시](service-connect-concepts-deploy.md#service-connect-concepts-proxy)를 참조하세요.

1. Amazon CloudWatch의 Service Connect 프록시를 통해 트래픽을 모니터링합니다.

## 클러스터 구성
<a name="service-connect-concepts-cluster-defaults"></a>

클러스터를 생성하거나 업데이트할 때 Service Connect의 기본 네임스페이스를 설정할 수 있습니다. 기본값으로 지정하는 네임스페이스 이름은 동일한 AWS 리전 및 계정에 있거나 동일한 AWS 리전에 있고 AWS Resource Access Manager를 사용하여 다른 AWS 계정에서 공유될 수 있습니다.

클러스터를 생성하고 기본 Service Connect 네임스페이스를 지정하면 클러스터는 Amazon ECS가 네임스페이스를 생성하는 동안 `PROVISIONING` 상태로 대기합니다. 네임스페이스의 상태를 나타내는 클러스터 상태에서 `attachment`를 볼 수 있습니다. 연결은 기본적으로 AWS CLI에 표시되지 않으므로 연결을 보려면 `--include ATTACHMENTS`를 추가해야 합니다.

AWS RAM를 사용하여 AWS 계정과 공유되는 네임스페이스를 사용하려면 클러스터 구성에서 네임스페이스의 Amazon 리소스 이름(ARN)을 지정합니다. 공유 AWS Cloud Map 스페이스에 대한 자세한 내용은 [공유 AWS Cloud Map 네임스페이스를 사용하는 Amazon ECS Service Connect](service-connect-shared-namespaces.md) 섹션을 참조하세요.

## 서비스 구성
<a name="service-connect-concepts-config"></a>

Service Connect는 최소 구성을 요구하도록 설계됩니다. 작업 정의의 Service Connect에서 사용할 각 포트 매핑의 이름을 설정해야 합니다. 서비스에서 클라이언트 서비스를 만들려면 Service Connect를 켜고 AWS 계정의 네임스페이스 또는 공유 네임스페이스를 선택해야 합니다. 클라이언트-서버 서비스를 만들려면 포트 매핑 중 하나의 이름과 일치하는 단일 Service Connect 서비스 구성을 추가해야 합니다. Amazon ECS는 작업 정의의 포트 번호와 포트 이름을 재사용하여 Service Connect 서비스와 엔드포인트를 정의합니다. 이러한 값을 재정의하려면 콘솔에서 다른 파라미터인 **Discovery**, **DNS** 및 **Port**를 사용하거나 Amazon ECS API에서 `discoveryName` 및 `clientAliases`를 각각 사용할 수 있습니다.

## 초기 상태 확인 구성
<a name="service-connect-concepts-health-check"></a>

Service Connect는 트래픽을 라우팅하기 전에 작업이 정상인지 확인합니다. 태스크가 시작되면(배포, 조정 중 또는 교체) Service Connect는 태스크 상태를 모니터링하여 트래픽을 수락할 준비가 되었는지 확인합니다. 이 동작을 활성화하려면 태스크 정의에서 필수 컨테이너에 대한 상태 확인을 정의해야 합니다.

초기 상태 확인의 동작은 태스크가 트래픽을 수락할 준비가 되었을 때 상태에 도달하는 데 발생할 수 있는 지연을 설명합니다.
+ 태스크가 `HEALTHY`인 경우 트래픽에 대해 즉시 사용할 수 있습니다.
+ 태스크 상태가 `UNKNOWN`인 경우 Service Connect는 태스크의 필수 컨테이너의 컨테이너 상태 확인 구성([상태 확인](task_definition_parameters.md#container_definition_healthcheck) 참조)을 따라 `8 minutes` 상태로 남아 있더라도 트래픽에 대해 사용 가능해지기 전에 최대 `UNKNOWN`의 제한 시간을 계산합니다.
+ 태스크가 `UNHEALTHY`인 경우, Amazon ECS는 대체 태스크를 시작할 수 있습니다. 사용 가능한 정상 태스크가 없는 경우 서비스의 구성에 따라 배포가 롤백될 수 있습니다.

Service Connect는 진행 중인 모든 트래픽에 대해 이상치 감지를 기반으로 하는 수동 상태 확인을 사용하여 트래픽을 효율적으로 라우팅합니다.

# 공유 AWS Cloud Map 네임스페이스를 사용하는 Amazon ECS Service Connect
<a name="service-connect-shared-namespaces"></a>

Amazon ECS Service Connect는 동일한 AWS 리전 내 여러 AWS 계정에서 공유 AWS Cloud Map 네임스페이스 사용을 지원합니다. 이 기능을 사용하면 다른 AWS 계정에서 실행되는 서비스가 Service Connect를 통해 서로 검색하고 통신할 수 있는 분산 애플리케이션을 생성할 수 있습니다. 공유 네임스페이스는 안전한 교차 계정 리소스 공유를 허용하는 AWS Resource Access Manager(AWS RAM)를 사용하여 관리됩니다. 공유 네임스페이스에 대한 자세한 내용은 *AWS Cloud Map 개발자 안내서*의 [Cross-account AWS Cloud Map namespace sharing](https://docs.aws.amazon.com/cloud-map/latest/dg/sharing-namespaces.html)을 참조하세요.

**중요**  
`AWSRAMPermissionCloudMapECSFullPermission` 관리형 권한을 사용하여 Service Connect가 네임스페이스와 제대로 작동하도록 네임스페이스를 공유해야 합니다.

Service Connect에서 공유 AWS Cloud Map 네임스페이스를 사용하면 여러 AWS 계정의 서비스가 동일한 서비스 네임스페이스에 참여할 수 있습니다. 이는 보안 및 격리를 유지하면서 계정 경계를 넘어 서비스 간 통신을 유지 관리해야 하는 여러 AWS 계정이 있는 조직에 특히 유용합니다.

**참고**  
여러 VPC에 있는 서비스와 통신하려면 VPC 간 연결성을 구성해야 합니다. VPC 피어링 연결을 사용하여 이 작업을 수행할 수 있습니다. 자세한 내용은 *Amazon Virtual Private Cloud VPC 피어링 가이드*의 [VPC 피어링 연결 생성](https://docs.aws.amazon.com/vpc/latest/peering/create-vpc-peering-connection.html)을 참조하세요.

# Amazon ECS Service Connect에서 공유 AWS Cloud Map 네임스페이스 사용
<a name="service-connect-shared-namespaces-setup"></a>

Service Connect에 대한 공유 AWS Cloud Map 네임스페이스 설정에는 네임스페이스 소유자가 네임스페이스 생성, AWS Resource Access Manager(AWS RAM)를 통한 소유자 공유, 소비자의 리소스 공유 수락, 공유 네임스페이스를 사용하도록 소비자의 Service Connect 구성과 같은 단계가 포함됩니다.

## 1단계: AWS Cloud Map 네임스페이스 생성
<a name="service-connect-shared-namespaces-create"></a>

네임스페이스 소유자는 다른 계정과 공유할 AWS Cloud Map 네임스페이스를 생성합니다.

**AWS Management Console을 사용하여 공유를 위한 네임스페이스를 생성하는 방법**

1. [https://console.aws.amazon.com/cloudmap/](https://console.aws.amazon.com/cloudmap/)에서 AWS Cloud Map 콘솔을 엽니다.

1. **Create namespace(네임스페이스 생성)**를 선택합니다.

1. **네임스페이스 이름**을 입력하세요. 이 이름은 모든 참여 계정의 서비스에서 사용됩니다.

1. **네임스페이스 유형**에서 사용 사례에 적합한 유형을 선택하세요.
   + **API 직접 호출** - DNS 기능이 없는 서비스 검색을 위한 HTTP 네임스페이스.
   + **VPC에서 API 직접 호출 및 DNS 쿼리** - VPC의 프라이빗 DNS 쿼리로의 서비스 검색을 위한 프라이빗 DNS 네임스페이스.
   + **API 직접 호출 및 퍼블릭 DNS 쿼리** - 퍼블릭 DNS 쿼리로의 서비스 검색을 위한 퍼블릭 DNS 네임스페이스.

1.  **Create namespace(네임스페이스 생성)**를 선택합니다.

## 2단계: AWS RAM를 사용하여 네임스페이스 공유
<a name="service-connect-shared-namespaces-share"></a>

네임스페이스 소유자는 AWS RAM를 사용하여 네임스페이스를 다른 AWS 계정과 공유합니다.

**AWS RAM 콘솔을 사용하여 네임스페이스를 공유하는 방법**

1. AWS RAM 콘솔([https://console.aws.amazon.com/ram/](https://console.aws.amazon.com/ram/))을 엽니다.

1. **리소스 공유 생성**을 선택합니다.

1. **이름**에 리소스 공유를 설명하는 이름을 입력합니다.

1. **리소스** 섹션에서 다음을 수행합니다.

   1. **리소스 유형**에서 **클라우드 맵 네임스페이스**를 선택하세요.

   1. 이전 단계에서 생성한 클러스터를 선택하세요.

1. **관리형 권한** 섹션에서 **AWSRAMPermissionCloudMapECSFullPermission**을 지정하세요.
**중요**  
`AWSRAMPermissionCloudMapECSFullPermission` 관리형 권한을 사용하여 Service Connect가 네임스페이스와 제대로 작동하도록 네임스페이스를 공유해야 합니다.

1. **위탁자** 섹션에서 네임스페이스를 공유할 AWS 계정과 지정하세요. 계정 ID 또는 조직 단위 ID를 입력할 수 있습니다.

1. **리소스 공유 생성**을 선택합니다.

## 3단계: 리소스 공유 수락
<a name="service-connect-shared-namespaces-accept"></a>

네임스페이스 소비자 계정은 공유 네임스페이스를 사용하려면 리소스 공유 초대를 수락해야 합니다.

**AWS RAM 콘솔을 사용하여 리소스 공유 초대를 수락하는 방법**

1. 소비자 계정에서 AWS RAM 콘솔([https://console.aws.amazon.com/ram/](https://console.aws.amazon.com/ram/))을 여세요.

1. 탐색 창에서 **나와 공유됨**, **리소스 공유**를 선택하세요.

1. 리소스 공유 초대를 선택하고 **리소스 공유 수락**을 선택하세요.

1. 수락한 후 리소스 세부 정보에서 공유 네임스페이스 ARN을 기록하세요. Service Connect 서비스를 구성할 때 이 ARN을 사용합니다.

## 4단계: 공유 네임스페이스를 사용하여 Amazon ECS 서비스 구성
<a name="service-connect-shared-namespaces-configure"></a>

공유 네임스페이스를 수락한 후 네임스페이스 소비자는 공유 네임스페이스를 사용하도록 Amazon ECS 서비스를 구성할 수 있습니다. 구성은 일반 네임스페이스를 사용하는 방식과 비슷하지만 이름 대신 네임스페이스 ARN을 지정해야 합니다. 자세한 서비스 생성 절차는 [Amazon ECS 롤링 업데이트 배포 생성](create-service-console-v2.md) 섹션을 참조하세요.

**AWS Management Console을 사용하여 공유 네임스페이스가 있는 서비스를 생성하는 방법**

1. [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)에서 콘솔을 엽니다.

1. **클러스터** 페이지에서 서비스를 생성하려는 클러스터를 선택하세요.

1. **서비스**에서 **생성**을 선택하세요.

1. 워크로드에 따라 다른 세부 정보를 입력한 후 **Service Connect** 섹션에서 **Service Connect 사용**을 선택하세요.

1. **네임스페이스**에 공유 네임스페이스의 전체 ARN을 입력하세요.

   ARN 형식은 `arn:aws:servicediscovery:region:account-id:namespace/namespace-id`입니다.

1. 서비스 유형(클라이언트 또는 클라이언트-서버)에 따라 나머지 Service Connect 설정을 구성하세요.

1. 서비스 생성 프로세스를 완료하세요.

`serviceConnectConfiguration`의 `namespace` 파라미터에 공유 네임스페이스 ARN을 지정하여 AWS CLI 또는 AWS SDK를 사용하여 서비스를 구성할 수도 있습니다.

```
aws ecs create-service \
    --cluster my-cluster \
    --service-name my-service \
    --task-definition my-task-def \
    --service-connect-configuration '{
        "enabled": true,
        "namespace": "arn:aws:servicediscovery:us-west-2:123456789012:namespace/ns-abcdef1234567890",
        "services": [{
            "portName": "web",
            "discoveryName": "my-service",
            "clientAliases": [{
                "port": 80,
                "dnsName": "my-service"
            }]
        }]
    }'
```

## 고려 사항
<a name="service-connect-shared-namespaces-considerations"></a>

Service Connect에서 AWS Cloud Map 네임스페이스를 사용하는 경우 다음을 고려합니다.
+ AWS RAM는 공유 네임스페이스를 사용하려는 AWS 리전에서 사용할 수 있어야 합니다.
+ 네임스페이스는 Amazon ECS 서비스 및 클러스터와 같은 AWS 리전에 있어야 합니다.
+ 공유 네임스페이스로 Service Connect를 구성할 경우 ID가 아닌 네임스페이스 ARN을 사용해야 합니다.
+ HTTP, 프라이빗 DNS, 퍼블릭 DNS 네임스페이스와 같은 모든 네임스페이스 유형이 지원됩니다.
+ 공유 네임스페이스에 대한 액세스가 취소되면 네임스페이스(예: `CreateService`, `UpdateService`, `ListServicesByNamespace`)와의 상호 작용이 필요한 Amazon ECS 작업이 실패합니다. 공유 네임스페이스의 권한 문제 해결에 대한 자세한 내용은 [공유 AWS Cloud Map 네임스페이스를 사용한 Amazon ECS Service Connect 문제 해결](service-connect-shared-namespaces-troubleshooting.md) 섹션을 참조하세요.
+ 공유 프라이빗 DNS 네임스페이스에서 DNS 쿼리를 사용하는 서비스 검색의 경우:
  + 네임스페이스 소유자는 네임스페이스와 연결된 프라이빗 호스팅 영역의 ID와 소비자의 VPC를 사용하여 `create-vpc-association-authorization`을 직접 호출해야 합니다.

    ```
    aws route53 create-vpc-association-authorization --hosted-zone-id Z1234567890ABC --vpc VPCRegion=us-east-1,VPCId=vpc-12345678
    ```
  + 네임스페이스 소비자는 프라이빗 호스팅 영역의 ID를 사용하여 `associate-vpc-with-hosted-zone`을 직접 호출해야 합니다.

    ```
    aws route53 associate-vpc-with-hosted-zone --hosted-zone-id Z1234567890ABC --vpc VPCRegion=us-east-1,VPCId=vpc-12345678
    ```
+ 네임스페이스 소유자만 리소스 공유를 관리할 수 있습니다.
+ 네임스페이스 소비자는 공유 네임스페이스 내에서 서비스를 생성하고 관리할 수 있지만 네임스페이스 자체는 수정할 수 없습니다.
+ 검색 이름은 서비스를 생성하는 계정에 관계없이 공유 네임스페이스 내에서 고유해야 합니다.
+ 공유 네임스페이스의 서비스는 네임스페이스에 액세스하는 다른 AWS 계정에서 서비스를 검색하고 연결할 수 있습니다.
+ Service Connect에 대한 TLS를 활성화하고 공유 네임스페이스를 사용하는 경우 AWS Private CA 인증 기관(CA)의 범위가 네임스페이스로 지정됩니다. 공유 네임스페이스에 대한 액세스가 취소되면 CA에 대한 액세스가 중지됩니다.
+ 공유 네임스페이스로 작업할 때 네임스페이스 소유자와 소비자는 기본적으로 교차 계정 Amazon CloudWatch 지표에 액세스할 수 없습니다. 대상 지표는 클라이언트 서비스를 소유한 계정에만 게시됩니다. 클라이언트 서비스를 소유한 계정은 클라이언트-서버 서비스를 소유한 계정에서 수신한 지표에 액세스할 수 없으며 반대도 마찬가지입니다. 지표에 대한 교차 계정 액세스를 허용하려면 CloudWatch 교차 계정 관찰성을 설정합니다. 자세한 내용은 *Amazon CloudWatch 사용 설명서*의 [CloudWatch 크로스 계정 관찰성](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Unified-Cross-Account.html)을 참조하세요. Service Connect용 CloudWatch 지표에 대한 자세한 내용은 [Amazon ECS CloudWatch 지표](available-metrics.md) 섹션을 참조하세요.

# 공유 AWS Cloud Map 네임스페이스를 사용한 Amazon ECS Service Connect 문제 해결
<a name="service-connect-shared-namespaces-troubleshooting"></a>

다음 정보를 활용하여 공유 AWS Cloud Map 네임스페이스 및 Service Connect 관련 문제를 해결합니다. 오류 메시지 찾기에 대한 자세한 내용은 [Amazon ECS 문제 해결](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/troubleshooting.html)을 참조하세요.

권한 누락으로 인해 또는 네임스페이스에 대한 액세스가 취소된 경우 권한 문제와 관련된 오류 메시지가 나타납니다.

**중요**  
`AWSRAMPermissionCloudMapECSFullPermission` 관리형 권한을 사용하여 Service Connect가 네임스페이스와 제대로 작동하도록 네임스페이스를 공유해야 합니다.

오류 메시지는 다음 형식 중 하나로 표시됩니다.

An error occurred (ClientException) when calling the <OperationName> operation: User: arn:aws:iam::<account-id>:user/<user-name> is not authorized to perform: <ActionName> on resource: <ResourceArn> because no resource-based policy allows the <ActionName> action

다음 시나리오에서는 이 형식으로 오류 메시지가 표시됩니다.

**클러스터 생성 또는 업데이트 장애**  
이러한 문제는 `CreateCluster` 또는 `UpdateCluster`와 같은 Amazon ECS 작업이 AWS Cloud Map 권한 누락으로 인해 실패할 경우 발생합니다. 이 작업에는 다음 AWS Cloud Map 작업에 대한 권한이 필요합니다.  
+ `servicediscovery:GetNamespace`
리소스 공유 초대가 소비자 계정에서 수락되었고 Service Connect 구성에서 올바른 네임스페이스 ARN이 사용되고 있는지 확인합니다.

**서비스 생성 또는 업데이트 장애**  
이러한 문제는 `CreateService` 또는 `UpdateService`와 같은 Amazon ECS 작업이 AWS Cloud Map 권한 누락으로 인해 실패할 경우 발생합니다. 이 작업에는 다음 AWS Cloud Map 작업에 대한 권한이 필요합니다.  
+ `servicediscovery:CreateService`
+ `servicediscovery:GetNamespace`
+ `servicediscovery:GetOperation`(새 AWS Cloud Map 서비스를 생성하는 경우)
+ `servicediscovery:GetService`(AWS Cloud Map 서비스가 이미 있는 경우)
리소스 공유 초대가 소비자 계정에서 수락되었고 Service Connect 구성에서 올바른 네임스페이스 ARN이 사용되고 있는지 확인합니다.

**`ListServicesByNamespace` 작업 실패**  
이 문제는 Amazon ECS `ListServicesByNamespace` 작업이 실패할 때 발생합니다. 이 작업에는 다음 AWS Cloud Map 작업에 대한 권한이 필요합니다.  
+ `servicediscovery:GetNamespace`
이 문제를 해결하려면:  
+ 소비자 계정에 `servicediscovery:GetNamespace` 권한이 있는지 확인합니다.
+ API를 직접 호출할 때 이름이 아닌 네임스페이스 ARN을 사용합니다.
+ 리소스 공유가 활성 상태이고 초대가 수락되었는지 확인합니다.

User: <iam-user> is not authorized to perform: <ActionName> on resource: <ResourceArn> with an explicit deny in an identity-based policy.

다음 시나리오에서는 이 형식으로 오류 메시지가 표시됩니다.

**서비스 삭제에 실패하고 `DRAINING` 상태로 멈춤**  
이 문제는 네임스페이스에 대한 액세스가 취소될 때 누락된 `servicediscovery:DeleteService` 권한으로 인해 Amazon ECS `DeleteService` 작업이 실패한 경우 발생합니다. 서비스는 처음에는 삭제에 성공한 것처럼 보일 수 있지만 `DRAINING` 상태에서 멈춥니다. 오류 메시지는 Amazon ECS 서비스 이벤트로 표시됩니다.  
이 문제를 해결하려면 네임스페이스 소유자가 네임스페이스를 소비자 계정과 공유하여 서비스 삭제를 완료해야 합니다.

**서비스의 태스크가 실행되지 않음**  
이 문제는 누락된 권한으로 인해 태스크가 시작되지 않은 경우 발생합니다. 오류 메시지는 중지된 태스크 오류로 표시됩니다. 자세한 내용은 [Amazon ECS 중지된 작업 오류 해결](resolve-stopped-errors.md) 섹션을 참조하세요.  
태스크를 실행하려면 다음 AWS Cloud Map 작업이 필요합니다.  
+ `servicediscovery:GetOperation`
+ `servicediscovery:RegisterInstance`
소비자 계정에 필요한 권한이 있고 공유 네임스페이스에 액세스할 수 있는지 확인합니다.

**작업이 완전히 중지되지 않거나 `DEACTIVATING` 또는 `DEPROVISIONING` 상태에서 멈춤**  
이 문제는 권한 누락으로 인해 종료 중 태스크가 AWS Cloud Map 서비스에서 등록 취소되지 않는 경우 발생합니다. 오류는 태스크 연결에서 `DescribeTasks` API를 사용하여 검색할 수 있는 `statusReason`으로 표시됩니다. 자세한 내용은 *Amazon Elastic Container Service API 참조*의 [DescribeTasks](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DescribeTasks.html)를 참조하세요.  
태스크를 중지하려면 다음 AWS Cloud Map 작업이 필요합니다.  
+ `servicediscovery:DeregisterInstance`
+ `servicediscovery:GetOperation`
공유 네임스페이스에 대한 액세스가 취소되면 네임스페이스 액세스가 복원될 때까지 태스크가 `DEACTIVATING` 또는 `DEPROVISIONING` 상태로 유지될 수 있습니다. 네임스페이스 소유자에게 네임스페이스에 대한 액세스를 복원하도록 요청합니다.

# Amazon ECS Service Connect 액세스 로그
<a name="service-connect-envoy-access-logs"></a>

Amazon ECS Service Connect는 Service Connect 프록시에서 처리하는 개별 요청에 대한 자세한 원격 측정을 제공하도록 액세스 로그를 지원합니다. 액세스 로그는 HTTP 메서드, 경로, 응답 코드, 플래그 및 타이밍 정보와 같은 요청당 트래픽 메타데이터를 캡처하여 기존 애플리케이션 로그를 보완합니다. 이를 통해 효과적인 문제 해결 및 모니터링을 위해 요청 수준 트래픽 패턴 및 서비스 상호 작용을 심층적으로 관찰할 수 있습니다.

액세스 로그를 활성화하려면 `serviceConnectConfiguration` 객체에서 `logConfiguration` 및 `accessLogConfiguration` 객체를 모두 지정합니다. 로그의 형식 및 로그가 `accessLogConfiguration`에 쿼리 파라미터를 포함해야 하는지를 구성할 수 있습니다. 로그는 `logConfiguration`에 지정된 로그 드라이버에 의해 대상 로그 그룹으로 전달됩니다.

```
{
    "serviceConnectConfiguration": {
        "enabled": true,
        "namespace": "myapp.namespace",
        "services": [
            ...
        ],
        "logConfiguration": {
            "logDriver": "awslogs",
            "options": {
                "awslogs-group": "my-envoy-log-group",
                "awslogs-region": "us-west-2",
                "awslogs-stream-prefix": "myapp-envoy-logs"
            }
        },
         "accessLogConfiguration": {
            "format": "TEXT",
            "includeQueryParameters": "ENABLED" 
        }
    }
}
```

## 고려 사항
<a name="service-connect-envoy-access-logs-considerations"></a>

액세스 로그에 대한 액세스를 활성화할 경우 다음 사항을 고려합니다.
+ 액세스 로그와 애플리케이션 로그는 모두 `/dev/stdout`에 기록됩니다. 액세스 로그를 애플리케이션 로그와 분리하려면 `awsfirelens` 로그 드라이버를 사용자 지정 Fluent Bit 또는 Fluentd 구성과 함께 사용하는 것이 좋습니다.
+  `awslogs` 로그 드라이버를 사용하여 애플리케이션 및 액세스 로그를 동일한 CloudWatch 대상으로 전송하는 것이 좋습니다.
+ 액세스 로그는 플랫폼 버전 `1.4.0` 이상을 사용하는 Fargate 서비스에서 지원됩니다.
+ 요청 ID 및 토큰과 같은 쿼리 파라미터는 기본적으로 액세스 로그에서 제외됩니다. 액세스 로그에 쿼리 파라미터를 포함하려면 `includeQueryParameters`를 `"ENABLED"`로 설정합니다.

## 액세스 로그 형식
<a name="service-connect-envoy-access-logs-formats"></a>

액세스 로그는 JSON 형식 사전 또는 텍스트 형식 문자열로 형식을 지정할 수 있습니다. 이 경우 여러 유형의 액세스 로그에 대해 지원되는 명령 연산자에 차이가 있습니다.

### HTTP 액세스 로그
<a name="service-connect-envoy-access-logs-formats-http"></a>

HTTP 로그에는 기본적으로 다음 명령 연산자가 포함됩니다.

------
#### [ Text ]

```
[%START_TIME%] "%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%"
%RESPONSE_CODE% %BYTES_RECEIVED% %BYTES_SENT% %DURATION%
%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% "%REQ(X-FORWARDED-FOR)%" "%REQ(USER-AGENT)%"
"%REQ(X-REQUEST-ID)%" "%REQ(:AUTHORITY)%" "%UPSTREAM_HOST%"\n
```

------
#### [ JSON ]

```
{
  "start_time": "%START_TIME%",
  "method": "%REQ(:METHOD)%",
  "path": "%REQ(X-ENVOY-ORIGINAL-PATH?:PATH)%",
  "protocol": "%PROTOCOL%",
  "response_code": "%RESPONSE_CODE%",
  "bytes_received": "%BYTES_RECEIVED%",
  "bytes_sent": "%BYTES_SENT%",
  "duration_ms": "%DURATION%",
  "upstream_service_time": "%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)%",
  "forwarded_for": "%REQ(X-FORWARDED-FOR)%",
  "user_agent": "%REQ(USER-AGENT)%",
  "request_id": "%REQ(X-REQUEST-ID)%",
  "authority": "%REQ(:AUTHORITY)%",
  "upstream_host": "%UPSTREAM_HOST%"
}
```

------

### HTTP2 액세스 로그
<a name="service-connect-envoy-access-logs-formats-http2"></a>

HTTP 로그에 포함된 명령 연산자 외에도 HTTP2 로그에는 기본적으로 `%STREAM_ID%` 연산자가 포함됩니다.

------
#### [ Text ]

```
[%START_TIME%] "%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%"
%RESPONSE_CODE% %BYTES_RECEIVED% %BYTES_SENT% %DURATION%
%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% "%REQ(X-FORWARDED-FOR)%" "%REQ(USER-AGENT)%"
"%REQ(X-REQUEST-ID)%" "%REQ(:AUTHORITY)%" "%UPSTREAM_HOST%" "%STREAM_ID%"\n
```

------
#### [ JSON ]

```
{
  "start_time": "%START_TIME%",
  "method": "%REQ(:METHOD)%",
  "path": "%REQ(X-ENVOY-ORIGINAL-PATH?:PATH)%",
  "protocol": "%PROTOCOL%",
  "response_code": "%RESPONSE_CODE%",
  "bytes_received": "%BYTES_RECEIVED%",
  "bytes_sent": "%BYTES_SENT%",
  "duration": "%DURATION%",
  "upstream_service_time": "%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)%",
  "forwarded_for": "%REQ(X-FORWARDED-FOR)%",
  "user_agent": "%REQ(USER-AGENT)%",
  "request_id": "%REQ(X-REQUEST-ID)%",
  "authority": "%REQ(:AUTHORITY)%",
  "upstream_host": "%UPSTREAM_HOST%",
  "stream_id": "%STREAM_ID%"
}
```

------

### gRPC 액세스 로그
<a name="service-connect-envoy-access-logs-formats-grpc"></a>

HTTP 로그에 포함된 명령 연산자 외에도 gRPC 로그에는 기본적으로 `%STREAM_ID%` 및 `%GRPC_STATUS()%`연산자가 포함됩니다.

------
#### [ Text ]

```
[%START_TIME%] "%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%"
%RESPONSE_CODE% %GRPC_STATUS()% %BYTES_RECEIVED% %BYTES_SENT% %DURATION%
%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% "%REQ(X-FORWARDED-FOR)%" "%REQ(USER-AGENT)%"
"%REQ(X-REQUEST-ID)%" "%REQ(:AUTHORITY)%" "%UPSTREAM_HOST%" "%STREAM_ID%"\n
```

------
#### [ JSON ]

```
{
  "start_time": "%START_TIME%",
  "method": "%REQ(:METHOD)%",
  "path": "%REQ(X-ENVOY-ORIGINAL-PATH?:PATH)%",
  "protocol": "%PROTOCOL%",
  "response_code": "%RESPONSE_CODE%",
  "grpc_status": "%GRPC_STATUS()%",
  "bytes_received": "%BYTES_RECEIVED%",
  "bytes_sent": "%BYTES_SENT%",
  "duration": "%DURATION%",
  "upstream_service_time": "%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)%",
  "forwarded_for": "%REQ(X-FORWARDED-FOR)%",
  "user_agent": "%REQ(USER-AGENT)%",
  "request_id": "%REQ(X-REQUEST-ID)%",
  "authority": "%REQ(:AUTHORITY)%",
  "upstream_host": "%UPSTREAM_HOST%",
  "stream_id": "%STREAM_ID%"
}
```

------

### TCP 액세스 로그
<a name="service-connect-envoy-access-logs-formats-tcp"></a>

다음 명령 연산자는 기본적으로 TCP 액세스 로그에 포함됩니다.

------
#### [ Text ]

```
[%START_TIME%] %DOWNSTREAM_REMOTE_ADDRESS% %DOWNSTREAM_REMOTE_PORT% 
%BYTES_RECEIVED% %BYTES_SENT% %DURATION%  
%CONNECTION_TERMINATION_DETAILS% %CONNECTION_ID%\n
```

------
#### [ JSON ]

```
{
  "start_time": "%START_TIME%",
  "downstream_remote_address": "%DOWNSTREAM_REMOTE_ADDRESS%",
  "downstream_remote_port": "%DOWNSTREAM_REMOTE_PORT%",s
  "bytes_received": "%BYTES_RECEIVED%",
  "bytes_sent": "%BYTES_SENT%",
  "duration": "%DURATION%",
  "connection_termination_details": "%CONNECTION_TERMINATION_DETAILS%",
  "connection_id": %CONNECTION_ID%
}
```

------

이러한 명령 연산자에 대한 자세한 내용은 Envoy 설명서의 [Command Operators](https://www.envoyproxy.io/docs/envoy/latest/configuration/observability/access_log/usage#command-operators)를 참조하세요.

# Amazon ECS Service Connect에 대한 액세스 로그 활성화
<a name="service-connect-access-logs-configuration"></a>

액세스 로그는 Service Connect를 사용하는 Amazon ECS 서비스에서 기본적으로 활성화되지 않습니다. 다음 방법으로 로그에 액세스할 수 있습니다.

## AWS CLI를 사용하여 액세스 로그 활성화
<a name="service-connect-access-logs-configure-cli"></a>

다음 명령은 서비스를 생성할 때 `accessLogConfiguration`을 지정하여 AWS CLI로 Amazon ECS 서비스에 대한 액세스 로그를 활성화하는 방법을 보여줍니다.

```
aws ecs create-service \
    --cluster my-cluster \
    --service-name my-service \
    --task-definition my-task-def \
    --service-connect-configuration '{
        "enabled": true,
        "namespace": "arn:aws:servicediscovery:us-west-2:123456789012:namespace/ns-abcdef1234567890",
        "services": [{
            "portName": "web",
            "discoveryName": "my-service",
            "clientAliases": [{
                "port": 80,
                "dnsName": "my-service"
            }]
        }],
        "logConfiguration": {
            "logDriver": "awslogs",
            "options": {
                "awslogs-group": "my-envoy-log-group",
                "awslogs-region": "us-west-2",
                "awslogs-stream-prefix": "myapp-envoy-logs"
            }
        },
         "accessLogConfiguration": {
            "format": "TEXT",
            "includeQueryParameters": "ENABLED" 
        }
    }'
```

## 콘솔을 사용하여 액세스 로그 활성화
<a name="service-connect-access-logs-configure-console"></a>

자세한 서비스 생성 절차는 [Amazon ECS 롤링 업데이트 배포 생성](create-service-console-v2.md) 섹션을 참조하세요.

**AWS Management Console을 사용하여 공유 네임스페이스가 있는 서비스를 생성하는 방법**

1. [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)에서 콘솔을 엽니다.

1. **클러스터** 페이지에서 서비스를 생성하려는 클러스터를 선택하세요.

1. **서비스**에서 **생성**을 선택하세요.

1. 워크로드에 따라 다른 세부 정보를 입력한 후 **Service Connect** 섹션에서 **Service Connect 사용**을 선택하세요.

1. 서비스 유형(클라이언트 또는 클라이언트-서버)에 따라 Service Connect 설정을 구성하세요.

1. **액세스 로그 구성**을 확장하세요. **형식**에서 **JSON** 또는 `TEXT`를 선택하세요.

1. 액세스 로그에 쿼리 파라미터를 포함하려면 **쿼리 파라미터 포함**을 선택하세요.

1. 서비스 생성 프로세스를 완료하세요.

# Amazon ECS Service Connect 트래픽 암호화
<a name="service-connect-tls"></a>

Amazon ECS Service Connect는 Amazon ECS 서비스에 대해 Transport Layer Security(TLS) 인증서를 사용한 자동 트래픽 암호화를 지원합니다. Amazon ECS 서비스에서 [AWS Private Certificate Authority(AWS Private CA)](https://docs.aws.amazon.com/privateca/latest/userguide/PcaWelcome.html)를 가리키면 Amazon ECS는 자동으로 TLS 인증서를 프로비저닝하여 Amazon ECS Service Connect 서비스 사이에서 트래픽을 암호화합니다. Amazon ECS는 트래픽 암호화에 사용되는 TLS 인증서를 생성, 교체 및 분산합니다.

Service Connect를 사용하는 자동 트래픽 암호화는 업계 최고의 암호화 기능을 사용하여 보안 요구 사항을 충족할 수 있도록 서비스 간 통신을 보호합니다. `256-bit ECDSA` 및 `2048-bit RSA` 암호화를 사용하는 AWS Private Certificate Authority TLS 인증서를 지원합니다. 또한 규정 준수 요구 사항을 충족할 수 있도록 프라이빗 인증서 및 서명 키를 완벽하게 제어합니다. 기본적으로 TLS 1.3은 지원되지만 TLS 1.0\$11.2는 지원되지 않습니다. 서비스 연결은 다음 암호와 함께 TLS 1.3을 지원합니다.
+ `TLS_AES_128_GCM_SHA256`
+ `TLS_AES_256_GCM_SHA384`
+ `TLS_CHACHA20_POLY1305_SHA256`

**참고**  
TLS 1.3을 사용하려면 이를 대상의 리스너에서도 활성화해야 합니다.  
Amazon ECS 에이전트를 통과하는 인바운드 및 아웃바운드 트래픽만 암호화됩니다.

## Service Connect 및 Application Load Balancer 상태 확인
<a name="service-connect-tls-alb-healthchecks"></a>

Application Load Balancer 상태 확인 및 TLS 1.3 암호화와 함께 Service Connect를 사용할 수 있습니다.

### Application Load Balancer 구성
<a name="service-connect-tls-alb-config"></a>

다음 설정을 사용하여 Application Load Balancer를 구성합니다.
+ TLS 1.3 보안 정책(예: `ELBSecurityPolicy-TLS13-1-2-2021-06`)을 사용하여 TLS 리스너를 구성합니다. 자세한 내용은 [Security policies for your Application Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/describe-ssl-policies.html)를 참조하세요.
+ 다음 설정을 사용하여 대상 그룹을 생성합니다.
  + 프로토콜을 HTTPS로 설정
  + 대상 그룹을 TLS 리스너에 연결
  + Service Connect 서비스의 컨테이너 포트와 일치하도록 상태 확인 포트 구성

### Service Connect 구성
<a name="service-connect-tls-sc-config"></a>

다음 설정을 사용하여 서비스를 구성합니다.
+ `bridge` 네트워크 모드는 지원되지 않으므로 `awsvpc` 네트워크 모드를 사용하도록 서비스를 구성합니다.
+ 서비스에 Service Connect를 활성화합니다.
+ 다음 설정을 사용하여 로드 밸런서 구성을 설정합니다.
  + Application Load Balancer에 구성한 대상 그룹 지정
  + Service Connect TLS 서비스의 컨테이너 포트와 일치하도록 컨테이너 포트 설정
+ 서비스에 `ingressPortOverride`를 설정하지 마세요. 자세한 내용은 *Amazon Elastic Container Service API 참조*의 [ServiceConnectService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ServiceConnectService.html)를 참조하세요.

### 고려 사항
<a name="service-connect-tls-alb-considerations"></a>

Application Load Balancer, TLS 및 Service Connect를 사용할 때는 다음 사항을 고려하세요.
+ Service Connect를 TLS 암호화와 함께 사용하는 경우 HTTPS 상태 확인에 `bridge` 네트워크 모드 대신 `awsvpc` 네트워크 모드를 사용합니다. HTTP 상태 확인은 `bridge` 모드에서 계속 작동합니다.
+ 대상 그룹 상태 확인 포트를 기본 HTTPS 포트(443)가 아닌 Service Connect 서비스의 컨테이너 포트와 일치하도록 구성합니다.

## AWS Private Certificate Authority 인증서 및 Service Connect
<a name="service-connect-tls-certificates"></a>

인프라 IAM 역할이 있어야 합니다. 이 역할에 대한 자세한 내용은 [Amazon ECS 인프라 IAM 역할](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/infrastructure_IAM_role.html                     )을 참조하세요.

**Service Connect에 대한 AWS Private Certificate Authority 모드**

AWS Private Certificate Authority는 범용 모드와 단기 모드와 같은 두 가지 모드로 실행할 수 있습니다.
+ 범용 - 만료 날짜를 포함하여 구성할 수 있는 인증서.
+ 단기 - 최대 유효 기간이 7일인 인증서.

Amazon ECS는 두 모드를 모두 지원하지만 단기 인증서를 사용하는 것이 좋습니다. 기본적으로 인증서는 5일마다 교체되며, 단기 모드로 실행할 경우 범용 모드에 비해 비용을 크게 절감할 수 있습니다.

Service Connect는 인증서 해지를 지원하지 않으며, 대신 인증서 교체가 잦은 단기 인증서를 활용합니다. [Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html)에서 [관리형 교체](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotate-secrets_managed.html)를 사용하여 교체 빈도를 수정하거나 보안 암호를 비활성화 또는 삭제할 수 있는 권한을 보유하지만, 이 경우 다음과 같은 결과가 발생할 수 있습니다.
+ 더 짧은 교체 빈도 - 교체 빈도가 짧을수록 AWS Private CA, AWS KMS, Secrets Manager와 Auto Scaling에서 교체 워크로드가 증가하기 때문에 비용이 증가합니다.
+ 더 긴 교체 빈도 - 교체 빈도가 **7**일을 초과하면 애플리케이션 통신이 실패합니다.
+ 보안 암호 삭제 - 보안 암호를 삭제하면 교체에 실패하고 고객 애플리케이션 통신에 영향을 미칩니다.

보안 암호 교체에 실패하는 경우 `RotationFailed` 이벤트가 [AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html)에 게시됩니다. `RotationFailed`에 대한 [CloudWatch 경보](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html)를 설정할 수도 있습니다.

**중요**  
보안 암호에 복제 리전을 추가하지 마세요. 이렇게 하면 Amazon ECS는 복제에서 리전을 제거할 수 있는 권한이 없으므로 Amazon ECS가 보안 암호를 삭제할 수 없습니다. 이미 복제를 추가한 경우 다음 명령을 실행합니다.  

```
aws secretsmanager remove-regions-from-replication \
 --secret-id SecretId \
 --remove-replica-regions region-name
```

**하위 인증 기관**  
AWS Private CA, 루트 또는 하위 항목을 Service Connect TLS로 가져와 서비스에 대한 최종 엔터티 인증서를 발급할 수 있습니다. 제공된 발행자는 어디서나 서명자 및 신뢰 루트로 처리됩니다. 서로 다른 하위 CA에서 애플리케이션의 여러 부분에 대한 최종 엔터티 인증서를 발급할 수 있습니다. AWS CLI를 사용하는 경우 CA의 Amazon 리소스 이름(ARN)을 제공하여 신뢰 체인을 설정합니다.

**온프레미스 인증 기관**  
온프레미스 CA를 사용하려면 AWS Private Certificate Authority에서 하위 CA를 생성하고 구성합니다. 이렇게 하면 Amazon ECS 워크로드용으로 발급된 모든 TLS 인증서가 온프레미스에서 실행하는 워크로드와 신뢰 체인을 공유하고 안전하게 연결할 수 있습니다.

**중요**  
AWS Private CA에서 **필수** 태그 `AmazonECSManaged : true`를 추가합니다.

**코드형 인프라**  
코드형 인프라(IaC) 도구와 함께 Service Connect TLS를 사용할 때 서비스가 드레이닝 상태로 멈추는 등의 문제가 발생하지 않도록 종속성을 올바르게 구성하는 것이 중요합니다. Amazon ECS 서비스 이후에 AWS KMS 키(제공된 경우), IAM 역할 및 AWS Private CA 종속성을 삭제해야 합니다.

Service Connect에 사용되는 네임스페이스가 공유 네임스페이스인 경우 공유 AWS Private CA 리소스를 사용하도록 선택할 수 있습니다. 자세한 내용은 *AWS Private Certificate Authority 사용 설명서*의 [Attach a policy for cross-account access](https://docs.aws.amazon.com/privateca/latest/userguide/pca-ram.html)를 참조하세요.

## Service Connect 및 Secrets Manager
<a name="service-connect-asm"></a>

**Amazon ECS Service Connect를 TLS 암호화와 함께 사용하는 경우 서비스는 다음과 같은 방식으로 Secrets Manager와 상호 작용합니다.**  
Service Connect에서는 제공된 인프라 역할을 활용하여 Secrets Manager 내에 보안 암호를 생성합니다. 이러한 보안 암호는 Service Connect 서비스 간 트래픽 암호화를 위해 TLS 인증서에 연결된 프라이빗 키를 저장하는 데 사용됩니다.

**주의**  
Service Connect를 통한 이러한 보안 암호의 자동 생성 및 관리는 서비스에 TLS 암호화를 구현하는 프로세스를 간소화합니다. 그러나 보안에 미치는 잠재적인 영향을 인식하는 것이 중요합니다. Secrets Manager에 대한 읽기 액세스 권한이 있는 다른 IAM 역할에서는 자동으로 생성된 이러한 보안 암호에 액세스할 수 있습니다. 그러면 액세스 제어가 제대로 구성되지 않은 경우 민감한 암호화 자료가 권한이 없는 당사자에게 노출될 수 있습니다.  
이 위험을 완화하려면 다음과 같은 모범 사례를 따릅니다.  
특히 Service Connect에서 생성된 보안 암호의 경우 Secrets Manager에 대한 액세스 권한을 신중하게 관리하고 제한합니다.
최소 권한의 원칙이 유지되도록 IAM 역할 및 권한을 정기적으로 감사합니다.

Secrets Manager에 대한 읽기 액세스 권한을 부여할 때는 Service Connect에서 생성된 TLS 프라이빗 키를 제외하는 것이 좋습니다. IAM 정책의 조건을 사용하여 패턴과 일치하는 ARN이 있는 보안 암호를 제외하여 이렇게 할 수 있습니다.

```
"arn:aws:secretsmanager:::secret:ecs-sc!"
```

`ecs-sc!` 접두사가 있는 모든 보안 암호에 대한 `GetSecretValue` 작업을 거부하는 IAM 정책의 예:

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Action": "secretsmanager:GetSecretValue",
            "Resource": "arn:aws:secretsmanager:*:*:secret:ecs-sc!*"
        }
    ]
}
```

------

**참고**  
이는 일반적인 예이며 구체적인 사용 사례 및 AWS 계정 구성에 따라 조정하는 것이 좋습니다. 항상 IAM 정책을 철저히 테스트하여 보안 유지 관리되면서 의도한 액세스 권한이 제공되는지 확인합니다.

Service Connect가 Secrets Manager와 상호 작용하는 방식을 이해하면 Amazon ECS 서비스의 보안을 더 잘 관리하는 동시에 자동 TLS 암호화의 이점을 활용할 수 있습니다.

## Service Connect 및 AWS Key Management Service
<a name="service-connect-kms"></a>

[AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html)를 사용하여 Service Connect 리소스를 암호화하고 해독할 수 있습니다. AWS KMS는 데이터를 보호하는 암호화 키를 만들고 관리할 수 있는 AWS 관리형 서비스입니다.

Service Connect에서 AWS KMS를 사용할 경우 사용자를 대신해 AWS에서 관리하는 AWS 소유 키를 사용하거나 기존 AWS KMS 키를 선택할 수 있습니다. 사용할 [새 AWS KMS 키를 생성](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html#create-symmetric-cmk)할 수도 있습니다.

**자체 암호화 키 제공**  
자체 키 자료를 제공할 수도 있고, AWS Key Management Service를 통해 외부 키 저장소를 사용할 수 있습니다. 자체 키를 AWS KMS에 가져오고 Amazon ECS Service Connect에서 해당 키의 Amazon 리소스 이름(ARN)을 지정합니다.

다음은 예제 AWS KMS 정책입니다. 모든 *사용자 입력*을 고유한 값으로 바꿉니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "id",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:role/role-name"
      },
      "Action": [
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:GenerateDataKey",
        "kms:GenerateDataKeyPair"
      ],
      "Resource": "*"
    }
  ]
}
```

------

키 정책을 생성하는 방법에 대한 자세한 내용은 *AWS Key Management Service 개발자 안내서*의 [Creating a key policy](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-overview.html)를 참조하세요.

**참고**  
Service Connect는 대칭 암호화 AWS KMS 키만 지원합니다. 다른 유형의 AWS KMS 키를 사용하여 Service Connect 리소스를 암호화할 수 없습니다. AWS KMS 키가 대칭 암호화 키인지 확인하는 것과 관련된 도움말은 [비대칭 KMS 키 식별](https://docs.aws.amazon.com/kms/latest/developerguide/identify-key-types.html#identify-asymm-keys)을 참조하세요.

AWS Key Management Service 대칭 암호화 키에 대한 자세한 내용은 *AWS Key Management Service 개발자 안내서*의 [Symmetric encryption AWS KMS keys](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#symmetric-cmks)를 참조하세요.

# Amazon ECS Service Connect에 대한 TLS 활성화
<a name="enable-service-connect-tls"></a>

Service Connect 서비스를 생성하거나 업데이트할 때 트래픽 암호화를 활성화합니다.

**AWS Management Console을 사용하여 기존 네임스페이스에서 서비스의 트래픽 암호화를 활성화하는 방법**

1. 인프라 IAM 역할이 있어야 합니다. 이 역할에 대한 자세한 내용은 [Amazon ECS 인프라 IAM 역할](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/infrastructure_IAM_role.html                     )을 참조하세요.

1. [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)에서 콘솔을 엽니다.

1. 탐색 창에서 **네임스페이스**를 선택합니다.

1. 트래픽 암호화를 활성화하려는 **서비스**가 포함된 **네임스페이스**를 선택합니다.

1. 트래픽 암호화를 활성화하려는 **서비스**를 선택합니다.

1. 오른쪽 상단에서 **서비스 업데이트**를 선택하고 Service Connect 섹션까지 아래로 스크롤합니다.

1. 서비스 정보에서 **트래픽 암호화 켜기**를 선택하여 TLS를 활성화합니다.

1. **Service Connect TLS 역할**에서 기존 인프라 IAM 역할을 선택하거나 새로 생성합니다.

1. **서명자 인증 기관**의 경우 기존 인증 기관을 선택하거나 새로 생성합니다.

   자세한 내용은 [AWS Private Certificate Authority 인증서 및 Service Connect](service-connect-tls.md#service-connect-tls-certificates) 섹션을 참조하세요.

1. **AWS KMS key 선택**에서 AWS 소유 및 관리형 키를 선택하거나 다른 키를 선택할 수 있습니다. 새로 생성하도록 선택할 수도 있습니다.

AWS CLI를 사용하여 서비스에 대한 TLS를 구성하는 예는 [AWS CLI를 사용한 Amazon ECS Service Connect 구성](create-service-connect.md) 섹션을 참조하세요.

# Amazon ECS Service Connect에 TLS가 활성화되어 있는지 확인
<a name="verify-tls-enabled"></a>

Service Connect는 Service Connect 에이전트에서 TLS를 시작하고 대상 에이전트에서 종료합니다. 따라서 애플리케이션 코드에서는 TLS 상호 작용을 확인할 수 없습니다. 다음 단계에 따라 TLS가 활성화되어 있는지 확인합니다.

1. 애플리케이션 이미지에 `openssl` CLI를 포함합니다.

1. 서비스에서 [ECS Exec](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-exec.html)를 활성화하여 SSM을 통해 작업에 연결합니다. 또는 서비스와 동일한 Amazon VPC에서 Amazon EC2 인스턴스를 시작할 수 있습니다.

1. 확인하려는 서비스에서 작업의 IP와 포트를 검색합니다. AWS Cloud Map 콘솔에서 작업 IP 주소를 검색할 수 있습니다. 이 정보는 네임스페이스의 서비스 세부 정보 페이지에서 찾을 수 있습니다.

1. 다음 예제와 같이 `execute-command`를 사용하여 태스크 중 하나에 로그온합니다. 또는 **2단계**에서 생성한 Amazon EC2 인스턴스에 로그온합니다.

   ```
   $ aws ecs execute-command --cluster cluster-name \
       --task task-id  \
       --container container-name \
       --interactive \
       --command "/bin/sh"
   ```
**참고**  
DNS 이름을 직접 호출해도 인증서가 공개되지 않습니다.

1. 연결된 쉘에서 `openssl` CLI를 사용하여 작업에 연결된 인증서를 확인하고 조회합니다.

   예제:

   ```
   openssl s_client -connect 10.0.147.43:6379 < /dev/null 2> /dev/null \ 
   | openssl x509 -noout -text
   ```

   응답 예제:

   ```
   Certificate:
       Data:
           Version: 3 (0x2)
           Serial Number:
               <serial-number>
           Signature Algorithm: ecdsa-with-SHA256
           Issuer: <issuer>
           Validity
               Not Before: Jan 23 21:38:12 2024 GMT
               Not After : Jan 30 22:38:12 2024 GMT
           Subject: <subject>
           Subject Public Key Info:
               Public Key Algorithm: id-ecPublicKey
                   Public-Key: (256 bit)
                   pub:
                       <pub>
                   ASN1 OID: prime256v1
                   NIST CURVE: P-256
           X509v3 extensions:
               X509v3 Subject Alternative Name:
                   DNS:redis.yelb-cftc
               X509v3 Basic Constraints:
                   CA:FALSE
               X509v3 Authority Key Identifier:
                   keyid:<key-id>
   
               X509v3 Subject Key Identifier:
                   1D:<id>
               X509v3 Key Usage: critical
                   Digital Signature, Key Encipherment
               X509v3 Extended Key Usage:
                   TLS Web Server Authentication, TLS Web Client Authentication
       Signature Algorithm: ecdsa-with-SHA256
           <hash>
   ```

# AWS CLI를 사용한 Amazon ECS Service Connect 구성
<a name="create-service-connect"></a>

AWS CLI를 통해 Service Connect를 사용하는 Fargate 태스크에 대한 Amazon ECS 서비스를 생성할 수 있습니다.

**참고**  
듀얼 스택 서비스 엔드포인트를 사용하면 AWS CLI, SDK 및 Amazon ECS API에서 IPv4 및 IPv6 모두를 통해 Amazon ECS와 상호 작용할 수 있습니다. 자세한 내용은 [Amazon ECS 듀얼 스택 엔드포인트 사용](dual-stack-endpoint.md) 섹션을 참조하세요.

## 사전 조건
<a name="create-service-connect-prereqs"></a>

다음은 Service Connect의 사전 조건입니다.
+ 최신 버전의 AWS CLI가 설치되고 구성되어 있는지 확인합니다. 자세한 내용은 [Installing or updating to the latest version of the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)를 참조하세요.
+ IAM 사용자는 [AmazonECS\$1FullAccess](security-iam-awsmanpol.md#security-iam-awsmanpol-AmazonECS_FullAccess) IAM 정책 예제에 지정된 필수 권한을 가집니다.
+ 사용할 VPC, 서브넷, 라우팅 테이블 및 보안 그룹이 생성되었습니다. 자세한 내용은 [Virtual Private Cloud 생성](get-set-up-for-amazon-ecs.md#create-a-vpc) 섹션을 참조하세요.
+ 이름이 `ecsTaskExecutionRole`인 작업 실행 역할이 있고 `AmazonECSTaskExecutionRolePolicy` 관리형 정책이 역할에 연결되어 있습니다. 이 역할을 통해 Fargate는 NGINX 애플리케이션 로그와 Service Connect 프록시 로그를 Amazon CloudWatch Logs에 쓸 수 있습니다. 자세한 내용은 [작업 실행 역할 생성](task_execution_IAM_role.md#create-task-execution-role) 섹션을 참조하세요.

## 1단계: 클러스터 생성
<a name="create-service-connect-cluster"></a>

다음 단계에 따라 Amazon ECS 클러스터 및 네임스페이스를 생성합니다.

**Amazon ECS 클러스터와 AWS Cloud Map 네임스페이스 생성**

1. 사용할 `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"
       }
   }
   }
   ```

1. 클러스터가 생성되었는지 확인합니다.

   ```
   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": []
   }
   ```

1. (선택 사항) 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단계: 서버용 서비스 생성
<a name="create-service-connect-nginx-server"></a>

Service Connect 기능은 Amazon ECS에서 여러 애플리케이션을 상호 연결하는 데 사용됩니다. 이러한 애플리케이션 중 하나 이상은 연결할 웹 서비스를 제공해야 합니다. 이 단계에서는 다음을 생성합니다.
+ 수정되지 않은 공식 NGINX 컨테이너 이미지를 사용하고 Service Connect 구성을 포함하는 작업 정의.
+ 이 서비스에 대한 트래픽에 대해 서비스 검색 및 서비스 메시 프록시를 제공하도록 Service Connect를 구성하는 Amazon ECS 서비스 정의입니다. 구성은 클러스터 구성의 기본 네임스페이스를 재사용하여 각 서비스에 대한 서비스 구성의 양을 줄입니다.
+ Amazon ECS 서비스입니다. 작업 정의를 사용하여 하나의 작업을 실행하고, Service Connect 프록시에 대한 추가 컨테이너를 삽입합니다. 프록시는 작업 정의의 컨테이너 포트 매핑에 지정된 포트에서 수신을 대기합니다. Amazon ECS에서 실행되는 클라이언트 애플리케이션에서 클라이언트 작업의 프록시는 작업 정의 포트 이름, 서비스 검색 이름 또는 서비스 클라이언트 별칭 이름, 클라이언트 별칭의 포트 번호에 대한 아웃바운드 연결을 수신 대기합니다.

**Service Connect를 사용하여 웹 서비스를 생성하려면**

1. Fargate와 호환되며 `awsvpc` 네트워크 모드를 사용하는 태스크 정의를 등록합니다. 다음 단계를 따릅니다.

   1. 다음과 같은 태스크 정의의 내용으로 이름이 `service-connect-nginx.json`인 파일을 생성합니다.

      이 작업 정의는 포트 매핑에 `name` 및 `appProtocol` 파라미터를 추가하여 Service Connect를 구성합니다. 포트 이름을 사용하면 여러 포트가 사용될 때 서비스 구성에서 이 포트를 더욱 쉽게 식별할 수 있습니다. 포트 이름은 기본적으로 네임스페이스의 다른 애플리케이션에서 사용할 검색 가능한 이름으로도 사용됩니다.

      서비스에서 ECS Exec이 활성화되어 있으므로 작업 정의에 작업 IAM 역할이 포함됩니다.
**중요**  
이 작업 정의는 `logConfiguration`을 사용하여 `stdout` 및 `stderr`의 nginx 출력을 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"
      }
      ```

   1. `service-connect-nginx.json` 파일을 사용하여 작업 정의를 등록합니다.

      ```
      aws ecs register-task-definition --cli-input-json file://service-connect-nginx.json
      ```

1. 서비스 생성:

   1. 생성하려는 Amazon ECS 서비스의 내용으로 이름이 `service-connect-nginx-service.json`인 파일을 생성합니다. 이 예에서는 이전 단계에서 생성된 태스크 정의를 사용합니다. 예제 태스크 정의에서 `awsvpcConfiguration` 네트워크 모드가 사용되기 때문에 `awsvpc`이 필요합니다.

      ECS 서비스를 생성하는 경우 Fargate를 지정하고 Service Connect를 지원하는 `LATEST` 플랫폼 버전을 지정합니다. `securityGroups`와 `subnets`는 Amazon ECS 사용에 대한 요구 사항을 갖춘 VPC에 속해야 합니다. Amazon VPC 콘솔에서 보안 그룹 및 서브넷 ID를 얻을 수 있습니다.

      이 서비스는 `serviceConnectConfiguration` 파라미터를 추가하여 Service Connect를 구성합니다. 클러스터에는 기본 네임스페이스가 구성되어 있으므로 네임스페이스는 필요하지 않습니다. 네임스페이스의 ECS에서 실행되는 클라이언트 애플리케이션은 `portName` 및 `clientAliases`의 포트를 사용하여 이 서비스에 연결합니다. 예를 들어, nginx는 루트 위치 `/`에 시작 페이지를 제공하므로 `http://nginx:80/`을 사용하여 이 서비스에 연결할 수 있습니다. Amazon ECS에서 실행되지 않거나 동일한 네임스페이스에 있지 않은 외부 애플리케이션은 작업의 IP 주소와 작업 정의의 포트 번호를 사용하여 Service Connect 프록시를 통해 이 애플리케이션에 연결할 수 있습니다. `tls` 구성을 위해 `awsPcaAuthorityArn`, `kmsKey`, IAM 역할의 `roleArn`에 대한 인증서 `arn`을 추가합니다.

      이 서비스는 `logConfiguration`을 사용하여 `stdout` 및 `stderr`의 서비스 연결 프록시 출력을 Amazon CloudWatch Logs로 전송합니다. 이 작업 실행 역할에는 CloudWatch Logs 로그 그룹을 만드는 데 필요한 추가 권한이 없습니다. AWS Management Console 또는 AWS CLI를 사용하여 CloudWatch Logs에서 로그 그룹을 생성합니다. 이 로그 그룹을 생성하고 CloudWatch Logs에 프록시 로그를 저장하는 것이 좋습니다. 프록시 로그를 CloudWatch Logs로 전송하지 않으려면 `logConfiguration`을 제거합니다.

      ```
      {
          "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"
      }
      ```

   1. `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`이 출력의 첫 번째 deployment** 내부에 표시됩니다. 작업을 변경해야 하는 방식으로 ECS 서비스를 변경하면 Amazon ECS에서 새 배포를 생성합니다.

## 3단계: 연결할 수 있는지 확인
<a name="create-service-connect-verify"></a>

Service Connect의 구성 및 작동 여부를 확인하려면 다음 단계를 따라 외부 애플리케이션에서 웹 서비스에 연결합니다. 그런 다음 Service Connect 프록시가 생성하는 CloudWatch의 추가 지표를 참조하세요.

**외부 애플리케이션에서 웹 서비스에 연결**
+ 작업 IP 주소와 작업 IP 주소를 사용하는 컨테이너 포트에 연결

  AWS CLI를 사용하여 `aws ecs list-tasks --cluster tutorial`로 작업 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 프록시는 CloudWatch 지표에 애플리케이션(HTTP, HTTP2, gRPC 또는 TCP 연결) 지표를 생성합니다. CloudWatch 콘솔을 사용하는 경우 Amazon ECS 네임스페이스에서 **DiscoveryName**, (**DiscoveryName, ServiceName, ClusterName**), **TargetDiscoveryName**, (**TargetDiscoveryName, ServiceName, ClusterName**)의 추가 지표 차원을 확인합니다. 이러한 지표 및 차원에 대한 자세한 내용은 Amazon CloudWatch Logs 사용 설명서의 [View Available Metrics](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/viewing_metrics_with_cloudwatch.html)를 참조하세요.

# 서비스 검색을 사용하여 Amazon ECS 서비스를 DNS 이름으로 연결
<a name="service-discovery"></a>

Amazon ECS 서비스는 Amazon ECS 서비스 검색을 사용하도록 구성할 수도 있습니다. 서비스 검색은 AWS Cloud Map API 태스크를 사용하여 Amazon ECS 서비스에 대한 HTTP 및 DNS 네임스페이스를 관리합니다. 자세한 내용은 *AWS Cloud Map 개발자 안내서*의 [AWS Cloud Map란 무엇입니까?](https://docs.aws.amazon.com/cloud-map/latest/dg/Welcome.html)를 참조하세요.

서비스 검색은 다음 AWS 리전에서 사용할 수 있습니다.


| 리전 이름 | 리전 | 
| --- | --- | 
|  미국 동부(버지니아 북부)  |  us-east-1  | 
|  미국 동부(오하이오)  |  us-east-2  | 
|  미국 서부(캘리포니아 북부)  |  us-west-1  | 
|  미국 서부(오리건)  |  us-west-2  | 
|  아프리카(케이프타운)  |  af-south-1  | 
|  아시아 태평양(홍콩)  |  ap-east-1  | 
|  아시아 태평양(타이베이)  |  ap-east-2  | 
|  아시아 태평양(뭄바이)  |  ap-south-1  | 
|  아시아 태평양(하이데라바드)  |  ap-south-2  | 
|  아시아 태평양(도쿄)  |  ap-northeast-1  | 
|  아시아 태평양(서울)  |  ap-northeast-2  | 
|  아시아 태평양(오사카)  |  ap-northeast-3  | 
|  아시아 태평양(싱가포르)  |  ap-southeast-1  | 
|  아시아 태평양(시드니)  |  ap-southeast-2  | 
|  아시아 태평양(자카르타)  |  ap-southeast-3  | 
|  아시아 태평양(멜버른)  |  ap-southeast-4  | 
|  아시아 태평양(말레이시아)  |  ap-southeast-5  | 
|  아시아 태평양(뉴질랜드)  |  ap-southeast-6  | 
|  아시아 태평양(태국)  |  ap-southeast-7  | 
|  캐나다(중부)  |  ca-central-1  | 
|  캐나다 서부(캘거리)  |  ca-west-1  | 
|  중국(베이징)  |  cn-north-1  | 
|  중국(닝샤)  |  cn-northwest-1  | 
|  유럽(프랑크푸르트)  |  eu-central-1  | 
|  유럽(취리히)  |  eu-central-2  | 
|  유럽(아일랜드)  |  eu-west-1  | 
|  유럽(런던)  |  eu-west-2  | 
|  유럽(파리)  |  eu-west-3  | 
|  유럽(밀라노)  |  eu-south-1  | 
|  유럽(스톡홀름)  |  eu-north-1  | 
|  이스라엘(텔아비브)  |  il-central-1  | 
|  유럽(스페인)  |  eu-south-2  | 
|  중동(UAE)  |  me-central-1  | 
|  멕시코(중부)  |  mx-central-1  | 
|  중동(바레인)  |  me-south-1  | 
|  남아메리카(상파울루)  |  sa-east-1  | 
|  AWS GovCloud(미국 동부)  |  us-gov-east-1  | 
|  AWS GovCloud(미국 서부)  |  us-gov-west-1  | 

## 서비스 검색 개념
<a name="service-discovery-concepts"></a>

서비스 검색은 다음과 같은 구성 요소로 이루어집니다.
+ **서비스 검색 네임스페이스**: 트래픽을 라우팅할 동일한 도메인 이름(예: `example.com`)을 공유하는 서비스 검색 서비스의 논리적 그룹입니다. `aws servicediscovery create-private-dns-namespace` 명령을 직접 호출하거나 Amazon ECS 콘솔을 사용하여 네임스페이스를 생성할 수 있습니다. `aws servicediscovery list-namespaces` 명령을 사용하여 현재 계정에서 생성한 네임스페이스에 대한 요약 정보를 볼 수 있습니다. 서비스 검색 명령에 대한 자세한 정보는 *AWS Cloud Map(서비스 검색) AWS CLI 참조 가이드*의 `[create-private-dns-namespace](https://docs.aws.amazon.com/cli/latest/reference/servicediscovery/create-private-dns-namespace.html)` 및 `[list-namespaces](https://docs.aws.amazon.com/cli/latest/reference/servicediscovery/list-namespaces.html)`를 참조하세요.
+ **서비스 검색 서비스**: 서비스 검색 네임스페이스 내에 존재하며 네임스페이스에 대한 서비스 이름과 DNS 구성으로 구성되어 있습니다. 핵심 구성 요소는 다음과 같습니다.
  + **서비스 레지스트리**: DNS 또는 AWS Cloud Map API 태스크를 통해 서비스를 검색하고 서비스 연결에 사용할 수 있는 하나 이상의 가용 엔드포인트를 가져올 수 있도록 허용합니다.
+ **서비스 검색 인스턴스**: 서비스 검색 서비스 내에 존재하며 서비스 디렉터리의 각 Amazon ECS 서비스와 연결된 속성들로 구성됩니다.
  + **인스턴스 속성**: 다음 메타데이터는 서비스 검색을 사용하도록 구성된 각 Amazon ECS 서비스에 대한 사용자 지정 속성으로 추가됩니다.
    + **`AWS_INSTANCE_IPV4`** – `A` 레코드의 경우, DNS 쿼리 및 AWS Cloud Map에 응답하여 Route 53이 반환하는 IPv4 주소는 인스턴스 세부 정보(예: `192.0.2.44`)를 검색할 때 반환됩니다.
    + **`AWS_INSTANCE_IPV6`** – `AAAA` 레코드의 경우 DNS 쿼리 및 AWS Cloud Map에 응답하여 Route 53이 반환하는 IPv6 주소는 인스턴스 세부 정보(예: ` 2001:0db8:85a3:0000:0000:abcd:0001:2345`)를 검색할 때 반환됩니다. Amazon ECS 듀얼 스택 서비스에 대해 `AWS_INSTANCE_IPv4` 및 `AWS_INSTANCE_IPv6`가 모두 추가됩니다. Amazon ECS IPv6 전용 서비스에 대해서는 `AWS_INSTANCE_IPv6`만 추가됩니다.
    + **`AWS_INSTANCE_PORT`** – 서비스 검색 서비스와 연계된 포트 값입니다.
    + **`AVAILABILITY_ZONE`** – 작업이 시작된 가용 영역입니다. EC2를 사용하는 태스크의 경우 이는 컨테이너 인스턴스가 존재하는 가용 영역입니다. Fargate를 사용하는 태스크의 경우 이는 탄력적 네트워크 인터페이스가 존재하는 가용 영역입니다.
    + **`REGION`** – 작업이 존재하는 리전입니다.
    + **`ECS_SERVICE_NAME`** – 작업이 속한 Amazon ECS 서비스의 이름입니다.
    + **`ECS_CLUSTER_NAME`** – 작업이 속한 Amazon ECS 클러스터의 이름입니다.
    + **`EC2_INSTANCE_ID`** – 작업이 배치된 컨테이너 인스턴스의 ID입니다. 태스크에서 Fargate를 사용하는 경우 이 사용자 지정 속성은 추가되지 않습니다.
    + **`ECS_TASK_DEFINITION_FAMILY`** – 작업에서 사용하는 태스크 정의 패밀리입니다.
    + **`ECS_TASK_SET_EXTERNAL_ID`** – 작업 세트가 외부 배포를 위해 생성되고 서비스 검색 레지스트리와 연관되는 경우 `ECS_TASK_SET_EXTERNAL_ID` 속성에는 작업 세트의 외부 ID가 포함됩니다.
+ **Amazon ECS 상태 확인**: Amazon ECS는 컨테이너 수준의 상태 확인을 정기적으로 수행합니다. 상태 확인을 전달하지 않는 엔드포인트는 DNS 라우팅에서 제거되고 비정상으로 상태가 표시됩니다.

## 서비스 검색 고려 사항
<a name="service-discovery-considerations"></a>

서비스 검색을 사용할 때는 다음 사항을 고려해야 합니다.
+ 플랫폼 버전 v1.1.0 이상을 사용 중인 Fargate의 작업에 대해 서비스 검색이 지원됩니다. 자세한 내용은 [Amazon ECS에 대한 Fargate 플랫폼 버전](platform-fargate.md) 섹션을 참조하세요.
+ 서비스 검색을 사용하도록 구성된 서비스는 서비스당 작업 수가 1,000개로 제한됩니다. 이는 Route 53 서비스 할당량 때문입니다.
+ Amazon ECS 콘솔의 서비스 생성 워크플로는 서비스를 프라이빗 DNS 네임스페이스에 등록하는 것만 지원합니다. AWS Cloud Map 프라이빗 DNS 네임스페이스가 생성되면 Route 53 프라이빗 호스팅 영역이 자동으로 생성됩니다.
+ DNS 확인에 성공하려면 VPC DNS 속성을 구성해야 합니다. 속성을 구성하는 방법에 대한 자세한 정보는 *Amazon VPC 사용 설명서*의 [VPC에서 DNS 지원](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html#vpc-dns-support)을 참조하세요.
+ Amazon ECS는 공유 AWS Cloud Map 네임스페이스에 서비스 등록을 지원하지 않습니다.
+ 서비스 검색 서비스용으로 생성된 DNS 레코드는 퍼블릭 네임스페이스가 사용될 때도 퍼블릭 IP 주소 대신 항상 작업의 프라이빗 IP 주소로 등록합니다.
+ 서비스 검색을 위해서는 작업에서 `awsvpc`, `bridge` 또는 `host` 네트워크 모드(`none`는 지원되지 않음)를 지정해야 합니다.
+ 서비스 태스크 정의가 `awsvpc` 네트워크 모드를 사용하는 경우 각 서비스 태스크에 대해 `SRV` 또는 `A` 레코드를 임의로 조합해 생성할 수 있습니다. `SRV` 레코드를 사용하는 경우 포트가 필요합니다. 서비스가 듀얼 스택 서브넷을 사용하는 경우 `AAAA` 레코드를 추가로 생성할 수 있습니다. 서비스가 IPv6 전용 서브넷을 사용하는 경우 `A` 레코드를 생성할 수 없습니다.
+ 서비스 태스크 정의에서 `bridge` 또는 `host` 네트워크 모드를 사용하는 경우 SRV 레코드는 유일하게 지원되는 DNS 레코드 유형입니다. 각 서비스 태스크에 대한 SRV 레코드를 생성합니다. SRV 레코드는 태스크 정의로부터 컨테이너 이름과 컨테이너 포트 조합을 지정해야 합니다.
+ 서비스 검색 서비스를 위한 DNS 레코드는 VPC 내에서 쿼리가 가능합니다. 이들은 `<service-discovery-service-name>.<service-discovery-namespace>` 형식을 사용합니다.
+ 서비스 이름에 대해 DNS 쿼리를 수행할 때 `A` 및 `AAAA` 레코드는 태스크에 해당하는 IP 주소 세트를 반환합니다. `SRV` 레코드는 각 태스크에 대한 IP 주소 및 포트 세트를 반환합니다.
+ 정상 레코드가 8개 이하일 경우 Route 53은 모든 DNS 쿼리에 모든 정상 레코드로 응답합니다.
+ 모든 레코드가 비정상일 경우 Route 53는 최대 8개의 비정상 레코드로 DNS 쿼리에 응답합니다.
+ 로드 밸런서를 사용하는 서비스에 대한 서비스 검색을 구성할 수 있지만, 서비스 검색 트래픽은 항상 로드 밸런서가 아닌 태스크로 라우팅됩니다.
+ 서비스 검색은 Classic Load Balancer의 사용을 지원하지 않습니다.
+ 서비스 검색 서비스에 대해 Amazon ECS가 관리하는 컨테이너 수준의 상태 확인을 사용하는 것이 좋습니다.
  + **HealthCheckCustomConfig**—Amazon ECS가 사용자를 대신하여 상태 확인을 관리합니다. Amazon ECS는 컨테이너와 상태 확인, 태스크 상태의 정보를 사용하여 AWS Cloud Map을 통해 상태를 업데이트합니다. 서비스 검색 서비스를 생성할 때 `--health-check-custom-config` 파라미터를 사용하여 이를 지정합니다. 자세한 정보는 *AWS Cloud Map API 참조*의 [HealthCheckCustomConfig](https://docs.aws.amazon.com/cloud-map/latest/api/API_HealthCheckCustomConfig.html)를 참조하세요.
+ 서비스 검색이 사용될 때 생성되는 AWS Cloud Map 리소스는 수동으로 정리해야 합니다.
+ 작업과 인스턴스는 컨테이너 상태 확인이 값을 반환할 때까지 `UNHEALTHY`로 등록됩니다. 상태 확인을 통과하면 상태가 `HEALTHY`로 업데이트됩니다. 컨테이너 상태 확인이 실패하면 서비스 검색 인스턴스의 등록이 취소됩니다.

## 서비스 검색 가격
<a name="service-discovery-pricing"></a>

Amazon ECS 서비스 검색을 사용하는 고객들에게는 Route 53 리소스 및 AWS Cloud Map 검색 API 작업에 대해 요금이 부과됩니다. 여기에는 서비스 레지스트리에 대한 Route 53 호스팅 영역 및 쿼리 생성을 위한 비용이 포함됩니다. 자세한 정보는 *AWS Cloud Map 개발자 안내서*의 [AWS Cloud Map 요금](https://docs.aws.amazon.com/cloud-map/latest/dg/cloud-map-pricing.html)을 참조하세요.

Amazon ECS는 컨테이너 수준의 상태 확인을 수행하고 이를 AWS Cloud Map 사용자 지정 상태 확인 API 작업에 공개합니다. 고객들은 추가 비용 없이 이를 사용할 수 있습니다. 공개된 태스크에 대해 추가적인 네트워크 상태 확인을 구성하는 경우에는 이러한 상태 확인에 대해 요금이 부과됩니다.

# 서비스 검색을 사용하는 새 Amazon ECS 서비스 생성
<a name="create-service-discovery"></a>

AWS CLI를 사용하여 서비스 검색을 사용하는 Fargate 태스크가 포함된 서비스를 생성하는 방법을 알아보세요.

서비스 검색을 지원하는 AWS 리전 목록은 [서비스 검색을 사용하여 Amazon ECS 서비스를 DNS 이름으로 연결](service-discovery.md) 섹션을 참조하세요.

Fargate가 지원되는 리전에 대한 자세한 정보는 [AWS Fargate의 Amazon ECS에 대해 지원되는 리전](AWS_Fargate-Regions.md) 섹션을 참조하세요.

**참고**  
듀얼 스택 서비스 엔드포인트를 사용하면 AWS CLI, SDK 및 Amazon ECS API에서 IPv4 및 IPv6 모두를 통해 Amazon ECS와 상호 작용할 수 있습니다. 자세한 내용은 [Amazon ECS 듀얼 스택 엔드포인트 사용](dual-stack-endpoint.md) 섹션을 참조하세요.

## 사전 조건
<a name="create-service-discovery-prereqs"></a>

이 자습서를 시작하기 전에 다음 사전 조건을 충족하는지 확인하세요.
+ 최신 버전의 AWS CLI가 설치 및 구성됩니다. 자세한 내용은 [AWS CLI 최신 버전 설치 또는 업데이트](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)를 참조하세요.
+ [Amazon ECS 사용 설정](get-set-up-for-amazon-ecs.md) 섹션에 설명된 단계를 완료했습니다.
+ IAM 사용자는 [AmazonECS\$1FullAccess](security-iam-awsmanpol.md#security-iam-awsmanpol-AmazonECS_FullAccess) IAM 정책 예제에 지정된 필수 권한을 가집니다.
+ 하나 이상의 VPC 및 보안 그룹을 생성했습니다. 자세한 내용은 [Virtual Private Cloud 생성](get-set-up-for-amazon-ecs.md#create-a-vpc) 섹션을 참조하세요.

## 1단계: AWS Cloud Map에서 서비스 검색 리소스 생성
<a name="create-service-discovery-namespace"></a>

이 단계에 따라 서비스 검색 네임스페이스 및 서비스 검색 서비스를 생성합니다.

1. 프라이빗 Cloud Map 서비스 검색 네임스페이스를 생성합니다. 이 예에서는 이름이 `tutorial`인 네임스페이스를 생성합니다. *vpc-abcd1234*를 기존 VPC 중 하나의 ID로 교체합니다.

   ```
   aws servicediscovery create-private-dns-namespace \
         --name tutorial \
         --vpc vpc-abcd1234
   ```

   이 명령의 출력은 다음과 같습니다.

   ```
   {
       "OperationId": "h2qe3s6dxftvvt7riu6lfy2f6c3jlhf4-je6chs2e"
   }
   ```

1. 이전 단계의 출력에서 `OperationId`를 사용하여 프라이빗 네임스페이스가 성공적으로 생성되었는지 확인합니다. 후속 명령에서 이를 사용하기 때문에 네임스페이스 ID를 기록해 둡니다.

   ```
   aws servicediscovery get-operation \
         --operation-id h2qe3s6dxftvvt7riu6lfy2f6c3jlhf4-je6chs2e
   ```

   출력값은 다음과 같습니다.

   ```
   {
       "Operation": {
           "Id": "h2qe3s6dxftvvt7riu6lfy2f6c3jlhf4-je6chs2e",
           "Type": "CREATE_NAMESPACE",
           "Status": "SUCCESS",
           "CreateDate": 1519777852.502,
           "UpdateDate": 1519777856.086,
           "Targets": {
              "NAMESPACE": "ns-uejictsjen2i4eeg"
           }
       }
   }
   ```

1. 이전 단계의 출력에서 `NAMESPACE` ID를 사용하여 서비스 검색 서비스를 생성합니다. 이 예제에서는 `myapplication`라는 서비스를 생성합니다. 후속 명령에서 이를 사용하기 때문에 서비스 ID 및 ARN을 기록해 둡니다.

   ```
   aws servicediscovery create-service \
         --name myapplication \
         --dns-config "NamespaceId="ns-uejictsjen2i4eeg",DnsRecords=[{Type="A",TTL="300"}]" \
         --health-check-custom-config FailureThreshold=1
   ```

   출력값은 다음과 같습니다.

   ```
   {
       "Service": {
          "Id": "srv-utcrh6wavdkggqtk",
           "Arn": "arn:aws:servicediscovery:region:aws_account_id:service/srv-utcrh6wavdkggqtk",
           "Name": "myapplication",
           "DnsConfig": {
               "NamespaceId": "ns-uejictsjen2i4eeg",
               "DnsRecords": [
                   {
                       "Type": "A",
                       "TTL": 300
                   }
               ]
           },
           "HealthCheckCustomConfig": {
               "FailureThreshold": 1
           },
           "CreatorRequestId": "e49a8797-b735-481b-a657-b74d1d6734eb"
       }
   }
   ```

## 2단계: Amazon ECS 리소스 생성
<a name="create-service-discovery-cluster"></a>

이 단계에 따라 Amazon ECS 클러스터, 태스크 정의, 서비스를 생성합니다.

1. Amazon ECS 클러스터를 생성합니다. 이 예에서는 이름이 `tutorial`인 클러스터를 생성합니다.

   ```
   aws ecs create-cluster \
         --cluster-name tutorial
   ```

1. Fargate와 호환되며 `awsvpc` 네트워크 모드를 사용하는 태스크 정의를 등록합니다. 다음 단계를 따릅니다.

   1. 다음과 같은 태스크 정의의 내용으로 이름이 `fargate-task.json`인 파일을 생성합니다.

      ```
      {
          "family": "tutorial-task-def",
              "networkMode": "awsvpc",
              "containerDefinitions": [
                  {
                      "name": "sample-app",
                      "image": "public.ecr.aws/docker/library/httpd:2.4",
                      "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.</p> </div></body></html>' >  /usr/local/apache2/htdocs/index.html && httpd-foreground\""
                      ]
                  }
              ],
              "requiresCompatibilities": [
                  "FARGATE"
              ],
              "cpu": "256",
              "memory": "512"
      }
      ```

   1. `fargate-task.json` 파일을 사용하여 태스크 정의를 등록합니다.

      ```
      aws ecs register-task-definition \
            --cli-input-json file://fargate-task.json
      ```

1. 다음 단계에 따라 ECS 서비스를 생성합니다.

   1. 생성하려는 ECS 서비스의 내용으로 이름이 `ecs-service-discovery.json`인 파일을 생성합니다. 이 예에서는 이전 단계에서 생성된 태스크 정의를 사용합니다. 예제 태스크 정의에서 `awsvpcConfiguration` 네트워크 모드가 사용되기 때문에 `awsvpc`이 필요합니다.

      ECS 서비스를 생성하는 경우 Fargate를 지정하고 서비스 검색을 지원하는 `LATEST` 플랫폼 버전을 지정합니다. 서비스 검색 서비스를 AWS Cloud Map에서 생성할 때 `registryArn`은 반환된 ARN입니다. `securityGroups` 및 `subnets`은 반드시 Cloud Map 네임스페이스를 생성하는 데 사용되는 VPC에 속해야 합니다. Amazon VPC 콘솔에서 보안 그룹 및 서브넷 ID를 얻을 수 있습니다.

      ```
      {
          "cluster": "tutorial",
          "serviceName": "ecs-service-discovery",
          "taskDefinition": "tutorial-task-def",
          "serviceRegistries": [
             {
                "registryArn": "arn:aws:servicediscovery:region:aws_account_id:service/srv-utcrh6wavdkggqtk"
             }
          ],
          "launchType": "FARGATE",
          "platformVersion": "LATEST",
          "networkConfiguration": {
             "awsvpcConfiguration": {
                "assignPublicIp": "ENABLED",
                "securityGroups": [ "sg-abcd1234" ],
                "subnets": [ "subnet-abcd1234" ]
             }
          },
          "desiredCount": 1
      }
      ```

   1. `ecs-service-discovery.json`를 사용하여 ECS 서비스를 생성합니다.

      ```
      aws ecs create-service \
            --cli-input-json file://ecs-service-discovery.json
      ```

## 3단계: AWS Cloud Map에서 서비스 검색 확인
<a name="create-service-discovery-verify"></a>

서비스 검색 정보를 쿼리하면 모든 것이 적절하게 생성되었는지 확인할 수 있습니다. 서비스 검색이 구성된 후, AWS Cloud Map API 작업을 사용하거나 VPC 내의 인스턴스로부터 `dig`를 호출할 수 있습니다. 다음 단계를 따릅니다.

1. 서비스 검색 서비스 ID를 사용하여 서비스 검색 인스턴스를 나열합니다. 리소스 정리를 위해 인스턴스 ID(굵게 표시됨)를 기록해 둡니다.

   ```
    aws servicediscovery list-instances \
          --service-id srv-utcrh6wavdkggqtk
   ```

   출력값은 다음과 같습니다.

   ```
   {
       "Instances": [
           {
               "Id": "16becc26-8558-4af1-9fbd-f81be062a266",
               "Attributes": {
                   "AWS_INSTANCE_IPV4": "172.31.87.2"
                   "AWS_INSTANCE_PORT": "80", 
                   "AVAILABILITY_ZONE": "us-east-1a", 
                   "REGION": "us-east-1", 
                   "ECS_SERVICE_NAME": "ecs-service-discovery", 
                   "ECS_CLUSTER_NAME": "tutorial", 
                   "ECS_TASK_DEFINITION_FAMILY": "tutorial-task-def"
               }
           }
       ]
   }
   ```

1. 서비스 검색 네임스페이스 및 서비스, ECS 클러스터 이름과 같은 추가 파라미터를 사용하여 서비스 검색 인스턴스에 대한 세부 정보를 쿼리합니다.

   ```
   aws servicediscovery discover-instances \
         --namespace-name tutorial \
         --service-name myapplication \
         --query-parameters ECS_CLUSTER_NAME=tutorial
   ```

1. 다음 AWS CLI 명령을 사용하면 서비스 검색 서비스의 Route 53 호스팅 영역에서 생성된 DNS 레코드를 쿼리할 수 있습니다.

   1. 네임스페이스 ID를 사용하여 Route 53 호스팅 영역 ID가 포함된 네임스페이스에 대한 정보를 가져옵니다.

      ```
      aws servicediscovery \
            get-namespace --id ns-uejictsjen2i4eeg
      ```

      출력값은 다음과 같습니다.

      ```
      {
          "Namespace": {
              "Id": "ns-uejictsjen2i4eeg",
              "Arn": "arn:aws:servicediscovery:region:aws_account_id:namespace/ns-uejictsjen2i4eeg",
              "Name": "tutorial",
              "Type": "DNS_PRIVATE",
              "Properties": {
                   "DnsProperties": {
                      "HostedZoneId": "Z35JQ4ZFDRYPLV"
                  }
              },
              "CreateDate": 1519777852.502,
              "CreatorRequestId": "9049a1d5-25e4-4115-8625-96dbda9a6093"
          }
      }
      ```

   1. 이전 단계에서 Route 53 호스팅 영역 ID를 사용하여(굵게 표시된 텍스트 참조) 해당 호스팅 영역에 대한 리소스 레코드 세트를 가져옵니다.

      ```
      aws route53 list-resource-record-sets \
            --hosted-zone-id Z35JQ4ZFDRYPLV
      ```

1. `dig`를 사용하여 VPC 내의 인스턴스에서 DNS를 쿼리할 수 있습니다.

   ```
   dig +short myapplication.tutorial
   ```

## 4단계: 정리
<a name="create-service-discovery-cleanup"></a>

이 자습서를 완료한 후에 사용하지 않는 리소스에 대한 요금이 발생하는 것을 방지하기 위해 연결된 리소스를 정리합니다. 다음 단계를 따릅니다.

1. 이전에 기록한 서비스 ID 및 인스턴스 ID를 사용하여 서비스 검색 서비스 인스턴스의 등록을 취소합니다.

   ```
   aws servicediscovery deregister-instance \
         --service-id srv-utcrh6wavdkggqtk \
         --instance-id 16becc26-8558-4af1-9fbd-f81be062a266
   ```

   출력값은 다음과 같습니다.

   ```
   {
       "OperationId": "xhu73bsertlyffhm3faqi7kumsmx274n-jh0zimzv"
   }
   ```

1. 이전 단계의 출력에서 `OperationId`를 사용하여 서비스 검색 서비스 인스턴스의 등록이 성공적으로 취소되었는지 확인합니다.

   ```
   aws servicediscovery get-operation \ 
         --operation-id xhu73bsertlyffhm3faqi7kumsmx274n-jh0zimzv
   ```

   ```
   {
     "Operation": {
           "Id": "xhu73bsertlyffhm3faqi7kumsmx274n-jh0zimzv",
           "Type": "DEREGISTER_INSTANCE",
           "Status": "SUCCESS",
           "CreateDate": 1525984073.707,
           "UpdateDate": 1525984076.426,
           "Targets": {
               "INSTANCE": "16becc26-8558-4af1-9fbd-f81be062a266",
               "ROUTE_53_CHANGE_ID": "C5NSRG1J4I1FH",
               "SERVICE": "srv-utcrh6wavdkggqtk"
           }
       }
   }
   ```

1. 서비스 ID를 사용하여 서비스 검색 서비스를 삭제합니다.

   ```
   aws servicediscovery delete-service \ 
         --id srv-utcrh6wavdkggqtk
   ```

1. 네임스페이스 ID를 사용하여 서비스 검색 네임스페이스를 삭제합니다.

   ```
   aws servicediscovery delete-namespace \ 
         --id ns-uejictsjen2i4eeg
   ```

   출력값은 다음과 같습니다.

   ```
   {
       "OperationId": "c3ncqglftesw4ibgj5baz6ktaoh6cg4t-jh0ztysj"
   }
   ```

1. 이전 단계의 출력에서 `OperationId`를 사용하여 서비스 검색 네임스페이스가 성공적으로 삭제되었는지 확인합니다.

   ```
   aws servicediscovery get-operation \ 
         --operation-id c3ncqglftesw4ibgj5baz6ktaoh6cg4t-jh0ztysj
   ```

   출력값은 다음과 같습니다.

   ```
   {
       "Operation": {
           "Id": "c3ncqglftesw4ibgj5baz6ktaoh6cg4t-jh0ztysj",
           "Type": "DELETE_NAMESPACE",
           "Status": "SUCCESS",
           "CreateDate": 1525984602.211,
           "UpdateDate": 1525984602.558,
           "Targets": {
               "NAMESPACE": "ns-rymlehshst7hhukh",
               "ROUTE_53_CHANGE_ID": "CJP2A2M86XW3O"
           }
       }
   }
   ```

1. Amazon ECS 서비스에 대해 원하는 개수를 `0`으로 업데이트합니다. 다음 단계에서 서비스를 삭제하려면 이를 반드시 수행해야 합니다.

   ```
   aws ecs update-service \
         --cluster tutorial \
         --service ecs-service-discovery \
         --desired-count 0
   ```

1. Amazon ECS 서비스를 삭제합니다.

   ```
   aws ecs delete-service \
         --cluster tutorial \
         --service ecs-service-discovery
   ```

1. Amazon ECS 클러스터를 삭제합니다.

   ```
   aws ecs delete-cluster \
         --cluster tutorial
   ```

# Amazon VPC Lattice를 사용하여 Amazon ECS 서비스 연결, 관찰 및 보안 유지
<a name="ecs-vpc-lattice"></a>

Amazon VPC Lattice는 Amazon ECS 고객이 코드를 변경하지 않고도 여러 AWS 컴퓨팅 서비스, VPC, 계정에 빌드된 애플리케이션을 관찰, 보안 및 모니터링하도록 지원하는 완전관리형 애플리케이션 네트워킹 서비스입니다.

VPC Lattice에서는 컴퓨팅 리소스 모음인 대상 그룹을 사용합니다. 이러한 대상은 애플리케이션 또는 서비스를 실행하며, Amazon EC2 인스턴스, IP 주소, Lambda 함수 및 Application Load Balancer일 수 있습니다. 이제는 고객이 Amazon ECS 서비스를 VPC Lattice 대상 그룹과 연결하여 Amazon ECS 작업을 VPC Lattice의 IP 대상으로 활성화할 수 있습니다. Amazon ECS에서는 등록된 서비스에 대한 태스크가 시작될 때 VPC Lattice 대상 그룹에 태스크를 자동으로 등록합니다.

**참고**  
5개 VPC Lattice 구성을 사용하면 구성을 더 적게 사용할 때보다 배포 시간이 약간 더 길어질 수 있습니다.

리스너 규칙은 조건이 충족될 때 지정된 대상 그룹에 트래픽을 전달하는 데 사용됩니다. 리스너에서는 사용자가 구성한 포트의 프로토콜을 사용하여 연결 요청을 확인합니다. 서비스는 사용자가 리스너를 구성할 때 정의한 규칙에 따라 등록된 대상으로 요청을 라우팅합니다.

또한 Amazon ECS에서는 VPC Lattice 상태 확인에 따라 비정상이 되는 경우 태스크를 자동으로 바꿉니다. VPC Lattice와 연결되면 Amazon ECS 고객이 클러스터, VPC 및 AWS Resource Access Manager가 있는 계정 전체의 서비스에 연결, 권한 부여 및 인증을 위한 IAM 통합과 고급 트래픽 관리 특성과 같은 VPC Lattice의 다른 여러 컴퓨팅 간 연결, 보안 및 관찰성 특성도 활용할 수 있습니다.

Amazon ECS 고객이 다음과 같은 방법으로 VPC Lattice의 이점을 누릴 수 있습니다.
+ 증가하는 개발자 생산성 - VPC Lattice는 사용자가 특성 구축에 집중할 수 있도록 하여 개발자 생산성을 높이는 한편, VPC Lattice는 모든 컴퓨팅 플랫폼에서 네트워킹, 보안 및 관찰성 과제를 균일한 방법으로 처리합니다.
+ 좋아지는 보안 태세 - VPC Lattice를 사용하면 개발자가 애플리케이션 및 컴퓨팅 플랫폼 간의 통신을 쉽게 인증하고 보호하며, 전송 중 암호화를 적용하고, VPC Lattice 인증 정책을 통해 세부적인 액세스 제어를 적용할 수 있습니다. 이에 따라 업계를 선도하는 규제 및 규정 준수 요구 사항을 충족하는 더 강력한 보안 태세를 채택할 수 있습니다.
+ 향상되는 애플리케이션 확장성 및 복원력 - VPC Lattice를 사용하면 경로, 헤더 및 메서드 기반 라우팅, 인증, 권한 부여 및 모니터링과 같은 특성을 사용하여 배포된 애플리케이션의 네트워크를 생성할 수 있습니다. 이러한 이점은 워크로드에 대한 리소스 오버헤드 없이 제공되며 상당한 지연 시간 추가 없이 초당 수백만 개의 요청을 생성하는 다중 클러스터 배포를 지원할 수 있습니다.
+ 이기종 인프라를 통한 배포 유연성 - VPC Lattice에서는 Amazon ECS, Fargate, Amazon EC2, Amazon EKS 및 Lambda와 같은 모든 컴퓨팅 서비스에 걸쳐 일관된 특성이 제공되며, 조직에서 각 애플리케이션에 적합한 인프라를 선택할 수 있는 유연성이 허용됩니다.

## VPC Lattice가 다른 Amazon ECS 서비스와 연동하는 방식
<a name="ecs-lattice-compatibility"></a>

VPC Lattice와 Amazon ECS를 함께 사용하면 다른 Amazon ECS 서비스를 사용하는 방식이 변경될 수 있지만 다른 서비스는 동일하게 유지됩니다.

**Application Load Balancers**  
더는 VPC Lattice에서 Application Load Balancer 대상 그룹 유형과 함께 사용하여 Amazon ECS 서비스에 연결하는 특정 Application Load Balancer를 생성할 필요가 없습니다. 그 대신에 VPC Lattice 대상 그룹으로 Amazon ECS 서비스만 구성하면 됩니다. 또한 Application Load Balancer를 Amazon ECS와 동시에 사용하도록 선택할 수도 있습니다.

**Amazon ECS 롤링 배포**  
Amazon ECS 롤링 배포만 VPC Lattice와 연동하며, Amazon ECS에서는 배포 중 태스크를 안전하게 가져오고 서비스에서 제거합니다. 코드 배포 및 블루/그린 배포는 지원되지 않습니다.

VPC Lattice에 대한 자세한 내용은 [Amazon VPC Lattice 사용 설명서](https://docs.aws.amazon.com/vpc-lattice/latest/ug/what-is-vpc-lattice.html)를 참조하세요.

# VPC Lattice를 사용하는 서비스 생성
<a name="ecs-vpc-lattice-create-service"></a>

AWS Management Console 또는 AWS CLI를 사용하여 VPC Lattice로 서비스를 생성할 수 있습니다.

## 사전 조건
<a name="create-ecs-vpc-lattice-prereqs"></a>

이 자습서를 시작하기 전에 다음 사전 조건을 충족하는지 확인하세요.
+ 최신 버전의 AWS CLI가 설치 및 구성됩니다. 자세한 정보는 [AWS Command Line Interface 설치](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html) 섹션을 참조하세요.
**참고**  
듀얼 스택 서비스 엔드포인트를 사용하면 AWS CLI, SDK 및 Amazon ECS API에서 IPv4 및 IPv6 모두를 통해 Amazon ECS와 상호 작용할 수 있습니다. 자세한 내용은 [Amazon ECS 듀얼 스택 엔드포인트 사용](dual-stack-endpoint.md) 섹션을 참조하세요.
+ [Amazon ECS 사용 설정](get-set-up-for-amazon-ecs.md) 섹션에 설명된 단계를 완료했습니다.
+ IAM 사용자는 [AmazonECS\$1FullAccess](security-iam-awsmanpol.md#security-iam-awsmanpol-AmazonECS_FullAccess) IAM 정책 예제에 지정된 필수 권한을 가집니다.

## AWS Management Console에서 VPC Lattice를 사용하는 서비스 생성
<a name="ecs-lattice-create-console"></a>

다음과 같은 단계에 따라 AWS Management Console을 사용하여 VPC Lattice로 서비스를 생성합니다.

1. [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)에서 콘솔을 엽니다.

1. 탐색 페이지에서 **Clusters**(클러스터)를 선택합니다.

1. **클러스터** 페이지에서 서비스를 생성할 클러스터를 선택합니다.

1. **Services**(서비스) 탭에서 **Create**(생성)를 선택합니다.

   이전에 서비스를 생성한 적이 없는 경우 [콘솔을 사용하여 Amazon ECS 서비스 생성](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-service-console-v2.html)에서 찾을 수 있는 단계를 따른 다음에 VPC Lattice 섹션에 도달하면 다음과 같은 단계를 계속 진행합니다.

1. 버튼을 선택하여 **VPC Lattice 활성화**를 선택합니다.

1. **Amazon ECS에 대한 ECS 인프라 역할**에 대해 기존 역할을 사용하려면 VPC Lattice 대상 그룹을 생성할 때 이미 생성하여 사용하는 역할을 사용합니다. 새 역할을 생성하려면 **ECS 인프라 역할을 생성**합니다.

1. **VPC**를 선택합니다.

   **VPC**는 태스크 정의를 등록할 때 선택한 네트워킹 모드에 따라 달라집니다. EC2에서 `host` 또는 `network` 모드를 사용하는 경우 VPC를 선택하세요.

   `awsvpc` 모드의 경우 **네트워킹**에서 선택한 VPC를 기반으로 VPC가 자동으로 선택되며 변경할 수 없습니다.

1. **대상 그룹**에서 대상 그룹 또는 그룹을 선택합니다. 대상 그룹을 하나 이상 선택해야 하며 최대 5개를 선택할 수 있습니다. 대상 그룹을 더 추가하려면 **대상 그룹 추가**를 선택합니다. 선택한 각 대상 그룹의 **포트 이름**, **프로토콜** 및 **포트**를 선택합니다. 대상 그룹을 삭제하려면 **제거**를 선택합니다.
**참고**  
기존 대상 그룹을 추가하려면 AWS CLI를 사용해야 합니다. AWS CLI를 사용하여 대상 그룹을 추가하는 방법에 대한 지침은 *AWS Command Line Interface 참조*의 [register-targets](https://docs.aws.amazon.com/cli/latest/reference/vpc-lattice/register-targets.html)를 참조하세요.
VPC Lattice 서비스에는 여러 대상 그룹이 있을 수 있지만, 각 대상 그룹은 하나의 서비스에만 추가할 수 있습니다.
IPv6 전용 구성으로 서비스를 생성하려면 IP 주소 유형이 `IPv6`인 대상 그룹을 선택합니다.

1. 이제 VPC Lattice 콘솔로 이동하여 설정을 계속합니다. 여기에서는 리스너 기본 작업 또는 기존 VPC Lattice 서비스의 규칙에 새 대상 그룹을 포함합니다.

   자세한 내용은 [VPC Lattice 서비스를 위한 리스너 규칙](https://docs.aws.amazon.com/vpc-lattice/latest/ug/listener-rules.html)을 참조하세요.

**중요**  
보안 그룹 또는 태스크에 대한 인바운드 규칙 `vpc-lattice` 접두사를 허용해야 하며, 상태 확인에 실패할 수 있습니다.

## AWS CLI에서 VPC Lattice를 사용하는 서비스 생성
<a name="ecs-lattice-create-cli"></a>

AWS CLI를 사용하여 VPC Lattice로 서비스를 생성합니다. *user input placeholder*를 사용자의 정보로 바꿉니다.

1. 대상 그룹 구성 파일을 생성합니다. 다음은 `tg-config.json`이라는 예제입니다.

   ```
   {
       "ipAddressType": "IPV4",
       "port": 443,
       "protocol": "HTTPS",
       "protocolVersion": "HTTP1",
       "vpcIdentifier": "vpc-f1663d9868EXAMPLE"
   }
   ```

1. 다음과 같은 명령을 사용하여 VPC Lattice 대상 그룹을 생성합니다.

   ```
   aws vpc-lattice create-target-group \
       --name my-lattice-target-group-ip \
       --type IP \
       --config file://tg-config.json
   ```
**참고**  
IPv6 전용 구성으로 서비스를 생성하려면 IP 주소 유형이 `IPv6`인 대상 그룹을 생성합니다. 자세한 내용은 *AWS CLI 명령 참조*의 [create-log-group](https://docs.aws.amazon.com/cli/latest/reference/vpc-lattice/create-target-group.html)을 참조하세요.

   출력 예시:

   ```
   {
       "arn": "arn:aws:vpc-lattice:us-east-2:123456789012:targetgroup/tg-0eaa4b9ab4EXAMPLE",
       "config": {
           "healthCheck": {
               "enabled": true,
               "healthCheckIntervalSeconds": 30,
               "healthCheckTimeoutSeconds": 5,
               "healthyThresholdCount": 5,
               "matcher": {
                   "httpCode": "200"
               },
               "path": "/",
               "protocol": "HTTPS",
               "protocolVersion": "HTTP1",
               "unhealthyThresholdCount": 2
           },
           "ipAddressType": "IPV4",
           "port": 443,
           "protocol": "HTTPS",
           "protocolVersion": "HTTP1",
           "vpcIdentifier": "vpc-f1663d9868EXAMPLE"
       },
       "id": "tg-0eaa4b9ab4EXAMPLE",
       "name": "my-lattice-target-group-ip",
       "status": "CREATE_IN_PROGRESS",
       "type": "IP"
   }
   ```

1. *ecs-service-vpc-lattice.json*이라는 다음과 같은 JSON 파일은 Amazon ECS 서비스를 VPC Lattice 대상 그룹에 연결하는 데 사용하는 예제입니다. 아래 예제의 `portName`은 태스크 정의의 `portMappings` 속성의 `name` 필드에 정의한 것과 동일합니다.

   ```
   {
       "serviceName": "ecs-service-vpc-lattice",
       "taskDefinition": "ecs-task-def",
           "vpcLatticeConfigurations": [
           {
               "targetGroupArn": "arn:aws:vpc-lattice:us-west-2:123456789012:targetgroup/tg-0eaa4b9ab4EXAMPLE",
               "portName": "testvpclattice",
               "roleArn": "arn:aws:iam::123456789012:role/ecsInfrastructureRoleVpcLattice"
           }
       ],
       "desiredCount": 5,
       "role": "ecsServiceRole"
   }
   ```

   다음과 같은 명령을 사용하여 Amazon ECS 서비스를 생성하고 위의 json 예제를 사용하여 VPC Lattice 대상 그룹에 연결합니다.

   ```
   aws ecs create-service \
       --cluster clusterName \
       --serviceName ecs-service-vpc-lattice \
       --cli-input-json file://ecs-service-vpc-lattice.json
   ```

**참고**  
VPC Lattice는 Amazon ECS Anywhere에서 지원되지 않습니다.