

# API プロバイダー: AWS RAM を使用してプライベートカスタムドメイン名を共有する
<a name="apigateway-private-custom-domains-provider-share"></a>

他の AWS アカウント の API コンシューマーにプライベートカスタムドメイン名へのアクセス権を付与できます。このセクションでは、AWS RAM を使用してプライベートカスタムドメイン名を共有する方法と、プライベートカスタムドメイン名へのアクセスを制御する方法について説明します。

## プライベートカスタムドメイン名を共有する際の考慮事項
<a name="apigateway-private-custom-domains-provider-share-considerations"></a>

次の考慮事項は、AWS RAM を使用してプライベートカスタムドメイン名へのアクセス権を付与する方法に影響する可能性があります。AWS RAM を使用せずにプライベートカスタムドメイン名を共有する方法については、「[API プロバイダー: API Gateway AWS CLI を使用してプライベートカスタムドメイン名を共有する](apigateway-private-custom-domains-provider-share-cli.md)」を参照してください。
+ プライベートカスタムドメイン名は AWS リージョン レベルで共有されます。プライベートカスタムドメイン名と VPC エンドポイントの両方が同じ AWS リージョン に存在する必要があります。
+ 1 つのリソース共有で複数のプリンシパルを使用でき、リソース共有の作成後も新しいプリンシパルを追加できます。可能であれば、リソース共有を再利用することをお勧めします。
+ API コンシューマーの VPC エンドポイントには、プライベートカスタムドメイン名と、それにマッピングされているプライベート API を呼び出すためのアクセスを常に許可する必要があります。
+ API コンシューマーと API プロバイダーが同じ組織に属しており、AWS Organizations を使用している場合、リソース共有は自動的に承認されます。その場合でも、AWS RAM を使用してリソース共有を作成する必要があります。
+ API コンシューマーと API プロバイダーが同じ組織に属していて、AWS Organizations を使用しており、組織内でのリソース共有が有効になっている場合、共有先の組織内のすべてのプリンシパルには、リソース共有へのアクセスが自動的に許可されます。この場合、招待は不要であり、リソース共有の手順を省略できます。
+ API コンシューマーが **12 時間以内**にリソース共有を承認しない場合、API プロバイダーはリソース共有の手順を再度行う必要があります。
+ リソース共有の作成後、明示的な `allow` アクセス権のないプリンシパルへのアクセスを禁止するように、AWS RAM はプライベートカスタムドメイン名の Amazon API Gateway Management サービスに関する `managementPolicy` を更新します。詳細については、IAM ユーザーガイドの「[アカウント内でのリクエストの許可または拒否の決定](https://docs.aws.amazon.com//IAM/latest/UserGuide/reference_policies_evaluation-logic.html#policy-eval-denyallow)」を参照してください。

  更新後の `managementPolicy` は次のようになります。

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

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Id": "abcd1234-1234-abcd-abcd-1234abcdefg",
      "Statement": [
          {
              "Sid": "APIGatewayPrivateDomainNameManagementPolicyDefaultPermission-org",
              "Effect": "Allow",
              "Principal": "*",
              "Action": "apigateway:CreateAccessAssociation",
              "Resource": "arn:aws:apigateway:us-west-2:111122223333:/domainnames/private.example.com+abcd1234",
              "Condition": {
                  "StringEquals": {
                      "aws:PrincipalOrgID": "o-1234abcd"
                  },
                  "StringNotEquals": {
                      "aws:PrincipalAccount": "111122223333"
                  }
              }
          }
      ]
  }
  ```

------

  AWS RAM は以下を追加することで、明示的な `allow` アクセス権のないプリンシパルがプライベートカスタムドメイン名とのアクセス関連付けを作成することを禁止しています。

  ```
  "StringNotEquals": {
      "aws:PrincipalAccount": "111122223333"
  }
  ```

  プライベートカスタムドメイン名を作成した AWS アカウント のプリンシパルは、引き続きドメイン名アクセスの関連付けを作成できます。

## 他のアカウントにプライベートカスタムドメイン名とのドメイン名アクセスの関連付けの作成を許可する
<a name="apigateway-private-custom-domains-provider-management-policy-update"></a>

まず、別のAWS アカウント に、プライベートカスタムドメイン名とのドメイン名アクセスの関連付けを作成するためのアクセスを許可します。

------
#### [ AWS マネジメントコンソール ]

AWS マネジメントコンソール を使用するには、*AWS RAM ユーザーガイド*の「[AWS RAM でのリソース共有の作成](https://docs.aws.amazon.com/ram/latest/userguide/working-with-sharing-create.html)」を参照してください。

**[リソースタイプの選択]** で、[**API Gateway プライベートカスタムドメイン**] を選択します。

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

次の [create-resource-share](https://docs.aws.amazon.com/cli/latest/reference/ram/create-resource-share.html) は、プライベートカスタムドメイン名用のリソース共有を作成します。リソースとプリンシパルの関連付けが完了するまでに数分かかることがあります。プリンシパルには、アカウント ID または組織 ID (`arn:aws:organizations::123456789012:organization/o-1234abcd` など) を指定します。リソース共有には、複数のプリンシパルを指定できます。

```
aws ram create-resource-share \
    --region us-west-2 \
    --name privateCustomDomain-resource-share \
    --permission-arns arn:aws:ram::aws:permission/APIGatewayPrivateDomainNameManagementPolicyDefaultPermission \
    --resource-arns arn:aws:apigateway:us-west-2:111122223333:/domainnames/private.example.com+abcd1234 \
    --principals 222222222222
