

# 共有 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` の状態のままになる可能性があります。名前空間所有者に名前空間へのアクセスの復元をリクエストします。