

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# AWS App Mesh 및 Amazon ECS 시작하기
<a name="getting-started-ecs"></a>

**중요**  
지원 종료 공지: 2026년 9월 30일에는에 대한 지원을 중단할 AWS 예정입니다 AWS App Mesh. 2026년 9월 30일 이후에는 AWS App Mesh 콘솔 또는 AWS App Mesh 리소스에 더 이상 액세스할 수 없습니다. 자세한 내용은이 블로그 게시물 [Migrating from to Amazon ECS Service Connect를 참조 AWS App Mesh 하세요](https://aws.amazon.com/blogs/containers/migrating-from-aws-app-mesh-to-amazon-ecs-service-connect).

이 주제는 Amazon ECS에서 실행 중인 실제 서비스와 AWS App Mesh 함께를 사용하는 데 도움이 됩니다. 이 자습서에서는 몇 가지 App Mesh 리소스 유형의 기본 기능을 다룹니다.

## 시나리오
<a name="scenario"></a>

App Mesh를 사용하는 방법을 설명하기 위해 다음과 같은 특징을 가진 애플리케이션이 있다고 가정합니다.
+ `serviceA`및 `serviceB`라는 두 개의 서비스로 구성됩니다.
+ 두 서비스 모두 `apps.local`이라는 네임스페이스에 등록됩니다.
+ `ServiceA`는 HTTP/2, 포트 80을 통해 `serviceB`와 통신합니다.
+  `serviceB`의 버전 2를 이미 배포했고 `apps.local` 네임스페이스에 `serviceBv2` 이름으로 등록했습니다.

다음과 같은 요구 사항이 있습니다.
+ 에서 로 트래픽의 75%`serviceA`를 전송`serviceB`하고 트래픽의 25%를 `serviceBv2` 먼저 전송하려고 합니다. 에 25%만 전송하면에서 트래픽의 100%를 전송하기 전에 버그가 없는지 확인할 `serviceBv2`수 있습니다`serviceA`.
+ 트래픽이 신뢰할 수 있는 것으로 입증되면 해당 트래픽의 100%가 `serviceBv2`로 이동하도록 트래픽 가중치를 쉽게 조정할 수 있기를 원합니다. 모든 트래픽이 `serviceBv2`로 전송되면 `serviceB`를 중단하려고 할 수 있습니다.
+ 이전 요구 사항을 충족하기 위해 실제 서비스에 대한 기존 애플리케이션 코드 또는 서비스 검색 등록을 변경할 필요가 없도록 하고 싶습니다.

요구 사항을 충족하기 위해 가상 서비스, 가상 노드, 가상 라우터 및 루트가 포함된 App Mesh 서비스 메시를 생성하기로 결정했습니다. 메시를 구현한 후 서비스가 Envoy 프록시를 사용하도록 서비스를 업데이트합니다. 업데이트된 서비스는 서로 직접 통신하지 않고 Envoy 프록시를 통해 서로 통신합니다.

## 사전 조건
<a name="prerequisites"></a>

**중요**  
지원 종료 공지: 2026년 9월 30일에는에 대한 지원을 중단할 AWS 예정입니다 AWS App Mesh. 2026년 9월 30일 이후에는 AWS App Mesh 콘솔 또는 AWS App Mesh 리소스에 더 이상 액세스할 수 없습니다. 자세한 내용은이 블로그 게시물 [Migrating from to Amazon ECS Service Connect를 참조 AWS App Mesh 하세요](https://aws.amazon.com/blogs/containers/migrating-from-aws-app-mesh-to-amazon-ecs-service-connect).
+ App Mesh 개념에 대한 기존의 이해. 자세한 내용은 [란 무엇입니까 AWS App Mesh?](what-is-app-mesh.md) 단원을 참조하십시오.
+ Amazon ECS 개념에 대한 기존의 이해. 자세한 내용을 알아보려면 Amazon Elastic Container Service 개발자 안내서의 [Amazon ECS란?](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html)을 참조하세요.
+ App Mesh는 DNS AWS Cloud Map또는 둘 다에 등록된 Linux 서비스를 지원합니다. 이 시작 안내서를 사용하려면 DNS에 등록된 기존 서비스 3개가 있으면 좋습니다. 이 주제의 절차에서는 기존 서비스의 이름이 `serviceA`, `serviceB` 및 `serviceBv2`이고 `apps.local`이라는 네임스페이스를 통해 모든 서비스를 검색할 수 있다고 가정합니다.

  서비스가 존재하지 않더라도 서비스 메시 및 해당 리소스를 생성할 수 있지만 실제 서비스를 배포할 때까지 메시를 사용할 수 없습니다. Amazon ECS의 서비스 검색에 대한 자세한 내용은 [서비스 검색](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-discovery.html)을 참조하세요. 서비스 검색을 사용하여 Amazon ECS 서비스를 생성하려면 [자습서: 서비스 검색을 사용하여 서비스 생성](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-service-discovery.html)을 참조하세요. 서비스를 아직 실행하지 않은 경우 [서비스 검색을 사용하여 Amazon ECS 서비스를 생성](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-service-discovery.html)할 수 있습니다.

## 1단계: 메시 및 가상 서비스 생성
<a name="create-mesh-and-virtual-service2"></a>

서비스 메시는 내부에 있는 서비스 간의 네트워크 트래픽에 대한 논리적 경계입니다. 자세한 내용은 [서비스 메시](meshes.md) 단원을 참조하십시오. 가상 서비스는 실제 서비스를 추상화한 것입니다. 자세한 내용은 [가상 서비스](virtual_services.md) 단원을 참조하십시오.

다음의 리소스를 생성합니다.
+ 시나리오의 모든 서비스가 `apps.local` 네임스페이스에 등록되기 때문에 `apps`이라는 메시를 생성합니다.
+ 가상 서비스는 해당 이름으로 검색할 수 있는 서비스를 나타내며 다른 이름을 참조하도록 코드를 변경하고 싶지 않기 때문에 `serviceb.apps.local`이라는 이름의 가상 서비스를 생성합니다. `servicea.apps.local`이라는 이름의 가상 서비스는 이후 단계에서 추가됩니다.

 AWS Management Console 또는 AWS CLI 버전 1.18.116 이상 또는 2.0.38 이상을 사용하여 다음 단계를 완료할 수 있습니다. 를 사용하는 경우 `aws --version` 명령을 AWS CLI사용하여 설치된 AWS CLI 버전을 확인합니다. 버전 1.18.116 이상 또는 2.0.38 이상이 설치되어 있지 않으면 [AWS CLI를 설치하거나 업데이트](https://docs.aws.amazon.com/cli/latest/reference/appmesh/cli-chap-install.html)해야 합니다. 사용할 도구의 탭을 선택합니다.

------
#### [ AWS Management Console ]

1. [https://console.aws.amazon.com/appmesh/get-started](https://console.aws.amazon.com/appmesh/get-started)에서 App Mesh 콘솔 처음 실행 마법사를 엽니다.

1. **Mesh name(메시 이름)**에 **apps**를 입력합니다.

1. **Virtual service name(가상 서비스 이름)**에 **serviceb.apps.local**를 입력합니다.

1. 계속하려면 **다음**을 선택합니다.

------
#### [ AWS CLI ]

1. `[create-mesh](https://docs.aws.amazon.com/cli/latest/reference/appmesh/create-mesh.html)` 명령을 사용하여 메시를 생성합니다.

   ```
   aws appmesh create-mesh --mesh-name apps
   ```

1. `[create-virtual-service](https://docs.aws.amazon.com/cli/latest/reference/appmesh/create-virtual-service.html)` 명령을 사용하여 가상 서비스를 생성합니다.

   ```
   aws appmesh create-virtual-service --mesh-name apps --virtual-service-name serviceb.apps.local --spec {}
   ```

------

## 2단계: 가상 노드 생성
<a name="create-virtual-node2"></a>

가상 노드는 실제 서비스에 대한 논리적 포인터 역할을 합니다. 자세한 내용은 [가상 노드](virtual_nodes.md) 단원을 참조하십시오.

가상 노드 중 하나가 `serviceB`라는 실제 서비스를 나타내므로 `serviceB`이라는 가상 노드를 생성합니다. 가상 노드가 나타내는 실제 서비스는 호스트 이름 `serviceb.apps.local`을 사용하여 `DNS`를 통해 검색할 수 있습니다. 또는를 사용하여 실제 서비스를 검색할 수 있습니다 AWS Cloud Map. 가상 노드는 포트 80에서 HTTP/2 프로토콜을 사용하여 트래픽을 수신합니다. 상태 확인과 마찬가지로 다른 프로토콜도 지원됩니다. 이후 단계에서 `serviceA` 및 `serviceBv2`에 대한 가상 노드를 생성합니다.

------
#### [ AWS Management Console ]

1. **Virtual node name(가상 노드 이름)**에 **serviceB**를 입력합니다.

1. **서비스 검색 방법**에 대해 **DNS**를 선택하고 **DNS 호스트 이름**에 대해 **serviceb.apps.local**을 입력합니다.

1. **리스너 구성**에서 **프로토콜**로 **http2**를 선택하고 **포트**로 **80**을 입력합니다.

1. 계속하려면 **다음**을 선택합니다.

------
#### [ AWS CLI ]

1. 다음 콘텐츠를 가진 `create-virtual-node-serviceb.json`이라는 파일을 생성합니다:

   ```
   {
       "meshName": "apps",
       "spec": {
           "listeners": [
               {
                   "portMapping": {
                       "port": 80,
                       "protocol": "http2"
                   }
               }
           ],
           "serviceDiscovery": {
               "dns": {
                   "hostname": "serviceB.apps.local"
               }
           }
       },
       "virtualNodeName": "serviceB"
   }
   ```

1. JSON 파일을 입력으로 사용하여 [create-virtual-node](https://docs.aws.amazon.com/cli/latest/reference/appmesh/create-virtual-node.html) 명령으로 가상 노드를 생성합니다.

   ```
   aws appmesh create-virtual-node --cli-input-json file://create-virtual-node-serviceb.json
   ```

------

## 3단계: 가상 라우터 생성 및 라우팅
<a name="create-virtual-router-and-route"></a>

가상 라우터는 메시 내에 있는 하나 이상의 가상 서비스에 대한 트래픽을 라우팅합니다. 자세한 내용은 [가상 라우터](virtual_routers.md) 및 [Routes](routes.md) 섹션을 참조하세요.

다음의 리소스를 생성합니다.
+ `serviceB`라는 이름의 가상 라우터. `serviceB.apps.local`이라는 가상 서비스는 다른 서비스와의 아웃바운드 통신을 시작하지 않기 때문입니다. 이전에 만든 가상 서비스는 실제 `serviceb.apps.local` 서비스를 추상화한 것입니다. 가상 서비스는 가상 라우터로 트래픽을 보냅니다. 가상 라우터는 포트 80에서 HTTP/2 프로토콜을 사용하여 트래픽을 수신합니다. 다른 프로토콜도 지원됩니다.
+ `serviceB`라는 이름의 라우팅. 트래픽을 100% `serviceB` 가상 노드로 라우팅합니다. `serviceBv2` 가상 노드를 추가한 후 이후 단계에서 가중치가 변경됩니다. 이 안내서에서는 다루지 않지만 해당 라우팅에 대한 필터 조건을 추가하고 재시도 정책을 추가하여 통신 문제가 발생할 경우 Envoy 프록시가 가상 노드에 트래픽을 여러 번 보내도록 할 수 있습니다.

------
#### [ AWS Management Console ]

1. **Virtual router name(가상 라우터 이름)**에 **serviceB**를 입력합니다.

1. **리스너 구성**에서 **프로토콜**로 **http2**를 선택하고 **포트**로 **80**을 지정합니다.

1. **Route Name(라우팅 이름)**에 **serviceB**를 입력합니다.

1. **루트 유형**에 대해 **http2**를 선택합니다.

1. **대상 구성**의 **가상 노드 이름**에 대해 `serviceB`를 선택하고 **가중치**로 **100**을 입력합니다.

1. **일치 구성**에서 **방법**을 선택합니다.

1. 계속하려면 **다음**을 선택합니다.

------
#### [ AWS CLI ]

1. 가상 라우터를 생성합니다.

   1. 다음 콘텐츠를 가진 `create-virtual-router.json`이라는 파일을 생성합니다:

      ```
      {
          "meshName": "apps",
          "spec": {
              "listeners": [
                  {
                      "portMapping": {
                          "port": 80,
                          "protocol": "http2"
                      }
                  }
              ]
          },
          "virtualRouterName": "serviceB"
      }
      ```

   1. JSON 파일을 입력으로 사용하여 [create-virtual-router](https://docs.aws.amazon.com/cli/latest/reference/appmesh/create-virtual-router.html) 명령으로 가상 라우터를 생성합니다.

      ```
      aws appmesh create-virtual-router --cli-input-json file://create-virtual-router.json
      ```

1. 라우팅을 생성합니다.

   1. 다음 콘텐츠를 가진 `create-route.json`이라는 파일을 생성합니다:

      ```
      {
          "meshName" : "apps",
          "routeName" : "serviceB",
          "spec" : {
              "httpRoute" : {
                  "action" : {
                      "weightedTargets" : [
                          {
                              "virtualNode" : "serviceB",
                              "weight" : 100
                          }
                      ]
                  },
                  "match" : {
                      "prefix" : "/"
                  }
              }
          },
          "virtualRouterName" : "serviceB"
      }
      ```

   1. JSON 파일을 입력으로 사용하여 [create-route](https://docs.aws.amazon.com/cli/latest/reference/appmesh/create-route.html) 명령으로 라우팅을 생성합니다.

      ```
      aws appmesh create-route --cli-input-json file://create-route.json
      ```

------

## 4단계: 검토 및 생성
<a name="review-create"></a>

이전 지침에 대한 설정을 검토합니다.

------
#### [ AWS Management Console ]

섹션에서 변경해야 할 경우 **편집**을 선택합니다. 설정에 만족하면 **메시 생성**을 선택합니다.

**상태** 화면에는 생성된 모든 메시 리소스가 표시됩니다. **메시 보기**를 선택하여 콘솔에서 생성된 리소스를 볼 수 있습니다.

------
#### [ AWS CLI ]

[describe-mesh](https://docs.aws.amazon.com/cli/latest/reference/appmesh/describe-mesh.html) 명령을 사용하여 생성한 메시의 설정을 검토합니다.

```
aws appmesh describe-mesh --mesh-name apps
```

[describe-virtual-service](https://docs.aws.amazon.com/cli/latest/reference/appmesh/describe-virtual-service.html) 명령으로 생성한 가상 서비스의 설정을 검토합니다.

```
aws appmesh describe-virtual-service --mesh-name apps --virtual-service-name serviceb.apps.local
```

[describe-virtual-node](https://docs.aws.amazon.com/cli/latest/reference/appmesh/describe-virtual-node.html) 명령으로 생성한 가상 노드의 설정을 검토합니다.

```
aws appmesh describe-virtual-node --mesh-name apps --virtual-node-name serviceB
```

[describe-virtual-router](https://docs.aws.amazon.com/cli/latest/reference/appmesh/describe-virtual-router.html) 명령으로 생성한 가상 라우터의 설정을 검토합니다.

```
aws appmesh describe-virtual-router --mesh-name apps --virtual-router-name serviceB
```

[describe-route](https://docs.aws.amazon.com/cli/latest/reference/appmesh/describe-route.html) 명령으로 생성한 라우팅의 설정을 검토합니다.

```
aws appmesh describe-route --mesh-name apps \
    --virtual-router-name serviceB  --route-name serviceB
```

------

## 5단계: 추가 리소스 생성
<a name="create-additional-resources"></a>

시나리오를 완료하려면 다음을 수행해야 합니다.
+ `serviceBv2`라는 가상 노드 하나와 `serviceA`라는 가상 노드 하나를 생성합니다. 두 가상 노드 모두 HTTP/2 포트 80을 통해 요청을 수신합니다. `serviceA` 가상 노드의 경우 `serviceb.apps.local`의 백엔드를 구성합니다. `serviceA` 가상 노드의 모든 아웃바운드 트래픽은 이름이 `serviceb.apps.local`인 가상 서비스로 전송됩니다. 이 안내서에서는 다루지 않지만 가상 노드에 대한 액세스 로그를 쓸 파일 경로를 지정할 수도 있습니다.
+ `servicea.apps.local`이라는 가상 서비스를 추가로 생성하면 모든 트래픽이 `serviceA` 가상 노드로 직접 전송됩니다.
+ 트래픽의 75%를 `serviceB` 가상 노드로 보내고 트래픽의 25%를 `serviceBv2` 가상 노드로 보내도록 이전 단계에서 생성한 `serviceB` 라우팅을 업데이트합니다. 시간이 지남에 따라 `serviceBv2`가 트래픽의 100%를 수신할 때까지 가중치를 계속 수정할 수 있습니다. 모든 트래픽이 `serviceBv2`로 전송되면 `serviceB` 가상 노드와 실제 서비스를 종료하고 중단할 수 있습니다. `serviceb.apps.local` 가상 및 실제 서비스 이름이 변경되지 않으므로 가중치를 변경할 때 코드를 수정할 필요가 없습니다. `serviceb.apps.local` 가상 서비스는 트래픽을 가상 라우터로 전송하여 트래픽을 가상 노드로 라우팅한다는 점을 기억하십시오. 가상 노드의 서비스 검색 이름은 언제든지 변경할 수 있습니다.

------
#### [ AWS Management Console ]

1. 왼쪽 탐색 창에서 **Meshes(메시)**를 선택합니다.

1. 이전 단계에서 생성한 `apps` 메시를 선택합니다.

1. 왼쪽 탐색 창에서 **Virtual node(가상 노드)**를 선택합니다.

1. **Create virtual node(가상 노드 생성)**를 선택합니다.

1. **가상 노드 이름**에 대해 **serviceBv2**를 입력하고, **서비스 검색 방법**에 대해 **DNS**를 선택하고 **DNS 호스트 이름**에 대해 **servicebv2.apps.local**을 입력합니다.

1. **리스너 구성**에서 **프로토콜**로 **http2**를 선택하고 **포트**로 **80**을 입력합니다.

1. **Create virtual node(가상 노드 생성)**를 선택합니다.

1. **가상 노드 생성**을 다시 선택합니다. **가상 노드 이름**에 **serviceA**를 입력합니다. **서비스 검색 방법**에 대해 **DNS**를 선택하고 **DNS 호스트 이름**에 대해 **servicea.apps.local**을 입력합니다.

1. **새 백엔드**에서 **가상 서비스 이름 입력**에 **serviceb.apps.local**을 입력합니다.

1. **리스너 구성**에서 **프로토콜**로 **http2**를 선택하고 **포트**에 **80**을 입력한 다음, **가상 노드 생성**을 선택합니다.

1. 왼쪽 탐색 창에서 **Virtual routers(가상 라우터)**를 선택한 다음 목록에서 `serviceB` 가상 라우터를 선택합니다.

1. **루트**에서 이전 단계에서 생성한 `ServiceB`라는 루트를 선택하고 **편집**을 선택합니다.

1. **대상**, **가상 노드 이름**에서 `serviceB`의 **가중치** 값을 **75**로 변경합니다.

1. **대상 추가**를 선택하고 드롭다운 목록에서 `serviceBv2`를 선택하고 **가중치**의 값을 **25**로 설정합니다.

1. **저장**을 선택합니다.

1. 왼쪽 탐색 창에서 **가상 서비스**를 선택한 다음 **가상 서비스 생성**을 선택합니다.

1. **가상 서비스 이름**으로 **servicea.apps.local**을 입력하고 **공급자**로 **가상 노드**를 선택하고 **가상 노드**로 `serviceA`를 선택한 다음, **가상 서비스 생성**을 선택합니다.

------
#### [ AWS CLI ]

1. `serviceBv2` 가상 노드를 생성합니다.

   1. 다음 콘텐츠를 가진 `create-virtual-node-servicebv2.json`이라는 파일을 생성합니다:

      ```
      {
          "meshName": "apps",
          "spec": {
              "listeners": [
                  {
                      "portMapping": {
                          "port": 80,
                          "protocol": "http2"
                      }
                  }
              ],
              "serviceDiscovery": {
                  "dns": {
                      "hostname": "serviceBv2.apps.local"
                  }
              }
          },
          "virtualNodeName": "serviceBv2"
      }
      ```

   1. 가상 노드를 생성합니다.

      ```
      aws appmesh create-virtual-node --cli-input-json file://create-virtual-node-servicebv2.json
      ```

1. `serviceA` 가상 노드를 생성합니다.

   1. 다음 콘텐츠를 가진 `create-virtual-node-servicea.json`이라는 파일을 생성합니다:

      ```
      {
         "meshName" : "apps",
         "spec" : {
            "backends" : [
               {
                  "virtualService" : {
                     "virtualServiceName" : "serviceb.apps.local"
                  }
               }
            ],
            "listeners" : [
               {
                  "portMapping" : {
                     "port" : 80,
                     "protocol" : "http2"
                  }
               }
            ],
            "serviceDiscovery" : {
               "dns" : {
                  "hostname" : "servicea.apps.local"
               }
            }
         },
         "virtualNodeName" : "serviceA"
      }
      ```

   1. 가상 노드를 생성합니다.

      ```
      aws appmesh create-virtual-node --cli-input-json file://create-virtual-node-servicea.json
      ```

1. 이전 단계에서 생성한 `serviceb.apps.local` 가상 서비스를 업데이트하여 트래픽을 `serviceB` 가상 라우터로 보냅니다. 가상 서비스가 원래 생성되었을 때는 `serviceB` 가상 라우터가 아직 생성되지 않았기 때문에 트래픽을 어디에도 보내지 않았습니다.

   1. 다음 콘텐츠를 가진 `update-virtual-service.json`이라는 파일을 생성합니다:

      ```
      {
         "meshName" : "apps",
         "spec" : {
            "provider" : {
               "virtualRouter" : {
                  "virtualRouterName" : "serviceB"
               }
            }
         },
         "virtualServiceName" : "serviceb.apps.local"
      }
      ```

   1. [update-virtual-service](https://docs.aws.amazon.com/cli/latest/reference/appmesh/update-virtual-service.html) 명령을 사용하여 가상 서비스를 업데이트합니다.

      ```
      aws appmesh update-virtual-service --cli-input-json file://update-virtual-service.json
      ```

1. 이전 단계에서 생성한 `serviceB` 라우팅을 업데이트합니다.

   1. 다음 콘텐츠를 가진 `update-route.json`이라는 파일을 생성합니다:

      ```
      {
         "meshName" : "apps",
         "routeName" : "serviceB",
         "spec" : {
            "http2Route" : {
               "action" : {
                  "weightedTargets" : [
                     {
                        "virtualNode" : "serviceB",
                        "weight" : 75
                     },
                     {
                        "virtualNode" : "serviceBv2",
                        "weight" : 25
                     }
                  ]
               },
               "match" : {
                  "prefix" : "/"
               }
            }
         },
         "virtualRouterName" : "serviceB"
      }
      ```

   1. [update-route](https://docs.aws.amazon.com/cli/latest/reference/appmesh/update-route.html) 명령을 사용하여 라우팅을 업데이트합니다.

      ```
      aws appmesh update-route --cli-input-json file://update-route.json
      ```

1. `serviceA` 가상 서비스를 생성합니다.

   1. 다음 콘텐츠를 가진 `create-virtual-servicea.json`이라는 파일을 생성합니다:

      ```
      {
         "meshName" : "apps",
         "spec" : {
            "provider" : {
               "virtualNode" : {
                  "virtualNodeName" : "serviceA"
               }
            }
         },
         "virtualServiceName" : "servicea.apps.local"
      }
      ```

   1. 가상 서비스를 생성합니다.

      ```
      aws appmesh create-virtual-service --cli-input-json file://create-virtual-servicea.json
      ```

------

**메시 요약**  
서비스 메시를 생성하기 전에는 `servicea.apps.local`, `serviceb.apps.local` 및 `servicebv2.apps.local`이라는 세 가지 실제 서비스가 있었습니다. 실제 서비스 외에도 이제 실제 서비스를 나타내는 다음 리소스가 포함된 서비스 메시가 있습니다.
+ 두 개의 가상 서비스. 프록시는 가상 라우터를 통해 `servicea.apps.local` 가상 서비스의 모든 트래픽을 `serviceb.apps.local` 가상 서비스로 보냅니다.
+ `serviceA`, `serviceB` 및 `serviceBv2`라는 세 개의 가상 노드. Envoy 프록시는 가상 노드에 대해 구성된 서비스 검색 정보를 사용하여 실제 서비스의 IP 주소를 조회합니다.
+ Envoy 프록시가 인바운드 트래픽의 75%를 `serviceB` 가상 노드로 라우팅하고 트래픽의 25%를 `serviceBv2` 가상 노드로 라우팅하도록 지시하는 하나의 라우팅이 있는 가상 라우터 하나.

## 6단계: 서비스 업데이트
<a name="update-services"></a>

메시를 생성한 후에는 다음 작업을 완료해야 합니다.
+ 각 Amazon ECS 태스크와 함께 배포하는 Envoy 프록시에 하나 이상의 가상 노드의 구성을 읽을 수 있는 권한을 부여합니다. 프록시에 권한을 부여하는 방법에 대한 자세한 내용은 [프록시 권한 부여](https://docs.aws.amazon.com/app-mesh/latest/userguide/proxy-authorization.html)를 참조하십시오.
+ Envoy 프록시를 사용하도록 기존 Amazon ECS 태스크 정의를 각각 업데이트합니다.

**자격 증명**  
Envoy 컨테이너에는 App Mesh 서비스로 전송되는 요청에 서명하기 위한 AWS Identity and Access Management 자격 증명이 필요합니다. Amazon EC2 시작 유형으로 배포된 Amazon ECS 태스크의 경우 자격 증명은 [인스턴스 역할](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/instance_IAM_role.html) 또는 [태스크 IAM 역할](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html)에서 가져올 수 있습니다. Linux의 Fargate 컨테이너를 사용하여 배포한 Amazon ECS 태스크는 인스턴스 IAM 프로필 자격 증명을 제공하는 Amazon EC2 메타데이터 서버에 액세스할 수 없습니다. 이러한 자격 증명을 제공하려면 Linux의 Fargate 컨테이너 유형으로 배포된 태스크에 IAM 태스크 역할을 연결해야 합니다.

태스크를 Amazon EC2 시작 유형으로 배포하고 Amazon EC2 메타데이터 서버에 대한 액세스가 차단된 경우 [태스크에 대한 IAM 역할](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html)의 *중요* 주석에 설명된 것처럼 태스크 IAM 역할도 태스크에 연결해야 합니다. 인스턴스 또는 태스크에 할당하는 역할에는 [프록시 권한 부여](https://docs.aws.amazon.com/app-mesh/latest/userguide/proxy-authorization.html)에 설명된 대로 IAM 정책이 연결되어 있어야 합니다.



**를 사용하여 작업 정의를 업데이트하려면 AWS CLI**  
Amazon ECS AWS CLI 명령를 사용합니다[https://docs.aws.amazon.com/cli/latest/reference/ecs/register-task-definition.html](https://docs.aws.amazon.com/cli/latest/reference/ecs/register-task-definition.html). 아래 예제 작업 정의는 서비스에 대해 App Mesh를 구성하는 방법을 보여줍니다.

**참고**  
콘솔을 통해 Amazon ECS용 App Mesh를 구성할 수 없습니다.

### 태스크 정의 ARN
<a name="getting-started-ecs-json"></a>

**프록시 구성**  
Amazon ECS 서비스가 App Mesh를 사용하도록 구성하려면 서비스의 태스크 정의에 다음 프록시 구성 섹션이 있어야 합니다. 프록시 구성 `type`을 `APPMESH`로 설정하고 `containerName`을 `envoy`로 설정합니다. 다음 속성 값을 적절히 설정합니다.

`IgnoredUID`  
Envoy 프록시는 이 사용자 ID를 사용하는 프로세스의 트래픽을 라우팅하지 않습니다. 이 속성 값에 대해 원하는 사용자 ID를 선택할 수 있지만, 이 ID는 작업 정의의 Envoy 컨테이너에 대한 `user` ID와 동일해야 합니다. 이렇게 일치할 경우 Envoy는 프록시를 사용하지 않고 자체 트래픽을 무시할 수 있습니다. 예제에서는 기록을 위해 `{{1337}}`을 사용합니다.

`ProxyIngressPort`  
Envoy 프록시 컨테이너의 인바운드 포트입니다. 이 값을 `15000`로 설정합니다.

`ProxyEgressPort`  
Envoy 프록시 컨테이너의 아웃바운드 포트입니다. 이 값을 `15001`로 설정합니다.

`AppPorts`  
애플리케이션 컨테이너가 수신 대기하는 모든 인바운드 포트를 지정합니다. 이 예제에서 애플리케이션 컨테이너는 `{{9080}}` 포트를 통해 수신합니다. 지정하는 포트는 가상 노드 리스너에 구성된 포트와 일치해야 합니다.

`EgressIgnoredIPs`  
Envoy는 이러한 IP 주소에 대한 트래픽을 프록시 처리하지 않습니다. 이 값을 `169.254.170.2,169.254.169.254`로 설정하면 Amazon EC2 메타데이터 서버와 Amazon ECS 태스크 메타데이터 엔드포인트가 무시됩니다. 메타데이터 엔드포인트는 태스크 자격 증명을 위한 IAM 역할을 제공합니다. 주소를 추가할 수 있습니다.

`EgressIgnoredPorts`  
쉼표로 구분된 포트 목록을 추가할 수 있습니다. Envoy는 이러한 포트에 대한 트래픽을 프록시 처리하지 않습니다. 포트를 나열하지 않은 경우에도 포트 22는 무시됩니다.  
무시할 수 있는 최대 아웃바운드 포트 수는 15개입니다.

```
"proxyConfiguration": {
	"type": "APPMESH",
	"containerName": "envoy",
	"properties": [{
			"name": "IgnoredUID",
			"value": "{{1337}}"
		},
		{
			"name": "ProxyIngressPort",
			"value": "15000"
		},
		{
			"name": "ProxyEgressPort",
			"value": "15001"
		},
		{
			"name": "AppPorts",
			"value": "{{9080}}"
		},
		{
			"name": "EgressIgnoredIPs",
			"value": "169.254.170.2,169.254.169.254"
		},
		{
			"name": "EgressIgnoredPorts",
			"value": "{{22}}"
		}
	]
}
```

**애플리케이션 컨테이너 Envoy 종속성**  
작업 정의의 애플리케이션 컨테이너를 시작하려면 Envoy 프록시가 부트스트랩되고 시작될 때까지 기다려야 합니다. 이를 위해서는 각 애플리케이션 컨테이너 정의에 `dependsOn` 섹션을 설정하여 Envoy 컨테이너가 `HEALTHY`로 보고될 때까지 기다립니다. 다음 코드는 이 종속성이 있는 애플리케이션 컨테이너 정의 예제를 보여줍니다. 다음 예제의 모든 속성이 필요합니다. 일부 속성 값도 필요하지만 일부는 {{대체 가능}}합니다.

```
{
	"name": "{{appName}}",
	"image": "{{appImage}}",
	"portMappings": [{
		"containerPort": {{9080}},
		"hostPort": {{9080}},
		"protocol": "tcp"
	}],
	"essential": true,
	"dependsOn": [{
		"containerName": "envoy",
		"condition": "HEALTHY"
	}]
}
```

**Envoy 컨테이너 정의**

Amazon ECS 태스크 정의에는 App Mesh Envoy 컨테이너 이미지가 포함되어야 합니다.

[지원되는](https://docs.aws.amazon.com/general/latest/gr/appmesh.html) 모든 리전은 {{리전 코드를}} `me-south-1`, , `ap-east-1`, `ap-southeast-3`, 및 이외의 모든 리전으로 바꿀 수 `eu-south-1` `il-central-1`있습니다`af-south-1`.  
표준  

```
840364872350.dkr.ecr.{{region-code}}.amazonaws.com/aws-appmesh-envoy:v1.34.13.1-prod
```
FIPS 준수  

```
840364872350.dkr.ecr.{{region-code}}.amazonaws.com/aws-appmesh-envoy:v1.34.13.1-prod-fips
```

`me-south-1`  
표준  

```
772975370895.dkr.ecr.me-south-1.amazonaws.com/aws-appmesh-envoy:v1.34.13.1-prod
```

`ap-east-1`  
표준  

```
856666278305.dkr.ecr.ap-east-1.amazonaws.com/aws-appmesh-envoy:v1.34.13.1-prod
```

`ap-southeast-3`  
표준  

```
909464085924.dkr.ecr.ap-southeast-3.amazonaws.com/aws-appmesh-envoy:v1.34.13.1-prod
```

`eu-south-1`  
표준  

```
422531588944.dkr.ecr.eu-south-1.amazonaws.com/aws-appmesh-envoy:v1.34.13.1-prod
```

`il-central-1`  
표준  

```
564877687649.dkr.ecr.il-central-1.amazonaws.com/aws-appmesh-envoy:v1.34.13.1-prod
```

`af-south-1`  
표준  

```
924023996002.dkr.ecr.af-south-1.amazonaws.com/aws-appmesh-envoy:v1.34.13.1-prod
```

`Public repository`  
표준  

```
public.ecr.aws/appmesh/aws-appmesh-envoy:v1.34.13.1-prod
```
FIPS 준수  

```
public.ecr.aws/appmesh/aws-appmesh-envoy:v1.34.13.1-prod-fips
```

**중요**  
v1.9.0.0-prod 이상 버전만 App Mesh에서 사용할 수 있습니다.

Envoy 프로젝트 팀이 App Mesh를 지원하는 변경 사항을 병합할 때까지 App Mesh Envoy 컨테이너 이미지를 사용해야 합니다. 자세한 내용은 [GitHub roadmap issue(GitHub 로드맵 문제)](https://github.com/aws/aws-app-mesh-roadmap/issues/10)를 참조하십시오.

다음 예제의 모든 속성이 필요합니다. 일부 속성 값도 필요하지만 일부는 {{대체 가능}}합니다.

**참고**  
Envoy 컨테이너 정의는 `essential`로 표시되어야 합니다.
Envoy 컨테이너에 `512`개 CPU 단위와 최소 `64`MiB 메모리를 할당하는 것이 좋습니다. Fargate에서 설정할 수 있는 최소 용량은 `1024`MiB 메모리입니다.
Amazon ECS 서비스의 가상 노드 이름은 `APPMESH_RESOURCE_ARN` 속성 값으로 설정해야 합니다. 이 속성에는 `1.15.0` 이상의 Envoy 이미지 버전이 필요합니다. 자세한 내용은 [Envoy 이미지](envoy.md) 단원을 참조하십시오.
`user` 설정 값은 작업 정의 프록시 구성의 `IgnoredUID` 값과 일치해야 합니다. 이 예제에서는 `{{1337}}`을 사용합니다.
여기에 표시된 상태 확인은 Envoy 컨테이너가 정상이고 애플리케이션 컨테이너를 시작할 준비가 되었음을 Amazon ECS에 보고하기 전에 Envoy 컨테이너가 올바르게 부트스트랩될 때까지 기다립니다.
기본적으로 App Mesh는 Envoy가 지표 및 트레이스에서 자신을 참조할 때 `APPMESH_RESOURCE_ARN`에서 지정한 리소스의 이름을 사용합니다. `APPMESH_RESOURCE_CLUSTER` 환경 변수를 사용자 고유의 이름으로 설정하여 이 동작을 재정의할 수 있습니다. 이 속성에는 `1.15.0` 이상의 Envoy 이미지 버전이 필요합니다. 자세한 내용은 [Envoy 이미지](envoy.md) 단원을 참조하십시오.

다음 코드는 Envoy 컨테이너 정의 예제를 보여줍니다.

```
{
	"name": "envoy",
	"image": "{{840364872350}}.dkr.ecr.{{us-west-2}}.amazonaws.com/aws-appmesh-envoy:v1.34.13.1-prod",
	"essential": true,
	"environment": [{
		"name": "APPMESH_RESOURCE_ARN",
		"value": "arn:aws:appmesh:{{us-west-2}}:{{111122223333}}:mesh/{{apps}}/virtualNode/{{serviceB}}"
	}],
	"healthCheck": {
		"command": [
			"CMD-SHELL",
			"curl -s http://localhost:9901/server_info | grep state | grep -q LIVE"
		],
		"startPeriod": {{10}},
		"interval": {{5}},
		"timeout": {{2}},
		"retries": {{3}}
	},
	"user": "{{1337}}"
}
```

**태스크 정의 예제**  
다음 예제 Amazon ECS 태스크 정의는 위의 예제를 `taskB`에 대한 태스크 정의로 병합하는 방법을 보여 줍니다. AWS X-Ray사용 여부에 관계없이 두 Amazon ECS 시작 유형 모두에 대한 태스크를 생성하는 예제가 제공됩니다. {{대체 가능}} 값을 적절히 변경하여 시나리오에서 이름이 `taskA` 및 `taskBv2`인 태스크의 태스크 정의를 생성합니다. `APPMESH_RESOURCE_ARN` 값에 대한 메시 이름 및 가상 노드 이름과, 애플리케이션이 프록시 구성 `AppPorts` 값을 수신하는 포트 목록을 대체합니다. 기본적으로 App Mesh는 Envoy가 지표 및 트레이스에서 자신을 참조할 때 `APPMESH_RESOURCE_ARN`에서 지정한 리소스의 이름을 사용합니다. `APPMESH_RESOURCE_CLUSTER` 환경 변수를 사용자 고유의 이름으로 설정하여 이 동작을 재정의할 수 있습니다. 다음 예제의 모든 속성이 필요합니다. 일부 속성 값도 필요하지만 일부는 {{대체 가능}}합니다.

자격 증명 단원에 설명된 대로 Amazon ECS 태스크를 실행 중인 경우에는 기존 [태스크 IAM 역할](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html)을 예제에 추가해야 합니다.

**중요**  
Fargate는 1024보다 큰 포트 값을 사용해야 합니다.

**Example Amazonz ECS 태스크 정의에 대한 JSON - Linux의 Fargate 컨테이너**  

```
{
   
   "family" : "{{taskB}}",
   "memory" : "{{1024}}",
   "cpu" : "{{0.5 vCPU}}",
   "proxyConfiguration" : {
      "containerName" : "envoy",
      "properties" : [
         {
            "name" : "ProxyIngressPort",
            "value" : "15000"
         },
         {
            "name" : "AppPorts",
            "value" : "{{9080}}"
         },
         {
            "name" : "EgressIgnoredIPs",
            "value" : "169.254.170.2,169.254.169.254"
         },
         {
            "name": "EgressIgnoredPorts",
            "value": "{{22}}"
         },
         {
            "name" : "IgnoredUID",
            "value" : "{{1337}}"
         },
         {
            "name" : "ProxyEgressPort",
            "value" : "15001"
         }
      ],
      "type" : "APPMESH"
   },
   "containerDefinitions" : [
      {
         "name" : "{{appName}}",
         "image" : "{{appImage}}",
         "portMappings" : [
            {
               "containerPort" : {{9080}},
               "protocol" : "tcp"
            }
         ],
         "essential" : true,
         "dependsOn" : [
            {
               "containerName" : "envoy",
               "condition" : "HEALTHY"
            }
         ]
      },
      {         
         "name" : "envoy",
         "image" : "{{840364872350}}.dkr.ecr.{{us-west-2}}.amazonaws.com/aws-appmesh-envoy:v1.34.13.1-prod",
         "essential" : true,
         "environment" : [
            {
               "name" : "APPMESH_VIRTUAL_NODE_NAME",
               "value" : "mesh/{{apps}}/virtualNode/{{serviceB}}"
            }
         ],
         "healthCheck" : {
            "command" : [
               "CMD-SHELL",
               "curl -s http://localhost:9901/server_info | grep state | grep -q LIVE"
            ],
            "interval" : {{5}},
            "retries" : {{3}},
            "startPeriod" : {{10}},
            "timeout" : {{2}}
         },
         "memory" : {{500}},
         "user" : "{{1337}}"
      }
   ],
   "requiresCompatibilities" : [ "FARGATE" ],
   "taskRoleArn" : "arn:aws:iam::{{123456789012}}:role/{{ecsTaskRole}}",
   "executionRoleArn" : "arn:aws:iam::{{123456789012}}:role/{{ecsTaskExecutionRole}}",
   "networkMode" : "awsvpc"
}
```

**Example JSON for Amazon ECS 작업 정의 AWS X-Ray - Linux 컨테이너의 Fargate**  
X-Ray에서는 사용자가 트래픽 흐름을 시각화하는 데 사용할 수 있는 도구를 애플리케이션이 다루고 제공해야 한다는 요청에 대한 데이터를 수집할 수 있습니다. Envoy에 대한 X-Ray 드라이버를 사용하면 Envoy가 추적 정보를 X-Ray에 보고할 수 있습니다. [Envoy 구성](https://docs.aws.amazon.com/app-mesh/latest/userguide/envoy.html)을 사용하여 X-Ray 추적 기능을 활성화할 수 있습니다. 구성에 따라 Envoy는 [사이드카](https://docs.aws.amazon.com/xray/latest/devguide/xray-daemon-ecs.html) 컨테이너로 실행되는 X-Ray 대몬(daemon)에 추적 데이터를 보내고 대몬(daemon)은 추적을 X-Ray 서비스에 전달합니다. 추적이 X-Ray에 게시되면 X-Ray 콘솔을 사용하여 서비스 호출 그래프를 시각화하고 추적 세부 정보를 요청할 수 있습니다. 다음 JSON은 X-Ray 통합을 활성화하는 태스크 정의를 나타냅니다.  

```
{
   
   
   "family" : "{{taskB}}",
   "memory" : "{{1024}}",
   "cpu" : "{{512}}",
   "proxyConfiguration" : {
      "containerName" : "envoy",
      "properties" : [
         {
            "name" : "ProxyIngressPort",
            "value" : "15000"
         },
         {
            "name" : "AppPorts",
            "value" : "{{9080}}"
         },
         {
            "name" : "EgressIgnoredIPs",
            "value" : "169.254.170.2,169.254.169.254"
         },
         {
            "name": "EgressIgnoredPorts",
            "value": "{{22}}"
         },
         {
            "name" : "IgnoredUID",
            "value" : "{{1337}}"
         },
         {
            "name" : "ProxyEgressPort",
            "value" : "15001"
         }
      ],
      "type" : "APPMESH"
   },
   "containerDefinitions" : [
      {
         "name" : "{{appName}}",
         "image" : "{{appImage}}",
         "portMappings" : [
            {
               "containerPort" : {{9080}},
               "protocol" : "tcp"
            }
         ],
         "essential" : true,
         "dependsOn" : [
            {
               "containerName" : "envoy",
               "condition" : "HEALTHY"
            }
         ]
      },
      {
         
         "name" : "envoy",
         "image" : "{{840364872350}}.dkr.ecr.{{us-west-2}}.amazonaws.com/aws-appmesh-envoy:v1.34.13.1-prod",
         "essential" : true,
         "environment" : [
            {
               "name" : "APPMESH_VIRTUAL_NODE_NAME",
               "value" : "mesh/{{apps}}/virtualNode/{{serviceB}}"
            },
            {
               "name": "ENABLE_ENVOY_XRAY_TRACING",
               "value": "1"
            }
         ],
         "healthCheck" : {
            "command" : [
               "CMD-SHELL",
               "curl -s http://localhost:9901/server_info | grep state | grep -q LIVE"
            ],
            "interval" : {{5}},
            "retries" : {{3}},
            "startPeriod" : {{10}},
            "timeout" : {{2}}
         },
         "memory" : {{500}},
         "user" : "{{1337}}"
      },
      {
         "name" : "xray-daemon",
         "image" : "amazon/aws-xray-daemon",
         "user" : "{{1337}}",
         "essential" : true,
         "cpu" : "{{32}}",
         "memoryReservation" : "{{256}}",
         "portMappings" : [
            {
               "containerPort" : 2000,
               "protocol" : "udp"
            }
         ]
      }
   ],
   "requiresCompatibilities" : [ "FARGATE" ],
   "taskRoleArn" : "arn:aws:iam::{{123456789012}}:role/{{ecsTaskRole}}",
   "executionRoleArn" : "arn:aws:iam::{{123456789012}}:role/{{ecsTaskExecutionRole}}",
   "networkMode" : "awsvpc"
}
```

**Example Amazon ECS 태스크 정의를 위한 JSON - EC2 시작 유형**  

```
{
  "family": "{{taskB}}",
  "memory": "{{256}}",
  "proxyConfiguration": {
    "type": "APPMESH",
    "containerName": "envoy",
    "properties": [
      {
        "name": "IgnoredUID",
        "value": "{{1337}}"
      },
      {
        "name": "ProxyIngressPort",
        "value": "15000"
      },
      {
        "name": "ProxyEgressPort",
        "value": "15001"
      },
      {
        "name": "AppPorts",
        "value": "{{9080}}"
      },
      {
        "name": "EgressIgnoredIPs",
        "value": "169.254.170.2,169.254.169.254"
      },
      {
        "name": "EgressIgnoredPorts",
        "value": "{{22}}"
      }
    ]
  },
  "containerDefinitions": [
    {
      "name": "{{appName}}",
      "image": "{{appImage}}",
      "portMappings": [
        {
          "containerPort": {{9080}},
          "hostPort": {{9080}},
          "protocol": "tcp"
        }
      ],
      "essential": true,
      "dependsOn": [
        {
          "containerName": "envoy",
          "condition": "HEALTHY"
        }
      ]
    },
    {
      "name": "envoy",
      "image": "{{840364872350}}.dkr.ecr.{{us-west-2}}.amazonaws.com/aws-appmesh-envoy:v1.34.13.1-prod",
      "essential": true,
      "environment": [
        {
          "name": "APPMESH_VIRTUAL_NODE_NAME",
          "value": "mesh/{{apps}}/virtualNode/{{serviceB}}"
        }
      ],
      "healthCheck": {
        "command": [
          "CMD-SHELL",
          "curl -s http://localhost:9901/server_info | grep state | grep -q LIVE"
        ],
        "startPeriod": {{10}},
        "interval": {{5}},
        "timeout": {{2}},
        "retries": {{3}}
      },
      "user": "{{1337}}"
    }
  ],
  "requiresCompatibilities" : [ "EC2" ],
  "taskRoleArn" : "arn:aws:iam::{{123456789012}}:role/{{ecsTaskRole}}",
  "executionRoleArn" : "arn:aws:iam::{{123456789012}}:role/{{ecsTaskExecutionRole}}",
  "networkMode": "awsvpc"
}
```

**Example 를 사용한 Amazon ECS 작업 정의용 JSON AWS X-Ray - EC2 시작 유형**  

```
{
  "family": "{{taskB}}",
  "memory": "{{256}}",
   "cpu" : "{{1024}}",
  "proxyConfiguration": {
    "type": "APPMESH",
    "containerName": "envoy",
    "properties": [
      {
        "name": "IgnoredUID",
        "value": "{{1337}}"
      },
      {
        "name": "ProxyIngressPort",
        "value": "15000"
      },
      {
        "name": "ProxyEgressPort",
        "value": "15001"
      },
      {
        "name": "AppPorts",
        "value": "{{9080}}"
      },
      {
        "name": "EgressIgnoredIPs",
        "value": "169.254.170.2,169.254.169.254"
      },
      {
        "name": "EgressIgnoredPorts",
        "value": "{{22}}"
      }
    ]
  },
  "containerDefinitions": [
    {
      "name": "{{appName}}",
      "image": "{{appImage}}",
      "portMappings": [
        {
          "containerPort": {{9080}},
          "hostPort": {{9080}},
          "protocol": "tcp"
        }
      ],
      "essential": true,
      "dependsOn": [
        {
          "containerName": "envoy",
          "condition": "HEALTHY"
        }
      ]
    },
    {
      "name": "envoy",
      "image": "{{840364872350}}.dkr.ecr.{{us-west-2}}.amazonaws.com/aws-appmesh-envoy:v1.34.13.1-prod",
      "essential": true,
      "environment": [
        {
          "name": "APPMESH_VIRTUAL_NODE_NAME",
          "value": "mesh/{{apps}}/virtualNode/{{serviceB}}"
        },
        {
         "name": "ENABLE_ENVOY_XRAY_TRACING",
         "value": "1"
        }
      ],
      "healthCheck": {
        "command": [
          "CMD-SHELL",
          "curl -s http://localhost:9901/server_info | grep state | grep -q LIVE"
        ],
        "startPeriod": {{10}},
        "interval": {{5}},
        "timeout": {{2}},
        "retries": {{3}}
      },
      "user": "{{1337}}"
    },
    {
      "name": "xray-daemon",
      "image": "amazon/aws-xray-daemon",
      "user": "{{1337}}",
      "essential": true,
      "cpu": 32,
      "memoryReservation": 256,
      "portMappings": [
        {
          "containerPort": 2000,
          "protocol": "udp"
        }
      ]
    }
  ],
  "requiresCompatibilities" : [ "EC2" ],
  "taskRoleArn" : "arn:aws:iam::{{123456789012}}:role/{{ecsTaskRole}}",
  "executionRoleArn" : "arn:aws:iam::{{123456789012}}:role/{{ecsTaskExecutionRole}}",
  "networkMode": "awsvpc"
}
```

## 고급 주제
<a name="advanced-topics-ecs"></a>

### App Mesh를 사용한 Canary 배포
<a name="canary-appmesh-ecs"></a>

Canary 배포 및 릴리스를 통해 애플리케이션의 이전 버전과 새로 배포된 버전 간에 트래픽을 전환할 수 있습니다. 또한 새로 배포된 버전의 상태도 모니터링됩니다. 새 버전에 문제가 있는 경우 Canary 배포는 자동으로 트래픽을 이전 버전으로 다시 전환할 수 있습니다. Canary 배포를 통해 보다 강력하게 애플리케이션 버전 간에 트래픽을 전환할 수 있습니다.

App Mesh를 사용하여 Amazon ECS용 Canary 배포를 구현하는 방법에 대한 자세한 내용은 [App Mesh를 사용하여 Amazon ECS용 Canary 배포를 포함하는 파이프라인 생성](https://aws.amazon.com/blogs/containers/create-a-pipeline-with-canary-deployments-for-amazon-ecs-using-aws-app-mesh/)을 참조하세요.

**참고**  
App Mesh에 대한 더 많은 예제와 연습 내용을 보려면 [App Mesh 예제 리포지토리](https://github.com/aws/aws-app-mesh-examples)를 참조하세요.