

# 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 を使用すると、アプリケーションは短縮名と標準ポートを使用して、同じクラスターや他のクラスター (同じ AWS リージョン の VPC を含む) 内の 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 サービス検出

  サービス間の通信のもう 1 つのアプローチは、サービス検出を使用する直接的な通信です。このアプローチでは、Amazon ECS との AWS Cloud Map サービス検出の統合を使用できます。Amazon ECS はサービス検出を使用して、起動されたタスクのリストを AWS Cloud Map に同期します。このホスト名は特定のサービスの 1 つ以上のタスクの内部 IP アドレスに解決される DNS ホスト名を保持します。Amazon VPC の他のサービスは、この DNS ホスト名を使用して、内部 IP アドレスを使用してトラフィックを別のコンテナに直接送信できます。

  このサービス間通信のアプローチでは、レイテンシが低くなります。コンテナ間には余分なコンポーネントはありません。トラフィックは 1 つのコンテナから別のコンテナに直接移動します。

  この方法は、各タスクに固有の IP アドレスが割り当てられる `awsvpc` ネットワークモードを使用する場合に適しています。ほとんどのソフトウェアは、IP アドレスに直接変換される DNS `A` レコードの使用のみをサポートしています。`awsvpc` ネットワークモードを使用する場合、各タスクの IP アドレスは `A` レコードになります。ただし、`bridge` ネットワークモードを使用している場合は、複数のコンテナが同じ IP アドレスを共有している可能性があります。さらに、動的ポートマッピングでは、その 1 つの IP アドレスのポート番号がコンテナにランダムに割り当てられます。この時点では、`A` レコードだけではサービス検出には不十分です。`SRV` レコードも使用する必要があります。このタイプのレコードは IP アドレスとポート番号の両方を記録できますが、アプリケーションを適切に設定する必要があります。使用するビルド済みアプリケーションの中には、`SRV` レコードをサポートしていないものもあります。

  `awsvpc` ネットワークモードのもう 1 つの利点は、サービスごとに固有のセキュリティグループがあることです。このセキュリティ グループを設定して、そのサービスと通信する必要がある特定のアップストリームサービスからの受信接続のみを許可することができます。

  サービス検出を使用するサービス間直接的な通信の主な欠点は、再試行や接続障害に対処するためのロジックを追加する必要があることです。DNS レコードには、キャッシュされる時間を制御する有効期限 (TTL) があります。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` | ホスト | 
| --- | --- | --- | --- | 
| サービス検出 | はい。ただし、クライアントは hostPort を使用せず DNS の SRV レコードを認識する必要があります。 | はい | はい。ただし、クライアントは 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 つのサービスを含む Service Connect ネットワークの例を示しています。各サブネットにつき 1 つのタスクで WordPress を実行するクライアントサービス。各サブネットに 1 つのタスクで MySQL を実行するサーバーサービス。どちらのサービスも、2 つのサブネットに分散された複数のタスクを実行するため、可用性が高く、タスクやアベイラビリティーゾーンの問題に対する耐性があります。実線の矢印は、WordPress から MySQL への接続を示しています。例えば、IP アドレス `172.31.16.1` が設定されたタスク内の WordPress コンテナ内から実行される `mysql --host=mysql` CLI コマンドなどです。このコマンドは、MySQL のデフォルトポートの短縮名 `mysql` を使用します。この名前とポートは、同じタスク内で Service Connect プロキシに接続します。WordPress タスクのプロキシは、ラウンドロビン負荷分散と異常値検出に対する以前の障害情報を使用して、接続する MySQL タスクを選択します。図の実線の矢印で示されているように、プロキシは IP アドレス `172.31.16.2` を使用して MySQL タスクの 2 番目のプロキシに接続します。2 番目のプロキシは、同じタスクでローカル MySQL サーバーに接続します。どちらのプロキシも接続パフォーマンスをレポートし、Amazon ECS と Amazon CloudWatch コンソールのグラフに表示されるため、あらゆる種類のアプリケーションのパフォーマンスメトリクスを同じ方法で取得できます。

![\[最小限の HA サービスを示す Service Connect ネットワークの例\]](http://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/images/serviceconnect.png)


Service Connect では次の用語が使用されます。

**ポート名**  
特定のポートマッピングに名前を割り当てる Amazon ECS タスク定義設定です。この設定は Amazon ECS Service Connect でのみ使用されます。

**クライアントエイリアス**  
エンドポイントで使用されるポート番号を割り当てる Amazon ECS サービス設定です。さらに、クライアントエイリアスはエンドポイントの DNS 名を割り当て、検出名を上書きすることができます。Amazon ECS サービスで検出名が提供されていない場合、クライアントエイリアス名がエンドポイント名としてポート名に上書きされます。エンドポイントの例については、*エンドポイント*の定義を参照してください。1 つの Amazon ECS サービスに複数のクライアントエイリアスを割り当てることができます。この設定は Amazon ECS Service Connect でのみ使用されます。

**検出名**  
タスク定義から指定されたポートにオプションとして作成できる中間名。この名前は AWS Cloud Map サービスの作成に使用されます。この名前が指定されていない場合は、タスク定義からのポート名が使用されます。特定のポートおよび Amazon ECS サービスに複数の検出名を割り当てることができます。この設定は Amazon ECS Service Connect でのみ使用されます。  
AWS Cloud Map サービス名は、名前空間内で一意である必要があります。この制限により、各名前空間の特定のタスク定義に対し、検出名のない Service Connect 設定は 1 つしか使用できません。

**エンドポイント**  
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 サービス内の 1 つのエンドポイントの設定です。これは Service Connect 設定の一部で、コンソールの **[Service Connect and discovery name configuration]** (Service Connect および検出名の設定) の中の 1 行、または Amazon ECS サービスにおける JSON 設定の `services` リストの中の 1 つのオブジェクトで構成されます。この設定は 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 デベロッパーガイド*」の「[クロスアカウント AWS Cloud Map 名前空間共有](https://docs.aws.amazon.com/cloud-map/latest/dg/sharing-namespaces.html)」を参照してください。  
Service Connect は、相互に対話する Amazon ECS タスクの論理グループとして AWS Cloud Map 名前空間を使用します。各 Amazon ECS サービスは 1 つの名前空間のみに属することができます。名前空間内のサービスは、同じ AWS リージョン内の異なる Amazon ECS クラスターに分散できます。名前空間が共有名前空間である場合、サービスは名前空間所有者と名前空間コンシューマー AWS アカウントに分散できます。サービスは、任意の基準で自由に整理できます。

**クライアントサービス**  
ネットワーククライアントアプリケーションを実行するサービスです。このサービスには名前空間が設定されている必要があります。サービス内の各タスクは、Service Connect プロキシコンテナを介して、名前空間のすべてのエンドポイントを検出して接続できます。  
タスク内のいずれかのコンテナが名前空間内のサービスからエンドポイントに接続する必要がある場合は、クライアントサービスを選択します。フロントエンド、リバースプロキシ、またはロードバランサーアプリケーションが、例えば Elastic Load Balancing からなど、他の方法で外部トラフィックを受信する場合は、このタイプの Service Connect 設定を使用できます。

**クライアント/サーバーサービス**  
ネットワークまたはウェブサービスアプリケーションを実行する Amazon ECS サービスです。このサービスには、名前空間と少なくとも 1 つのエンドポイントが設定されている必要があります。サービス内の各タスクには、エンドポイントを使用してアクセスできます。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 は TLS 証明書を 5 日ごとに自動的にローテーションするため、平均して 1 か月あたり 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 設定があり、このデプロイ後に実行を開始した新しいタスクだけです。

つまり、クライアントアプリケーションのオペレーターがアプリの設定が変更されるタイミングを決定しますが、サーバーアプリケーションのオペレーターはいつでも設定を変更できます。名前空間のエンドポイントのリストは、名前空間のサービスがデプロイされるたびに変更される可能性があります。既存のタスクと置換タスクは、最新のデプロイ後も同じように動作し続けます。

次に挙げるサンプルを参考にしてください。

まず、パブリックインターネット上で利用可能なアプリケーションを 1 つの AWS CloudFormation テンプレートと 1 つの CloudFormation スタックで作成していると仮定します。CloudFormation がパブリック検出と到達可能性を作成するのは、フロントエンドクライアントサービスを含めて、最後にする必要があります。フロントエンドクライアントサービスが実行されていて一般に公開されているのに、バックエンドは公開されていないという期間の発生を避けるために、サービスの作成はこの順序で行う必要があります。これにより、その期間中にエラーメッセージが一般に送信されるのを防ぐことができます。AWS CloudFormation では `dependsOn` を使用して、複数の Amazon ECS サービスを並列または同時に作成できないことを CloudFormation に示す必要があります。クライアントタスクが接続するバックエンドクライアント/サーバーサービスごとに、フロントエンドクライアントサービスに `dependsOn` を追加する必要があります。

次に、フロントエンドサービスが Service Connect 設定なしで存在すると仮定します。タスクは既存のバックエンドサービスに接続しています。まず、フロントエンドが使用する **DNS** または `clientAlias` と同じ名前を使用して、バックエンドサービスにクライアント/サーバー Service Connect 設定を追加します。これにより、新しいデプロイが作成されると共に、すべてのデプロイのロールバック検出や、AWS マネジメントコンソール、AWS CLI、AWS SDK などの、バックエンドサービスをロールバックして以前のデプロイと設定に戻す方法が作成されます。バックエンドサービスのパフォーマンスと動作に問題がなければ、クライアントまたはクライアント/サーバー Service Connect 設定をフロントエンドサービスに追加します。それらの新しいタスクに追加された Service Connect プロキシを使用するのは、新しいデプロイのタスクのみです。この設定に問題がある場合は、デプロイロールバック検出または AWS マネジメントコンソール、AWS CLI、AWS SDK などのバックエンドサービスをロールバックして以前のデプロイと設定に戻す方法を使用することで、ロールバックして以前の設定に戻すことができます。Service Connect ではなく DNS に基づく別のサービス検出システムを使用する場合、フロントエンドまたはクライアントアプリケーションは、ローカル DNS キャッシュの有効期限が切れてから新しいエンドポイントと変更されたエンドポイント設定の使用を開始しますが、これには通常数時間かかります。

## ネットワーク
<a name="service-connect-concepts-network"></a>

デフォルトでは、Service Connect プロキシは、タスク定義ポートマッピングから `containerPort` をリッスンします。セキュリティグループルールでは、クライアントが実行されるサブネットからこのポートへの受信 (イングレス) トラフィックを許可する必要があります。

Service Connect サービス設定でポート番号を設定した場合であっても、Service Connect プロキシがリッスンするクライアント/サーバーサービスのポートは変更されません。このポート番号を設定すると、Amazon ECS はそれらのタスク内の Service Connect プロキシ上で、クライアントサービスが接続するエンドポイントのポートを変更します。クライアントサービスのプロキシは、`containerPort` を使用してクライアント/サーバーサービスのプロキシに接続します。

Service Connect プロキシがリッスンするポートを変更する場合は、クライアント/サーバーサービスの Service Connect 設定で `ingressPortOverride` を変更してください。このポート番号を変更する場合は、このサービスへのトラフィックが使用するこのポートのインバウンドトラフィックを許可する必要があります。

Service Connect 用に設定された Amazon ECS サービスにアプリケーションが送信するトラフィックは、Amazon VPC およびサブネットにおいて、ルートテーブルルールおよびネットワーク ACL ルールにより、使用している `containerPort` と `ingressPortOverride` のポート番号が許可されている必要があります。

 Service Connect を使用して VPC 間でトラフィックを送信できます。ルートテーブルルール、ネットワーク ACL、セキュリティグループに対する同じ要件が両方の VPC に適用されます。

例えば、2 つのクラスターは異なる VPC でタスクを作成します。各クラスターのサービスは、同じ名前空間を使用するように設定されています。これら 2 つのサービスのアプリケーションは、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 ユニットと 64 MiB 以上のメモリを追加することをお勧めします。AWS Fargate では、ユーザーが設定できる最小のメモリ容量は 512 MiB です。Amazon EC2 では、タスク定義メモリが必要です。
+ サービスでは、Service Connect 設定でログ設定を設定します。
+ このサービスのタスクがピーク負荷時に 1 秒あたり 500 を超えるリクエストを受信すると予想される場合は、Service Connect プロキシコンテナのこのタスク定義で、タスク CPU に 512 CPU ユニットを追加することをお勧めします。
+ 名前空間内に 100 個以上の Service Connect サービス、または名前空間内のすべての Amazon ECS サービスに合計で 2000 個以上のタスクを作成する場合、Service Connect プロキシコンテナのタスクに対して 128 MiB のメモリを追加することをお勧めします。これは、名前空間内のすべての Amazon ECS サービスで使用されるすべてのタスク定義で行う必要があります。

**プロキシ設定**  
アプリケーションは、アプリケーションと同じタスクでサイドカーコンテナ内のプロキシに接続します。Amazon ECS は、アプリケーションが同じ名前空間のエンドポイント名に接続されている場合にのみアプリケーションがプロキシに接続するように、タスクとコンテナを設定します。その他のすべてのトラフィックはプロキシを使用しません。他のトラフィックには、同じ VPC 内の IP アドレス、AWS サービス エンドポイント、外部トラフィックが含まれます。

**負荷分散**  
Service Connect は、Service Connect エンドポイントのタスク間の負荷分散にラウンドロビン方式を使用するようにプロキシを設定します。接続元のタスクにあるローカルプロキシは、エンドポイントを提供するクライアントサーバーサービス内のタスクの 1 つを選択します。  
例えば、「*local*」という名前空間の*クライアントサービス*として設定されたサービスで WordPress を実行するタスクについて考えてみます。MySQL データベースを実行する 2 つのタスクを持つ、他のサービスがあります。このサービスは、同じ名前空間内の Service Connect を通じて `mysql` と呼ばれるエンドポイントを提供するように構成されています。WordPress タスクでは、WordPress アプリケーションはエンドポイント名を使用してデータベースに接続します。この名前への接続は、同じタスクのサイドカーコンテナで実行されるプロキシに送られます。その後、プロキシはラウンドロビン方式を使用してどちらの MySQL タスクにも接続できます。  
負荷分散戦略: ラウンドロビン

**外れ値の検知**  
この機能では、以前に失敗した接続についてプロキシが保持しているデータを使用して、失敗した接続があったホストに新しい接続を送信しないようにします。Service Connect は、プロキシの外れ値検出機能を設定して、パッシブなヘルスチェックを提供します。  
前の例を使用すると、プロキシはいすれかの MySQL タスクに接続できます。プロキシが特定の MySQL タスクに複数の接続を行い、直近 30 秒間以内に 5 つ以上の接続が失敗した場合、プロキシはその MySQL タスクを 30 ～ 300 秒間回避します。

**再試行**  
Service Connect は、プロキシを通過して失敗した接続を再試行するようにプロキシを設定し、2 回目の試行では、前の接続のホストを使用しません。これにより、Service Connect を介した各接続が 1 回限りの理由で失敗することがなくなります。  
再試行回数: 2

**タイムアウト**  
Service Connect は、クライアント/サーバーアプリケーションが応答するまで最大時間待機するようにプロキシを構成します。デフォルトのタイムアウト値は 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 を使用する場合は、次の点を考慮してください。
+ Fargate で実行されるタスクが Service Connect を使用するには、Fargate Linux プラットフォームバージョン `1.4.0` 以上を使用する必要があります。
+ コンテナインスタンスの Amazon ECS エージェントバージョンには `1.67.2` 以降が必要です。
+ コンテナインスタンスが Service Connect を使用するには、Amazon ECS 最適化 Amazon Linux 2023 AMI バージョン `20230428` 以降、または Amazon ECS 最適化 Amazon Linux 2 AMI バージョン `2.0.20221115` を実行する必要があります。これらのバージョンには、Amazon ECS コンテナエージェントに加えて Service Connect エージェントがあります。Service Connect エージェントの詳細については、GitHub の「[Amazon ECS Service Connect エージェント](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)」を参照してください。
+ 各サービスは 1 つの名前空間のみに属することができます。
+ サービスが作成したタスクのみがサポートされます。
+ すべてのエンドポイントは、名前空間内で一意である必要があります。
+ すべての検出名は、名前空間内で一意である必要があります。
+ アプリケーションが新しいエンドポイントを解決できるようにするには、既存のサービスを再デプロイする必要があります。最新のデプロイ後に名前空間に追加された新しいエンドポイントは、タスク構成には追加されません。詳細については、「[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)` パラメータを使用してください。
+ Service Connect with TLS は `bridge` ネットワークモードをサポートしていません。`awsvpc` ネットワークモードのみサポートされています。
+ `awsvpc` モードでは、Service Connect プロキシは IPv4 専用およびデュアルスタック設定のサービスの IPv4 localhost `127.0.0.1` にトラフィックを転送します。IPv6 専用設定のサービスの場合、プロキシはトラフィックを IPv6 localhost `::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)」を参照してください。 | はい | 
| サービスの定義 | クライアント/サーバー | サーバーサービスは、サービスが利用できる DNS 名、ポート番号、名前空間を設定するために serviceConnectConfiguration を追加する必要があります。詳細については、「[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 名前空間を使用してクラスターを作成するか、共有名前空間を使用する、または名前空間を個別に作成します。単純に構成できるように、名前空間に必要な名前でクラスターを作成し、名前空間に同名を指定します。この場合、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 プロキシ](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]** (ポート) を使用するか、`discoveryName`、`clientAliases` それぞれを Amazon ECS API で使用します。

## 初期ヘルスチェックの設定
<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 デベロッパーガイド*」の「[クロスアカウント AWS Cloud Map 名前空間共有](https://docs.aws.amazon.com/cloud-map/latest/dg/sharing-namespaces.html)」を参照してください。

**重要**  
Service Connect が名前空間で適切に動作するには、`AWSRAMPermissionCloudMapECSFullPermission` マネージドアクセス許可を使用して名前空間を共有する必要があります。

Service Connect で共有 AWS Cloud Map 名前空間を使用する場合は、複数の AWS アカウントのサービスが同じサービス名前空間に参加できます。これは、複数の AWS アカウントが存在する組織で、セキュリティと分離を維持しながら、アカウントの境界を越えてサービス間通信を維持する必要がある場合に特に有効です。

**注記**  
異なる VPC にあるサービスと通信するには、VPC 間接続を設定する必要があります。これは、VPC ピアリング接続を使用して実現できます。詳細については、「*Amazon Virtual Private Cloud ピアリングガイド*」の「[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 マネジメントコンソールを使用して共有するための名前空間を作成するには**

1. [https://console.aws.amazon.com/cloudmap/](https://console.aws.amazon.com/cloudmap/) で AWS Cloud Map コンソールを開きます。

1. [**名前空間の作成**] を選択します。

1. **名前空間名**を入力します。この名前は、すべての参加アカウントのサービスによって使用されます。

1. **[名前空間タイプ]** で、ユースケースに適したタイプを選択します。
   + **API コール** – DNS 機能のないサービス検出用の HTTP 名前空間。
   + **VPC での API コールと DNS クエリ** – VPC 内のプライベート DNS クエリを使用したサービス検出用のプライベート DNS 名前空間。
   + **API コールとパブリック DNS クエリ** – パブリック DNS クエリによるサービス検出用のパブリック DNS 名前空間。

1.  [**名前空間の作成**] を選択します。

## ステップ 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. **[Name]** (名前) に、リソース共有のわかりやすい名前を入力します。

1. **[リソース]** セクションで、次の操作を行います。

   1. **[リソースタイプ]**で、**クラウドマップ名前空間**を選択します。

   1. 前のステップで作成した名前空間を選択します。

1. **[マネージドアクセス許可]** セクションで、**[AWSRAMPermissionCloudMapECSFullPermission]** を指定します。
**重要**  
Service Connect が名前空間で適切に動作するには、`AWSRAMPermissionCloudMapECSFullPermission` マネージドアクセス許可を使用して名前空間を共有する必要があります。

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. ナビゲーションペインで **[Shared with me]** (自分と共有)、**[リソース共有]** の順に選択します。

1. リソース共有の招待を選択し、**[リソースの共有を承認]** を選択します。

1. 同意したら、リソースの詳細から共有名前空間 ARN を書き留めます。この ARN は、Service Connect サービスを設定する際に使用します。

## ステップ 4: 共有名前空間を使用して Amazon ECS サービスを設定する
<a name="service-connect-shared-namespaces-configure"></a>

共有名前空間を受け入れると、名前空間コンシューマーは、共有名前空間を使用するように Amazon ECS サービスを設定できます。設定は通常の名前空間の使用と類似していますが、名前の代わりに名前空間 ARN を指定する必要があります。サービス作成手順の詳細については、「[Amazon ECS のローリング更新デプロイの作成](create-service-console-v2.md)」を参照してください。

**AWS マネジメントコンソールを使用して共有名前空間でサービスを作成するには**

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. サービスの作成プロセスを完了します。

AWS CLI または AWS SDK を使用してサービスを設定するには、`serviceConnectConfiguration` の `namespace` パラメータで共有名前空間 ARN を指定します。

```
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 名前空間のすべての名前空間タイプがサポートされています。
+ 共有名前空間へのアクセスが取り消されると、名前空間とのやり取りを必要とする Amazon ECS オペレーション (`CreateService`、`UpdateService`、`ListServicesByNamespace` など) は失敗します。共有名前空間のアクセス許可に関する問題のトラブルシューティングの詳細については、「[共有 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)」を参照してください。