```

------

別の AWS アカウント へのアクセスの許可後、そのアカウントの API コンシューマーが、VPC エンドポイントとプライベートカスタムドメイン名との間にドメイン名アクセスの関連付けを作成する必要があります。お客様が代わりにドメイン名アクセスの関連付けを作成することはできません。詳細については、「[共有プライベートカスタムドメイン名に VPC エンドポイントを関連付ける](apigateway-private-custom-domains-consumer-create.md#apigateway-private-custom-domains-consumer-associate)」を参照してください。

## 他のアカウントにプライベートカスタムドメイン名の呼び出しを許可する
<a name="apigateway-private-custom-domains-provider-policy-update"></a>

次に、API コンシューマーの VPC エンドポイントに、プライベートカスタムドメイン名とそれにマッピングされているすべてのプライベート API を呼び出すためのアクセスを許可します。

------
#### [ AWS マネジメントコンソール ]

**他のアカウントの VPC エンドポイントにプライベートカスタムドメイン名の呼び出しを許可するには**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway) で API Gateway コンソールにサインインします。

1. メインナビゲーションペインで、**[カスタムドメイン名]** を選択します。

1. 他の AWS アカウント と共有したプライベートカスタムドメイン名を選択します。

1. **[リソースポリシー]** タブで、**[リソースポリシーの編集]** を選択します。

1. API コンシューマーの VPC エンドポイント ID をリソースポリシーに追加します。

   API コンシューマーの VPC エンドポイント ID は、プライベートカスタムドメイン名の **[ドメイン詳細]** ページに移動して **[リソース共有]** タブの **[ドメイン名アクセスの関連付け]** セクションで確認できます。

1. **[Save changes]** (変更の保存) をクリックします。

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

`execute-api` サービスに関する次の `policy` では、VPC エンドポイント `{{vpce-abcd1234efg}}` と `{{vpce-xyz000abc}}` の両方からプライベートカスタムドメイン名への受信トラフィックを許可しています。

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": [
                "execute-api:/*"
            ]
        },
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": [
                "execute-api:/*"
            ],
            "Condition" : {
                "StringNotEquals": {
                    "aws:SourceVpce": [
                    "{{vpce-abcd1234}}",
                    "{{vpce-xyzz0000}}"
                    ]
                }
            }
        }
    ]
}
```

次の [update-domain-name](https://docs.aws.amazon.com/cli/latest/reference/apigateway/update-domain-name.html) コマンドは、パッチオペレーションを使用してプライベートカスタムドメイン名に関する `policy` を更新します。

```
aws apigateway update-domain-name
    --domain-name private.example.com \
    --domain-name-id abcd1234 \
    --patch-operations op=replace,path=/policy,value='"{\"Version\": \"2012-10-17\",		 	 	 \"Statement\": [{\"Effect\": \"Allow\",\"Principal\": \"*\",\"Action\": \"execute-api:Invoke\",\"Resource\":[\"execute-api:/*\"]},{\"Effect\": \"Deny\",\"Principal\": \"*\",\"Action\": \"execute-api:Invoke\",\"Resource\":[\"execute-api:/*\"],\"Condition\":{\"StringNotEquals\":[\"vpce-abcd1234efg\", \"vpce-xyz000abc\"]}}}]}"
```

------