アクセス許可の問題に関連するエラーメッセージは、アクセス許可が欠落していることが原因で、または名前空間へのアクセスが取り消された場合に表示されます。

**重要**  
Service Connect が名前空間で適切に動作するには、`AWSRAMPermissionCloudMapECSFullPermission` マネージドアクセス許可を使用して名前空間を共有する必要があります。

エラーメッセージは、次のいずれかの形式で表示されます。

<OperationName> オペレーションを呼び出すときにエラー (ClientException) が発生しました: ユーザー: arn:aws:iam::<account-id>:user/<user-name> にはリソース: <ResourceArn> に対して <ActionName> を実行するための権限が付与されていません: これは、リソースベースのポリシーで <ActionName> アクションが許可されていないためです

この形式のエラーメッセージは、次のシナリオにおいて生成される可能性があります。

**クラスターの作成または更新の失敗**  
これらの問題は、`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 を使用します。
+ リソース共有がアクティブであり、招待が承諾されていることを確認します。

ユーザー: <iam-user> は、ID ベースのポリシーで明示的に拒否されたリソース: <ResourceArn> に対して <ActionName> を実行することを承認されていません。

この形式のエラーメッセージは、次のシナリオにおいて生成される可能性があります。

**サービスの削除が失敗し、`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` に書き込まれます。アクセスログをアプリケーションログから分離するには、カスタムの Fluent Bit または Fluentd の設定で `awsfirelens` ログドライバーを使用することをお勧めします。
+  `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 ドキュメントの「[コマンド演算子](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 マネジメントコンソールを使用して共有名前空間でサービスを作成するには**

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 Service Connect 間のトラフィックを暗号化するための TLS 証明書が Amazon ECS によって自動的にプロビジョニングされます。Amazon ECS は、トラフィックの暗号化に使用される TLS 証明書を生成、ローテーション、および配布します。

Service Connect による自動トラフィック暗号化は、業界をリードする暗号化機能を使用してサービス間の通信を保護し、セキュリティ要件を満たすのに役立ちます。`256-bit ECDSA` および `2048-bit RSA` 暗号化で AWS Private Certificate Authority TLS 証明書と暗号化をサポートしています。また、プライベート証明書と署名キーを完全に制御できるため、コンプライアンス要件を満たすのに役立ちます。デフォルトでは、TLS 1.3 はサポートされていますが、TLS 1.0 ～ 1.2 はサポートされていません。Service Connect は、次の暗号を使用して 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>

Service Connect は、Application Load Balancer のヘルスチェックと TLS 1.3 暗号化を使って使用できます。

### Application Load Balancer の設定
<a name="service-connect-tls-alb-config"></a>

Application Load Balancer を次の設定に従って設定します。
+ TLS 1.3 セキュリティポリシー (「ELBSecurityPolicy-TLS13-1-2-2021-06」など) を使用して TLS リスナーを設定します。詳細については、「[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 は汎用モードと短時間有効モードの 2 つのモードで実行できます。
+ 汎用 — 任意の有効期限を設定できる証明書を発行します。
+ 短い有効期間 — 最大有効期間が 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** 日を超えると、アプリケーションの通信は失敗します。
+ シークレットの削除 - シークレットを削除するとローテーションが失敗し、お客様のアプリケーション通信に影響があります。

シークレットローテーションに失敗すると、[AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html) で `RotationFailed` イベントがに公開されます。`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` を自分に追加してください。

**Infrastructure as Code**  
Infrastructure as Code (IaC) ツールで Service Connect TLS を使用する場合は、サービスがドレイン状態のままになるという問題を避けるため、依存関係を正しく設定することが重要です。AWS KMS キーが提供されている場合は、Amazon ECS サービスを終了した後、IAM ロールと AWS Private CA 依存関係を削除する必要があります。

Service Connect に使用される名前空間が共有名前空間である場合は、共有 AWS Private CA リソースを使用することを選択できます。詳細については、「*AWS Private Certificate Authority ユーザーガイド*」の「[クロスアカウントアクセス許可をアタッチする](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 とやり取りする方法を理解することで、自動 TLS 暗号化の利点を活用しながら、Amazon ECS サービスのセキュリティをより適切に管理できます。

## 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 デベロッパーガイド*」の「[キーポリシーを作成する](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 デベロッパーガイド*」の「[対称暗号化 AWS KMS キー](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 マネジメントコンソール を使用して既存のネームスペース内のサービスのトラフィック暗号化を有効にするには**

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 のやりとりを認識することはありません。次の手順を使用して、TLS が有効になっていることを確認します。

1. アプリケーションイメージに `openssl` CLI を含めます。

1. SSM 経由でタスクに接続するには、サービスで [ECS Exec](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-exec.html) を有効にします。代わりに、サービスと同じ Amazon VPC で Amazon EC2 インスタンスを起動することもできます。

1. 検証したいサービスからタスクの IP とポートを取得します。タスクの IP アドレスは AWS Cloud Map コンソールで取得できます。この情報は、名前空間のサービス詳細ページに記載されています。

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 サービスを作成できます。

**注記**  
デュアルスタックサービスエンドポイントを使用することで、IPv4 と IPv6 の両方を介して AWS CLI、SDK、および Amazon ECS API から Amazon ECS とやり取りできます。詳細については、「[Amazon ECS デュアルスタックエンドポイントの使用](dual-stack-endpoint.md)」を参照してください。

## 前提条件
<a name="create-service-connect-prereqs"></a>

Service Connect の前提条件は次のとおりです。
+ AWS CLI の最新バージョンがインストールされ、設定されていることを確認します。詳細については、「[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、サブネット、ルートテーブルおよびセキュリティグループが使用できるように作成されています。詳細については、「[仮想プライベートクラウドを作成する](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 マネジメントコンソールまたは通常の 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 上の複数のアプリケーションを相互接続することを目的としています。これらのアプリケーションの少なくとも 1 つは、接続するウェブサービスを提供する必要があります。このステップでは、以下を作成します。
+ 未修正の公式 NGINX コンテナイメージを使用し、Service Connect 設定を含むタスク定義。
+ このサービスへのトラフィック用にサービス検出とサービスメッシュプロキシを提供するために Service Connect を設定する Amazon ECS サービス定義。この構成では、クラスター構成からデフォルトの名前空間を再利用することで、各サービスに対して行うサービス構成の量を減らします。
+ Amazon ECS サービス。タスク定義を使用して 1 つのタスクを実行し、Service Connect プロキシ用の追加コンテナを挿入します。プロキシは、タスク定義のコンテナポートマッピングからポートをリッスンします。Amazon ECS で実行されているクライアントアプリケーションで、クライアントタスクのプロキシは、タスク定義ポート名、サービス検出名またはサービスクライアントエイリアス名、およびクライアントエイリアスからのポート番号へのアウトバウンド接続をリッスンします。

**Service Connect を使用してウェブサービスを作成するには**

1. Fargate と互換性があり、`awsvpc` ネットワークモードを使用するタスク定義を登録します。以下の手順に従ってください。

   1. 次のタスク定義の内容で、`service-connect-nginx.json` というファイルを作成します。

      このタスク定義は、ポートマッピングに `name` および `appProtocol` パラメータを追加することによって Service Connect を構成します。複数のポートが使用されている場合、ポート名によりサービス構成でこのポートをより識別しやすくなります。また、ポート名は、名前空間内の他のアプリケーションが使用する検出可能な名前としてもデフォルトで使用されています。

      サービスでは ECS Exec が有効になっているため、タスク定義にはタスク IAM ロールが含まれています。
**重要**  
このタスク定義では、`logConfiguration` を使用して `stdout` および `stderr` から Amazon CloudWatch Logs に nginx 出力を送信します。このタスク実行ロールには、CloudWatch Logs ロググループを作成するために必要な追加の権限はありません。AWS マネジメントコンソールまたは 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` という名前のファイルを作成します。この例では、前のステップで作成したタスク定義を使用します。このタスク定義の例では `awsvpc` ネットワークモードを使用しているため、`awsvpcConfiguration` が必要となります。

      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 マネジメントコンソールまたは 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` は、出力の最初の*デプロイ*内に表示されます。タスクに変更を加える必要がある方法で 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 マネジメントコンソールまたは AWS CLI に移動して Elastic Network Interface の詳細を取得する必要があります。

  この例では、同じ VPC 内の Amazon EC2 インスタンスはタスクのプライベート IP を使用します。アプリケーションは nginx ですが、`server: envoy` ヘッダーには Service Connect プロキシが使用されていることが表示されます。Service Connect プロキシはタスク定義のコンテナポートをリッスンしています。

  ```
  $ curl -v 10.0.19.50:80/
  *   Trying 10.0.19.50:80...
  * Connected to 10.0.19.50 (10.0.19.50) port 80 (#0)
  > GET / HTTP/1.1
  > Host: 10.0.19.50
  > User-Agent: curl/7.79.1
  > Accept: */*
  >
  * Mark bundle as not supporting multiuse
  < HTTP/1.1 200 OK
  < server: envoy
  < date: Tue, 23 Aug 2022 03:53:06 GMT
  < content-type: text/html
  < content-length: 612
  < last-modified: Tue, 16 Apr 2019 13:08:19 GMT
  < etag: "5cb5d3c3-264"
  < accept-ranges: bytes
  < x-envoy-upstream-service-time: 0
  <
  <!DOCTYPE html>
  <html>
  <head>
  <title>Welcome to nginx!</title>
  <style>
      body {
          width: 35em;
          margin: 0 auto;
          font-family: Tahoma, Verdana, Arial, sans-serif;
      }
  </style>
  </head>
  <body>
  <h1>Welcome to nginx!</h1>
  <p>If you see this page, the nginx web server is successfully installed and
  working. Further configuration is required.</p>
  
  <p>For online documentation and support please refer to
  <a href="http://nginx.org/">nginx.org</a>.<br/>
  Commercial support is available at
  <a href="http://nginx.com/">nginx.com</a>.</p>
  
  <p><em>Thank you for using nginx.</em></p>
  </body>
  </html>
  ```

**Service Connect メトリクスを表示するには**  
Service Connect プロキシは、アプリケーション (HTTP、HTTP2、gRPC、または TCP 接続) メトリクスを CloudWatch メトリクス内に作成します。CloudWatch コンソールを使用する場合、Amazon ECS 名前空間にある **[DiscoveryName]**、(**[DiscoveryName, ServiceName, ClusterName]**)、**[TargetDiscoveryName]**、および (**[TargetDiscoveryName, ServiceName, ClusterName]**) という追加のメトリクスディメンションを確認します。これらのメトリクスおよびディメンションの詳細については、「Amazon CloudWatch Logs ユーザーガイド」の「[利用可能なメトリクスを表示する](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 MapAmazon ECS サービスの HTTP および DNS 名前空間を管理する API アクション。詳細については、『[AWS Cloud Map 開発者ガイド](https://docs.aws.amazon.com/cloud-map/latest/dg/Welcome.html)』の「*AWS Cloud Map とは*」を参照してください。

サービスの検出はリ以下の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  | 
|  中東 (アラブ首長国連邦)  |  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 Reference Guide」の「`[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 アクションを介してサービスを検索し、サービスに接続するために使用できる 1 つ以上の利用可能なエンドポイントを返すことができます。
+ **サービスディスカバリインスタンス**: サービスディスカバリサービスにあり、サービスディレクトリ内の各 Amazon ECS サービスに関連付けられた属性で構成されます。
  + **インスタンスの属性**: 次のメタデータは、サービスディスカバリ を使用するように設定された各 Amazon ECS サービスのカスタム属性として追加されます。
    + **`AWS_INSTANCE_IPV4`** –`A` レコードの場合、インスタンスの詳細が検出されると、Route 53 など、DNS クエリへの応答として AWS Cloud Map が返す IPv4 アドレスおよび `192.0.2.44` が返されます。
    + **`AWS_INSTANCE_IPV6`** –`AAAA` レコードの場合は、インスタンスの詳細が検出されると、Route 53 など、DNS クエリへの応答として AWS Cloud Map が返す IPv6 アドレスおよび ` 2001:0db8:85a3:0000:0000:abcd:0001:2345` が返されます。`AWS_INSTANCE_IPv4` と `AWS_INSTANCE_IPv6` の両方が Amazon ECS デュアルスタックサービスに追加されます。Amazon ECS IPv6 専用サービスにのみ `AWS_INSTANCE_IPv6` が追加されます。
    + **`AWS_INSTANCE_PORT`** – サービスディスカバリサービスに関連付けられたポート値。
    + **`AVAILABILITY_ZONE`** – タスクが起動したアベイラビリティーゾーン。EC2 を使用するタスクの場合、これはコンテナインスタンスが存在するアベイラビリティーゾーンです。Fargate を使用するタスクの場合、これは Elastic Network Interface が存在するアベイラビリティーゾーンです。
    + **`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 属性を設定する必要があります。属性の設定方法については、を参照してください。[VPC の DNS サポート](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html#vpc-dns-support)の*Amazon VPC User Guide*。
+ Amazon ECS は、共有 AWS Cloud Map 名前空間へのサービスの登録をサポートしていません。
+ パブリック名前空間が使用されている場合でも、 サービス用に作成された DNS レコードは、パブリック IP アドレスではなく、タスクのプライベート IP アドレスに常に登録されます。
+ &service-discovery-first; では、`awsvpc`、`bridge`、`host` のいずれかのネットワークモードをタスクで指定する必要があります (`none` はサポートされていません)。
+ サービスタスク定義が `awsvpc` ネットワークモードを使用する場合、各サービスタスクに `A` または `SRV` のレコードを自由に組み合わせて作成できます。`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 は DNS クエリに最大 8 つの異常なレコードを返します。
+ サービス検出はロードバランサーの背後にあるサービスに設定できますが、サービス検出トラフィックは必ずタスクにルーティングされ、ロードバランサーにはルーティングされません。
+ サービス検出は Classic Load Balancer の使用をサポートしていません。
+ Amazon ECS サービスのサービス検出により管理されるコンテナレベルのヘルスチェックを使用することをお勧めします。
  + **HealthCheckCustomConfig**—Amazon ECS; はユーザーに代わってヘルスチェックを管理します。Amazon ECS は、コンテナとヘルスチェックの情報、およびタスクの状態を使用して、ヘルスを AWS Cloud Map で更新します。これは、`--health-check-custom-config`パラメータを使用してサービス検出サービスの作成時に指定します。詳細については、*AWS Cloud MapAPI リファレンス*の「[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)」 を参照してください。

**注記**  
デュアルスタックサービスエンドポイントを使用することで、IPv4 と IPv6 の両方を介して AWS CLI、SDK、および Amazon ECS API から 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 ポリシー例で指定されている必要なアクセス権限があること。
+ 少なくとも 1 つの VPC と 1 つのセキュリティグループを作成している。詳細については、「[仮想プライベートクラウドを作成する](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` という名前のファイルを作成します。この例では、前のステップで作成したタスク定義を使用します。このタスク定義の例では `awsvpc` ネットワークモードを使用しているため、`awsvpcConfiguration` が必要となります。

      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. サービス検出サービス用に Route 53 ホストゾーンに作成された DNS レコードは、次の AWS CLI コマンドでクエリを実行できます。

   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 のお客様は、AWS Resource Access Manager を使用したクラスター、VPC、アカウント間のサービスへの接続、認可と認証のための IAM 統合、高度なトラフィック管理機能など、VPC Lattice の他の多くのクロスコンピューティング接続、セキュリティ、オブザーバビリティ機能を利用することもできます。

Amazon ECS のお客様は、以下の方法で VPC Lattice の恩恵を受けることができます。
+ デベロッパーの生産性の向上 - VPC Lattice は、ネットワーク、セキュリティ、オブザーバビリティの課題をすべてのコンピューティングプラットフォームにおいて統一された方法で処理することで、機能の構築に集中できるようにし、デベロッパーの生産性を向上させます。
+ セキュリティ体制の向上 - VPC Lattice を使用すると、デベロッパーはアプリケーションとコンピューティングプラットフォーム間の通信を簡単に認証および保護し、転送中の暗号化を適用して、VPC Lattice Auth ポリシーを用いたきめ細かなアクセス制御を適用できます。これにより、業界をリードする規制およびコンプライアンス要件を満たす、より強力なセキュリティ体制を採用できます。
+ アプリケーションのスケーラビリティと耐障害性の向上 - VPC Lattice では、パス、ヘッダー、メソッドベースのルーティング、認証、認可、モニタリングなどの機能を持つデプロイされたアプリケーションのネットワークを作成できます。これらの利点は、ワークロードのリソースオーバーヘッドなしで提供され、大幅なレイテンシーを発生させることなく、1 秒あたり数百万のリクエストを生成するマルチクラスターデプロイをサポートできます。
+ 異種インフラストラクチャによるデプロイの柔軟性 - VPC Lattice は、Amazon ECS、Fargate、Amazon EC2、Amazon EKS、Lambda などのすべてのコンピューティングサービスで一貫した機能を提供し、組織が各アプリケーションに適したインフラストラクチャを柔軟に選択できるようにします。

## VPC Lattice が他の Amazon ECS サービスと連携する仕組み
<a name="ecs-lattice-compatibility"></a>

Amazon ECS で VPC Lattice を使用すると、他の Amazon ECS サービスの使用方法が変わる可能性がありますが、他は変わりません。

**アプリケーション ロード バランサー**  
VPC Lattice の Application Load Balancer ターゲットグループタイプで使用するための、Amazon ECS サービスにリンクする特定の Application Load Balancer を作成する必要がなくなりました。代わりに VPC Lattice ターゲットグループを使用して Amazon ECS サービスを設定するだけで済みます。同時に、Amazon ECS で Application Load Balancer を引き続き使用することを選択することもできます。

**Amazon ECS ローリングデプロイ**  
VPC Lattice では Amazon ECS ローリングデプロイのみが使用可能であり、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 マネジメントコンソールまたは 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)」を参照してください。
**注記**  
デュアルスタックサービスエンドポイントを使用することで、IPv4 と IPv6 の両方を介して AWS CLI、SDK、および Amazon ECS API から 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 マネジメントコンソールで VPC Lattice を使用するサービスを作成する
<a name="ecs-lattice-create-console"></a>

AWS マネジメントコンソールを使用して VPC Lattice でサービスを作成するには、次のステップに従います。

1. コンソール ([https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)) を開きます。

1. ナビゲーションページで、**[クラスター]** を選択します。

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. **[ターゲットグループ]** で、1 つまたは複数のターゲットグループを選択します。少なくとも 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 サービスは複数のターゲットグループを持つことができますが、各ターゲットグループは 1 つのサービスにのみ追加できます。
IPv6 専用設定でサービスを作成するには、IP アドレスタイプが `IPv6` のターゲットグループを選択します。

1. この時点で、VPC Lattice コンソールに移動してセットアップを続行します。ここでは、リスナーのデフォルトアクションまたは既存の VPC Lattice サービスのルールに新しいターゲットグループを含めます。

   詳細については、「[Listener rules for your VPC Lattice service](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 でサービスを作成します。各*ユーザー入力プレースホルダー*を独自の情報に置き換えます。

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 ファイルは、VPC Lattice ターゲットグループに Amazon ECS サービスをアタッチするために使用される例です。以下の例の `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 ではサポートされていません。