

# API 提供方：使用 API Gateway AWS CLI 共享您的私有自定义域名
<a name="apigateway-private-custom-domains-provider-share-cli"></a>

您可以使用 API Gateway AWS CLI 来共享私有自定义域名，但我们建议您使用 AWS RAM 来减少运营开销。有关如何使用 AWS RAM 共享私有自定义域名的说明，请参阅 [API 提供方：使用 AWS RAM 共享您的私有自定义域名](apigateway-private-custom-domains-provider-share.md)。

要使用 API Gateway AWS CLI 共享私有自定义域名，您需要向其他 AWS 账户授予访问权限，使其能够创建域名访问关联和调用您的私有自定义域名。为此，您需要更新 API Gateway 管理服务的 `managementPolicy`，以及您私有自定义域名的 `execute-api` 服务的 `policy`。您还需要在资源策略中，向 API 使用方的 VPC 端点授予访问权限，使其能够访问映射到您的私有自定义域名的所有私有 API。

API 使用方仍需要在自己的账户中，在其 VPC 端点与您的私有自定义域名之间创建域名访问关联。您不能为他们完成此操作。

## 授予对私有自定义域名的访问权限
<a name="apigateway-private-custom-domains-provider-share-cli-allow"></a>

**授予对私有自定义域名的访问权限**

1. 要更新 API Gateway 管理服务的 `managementPolicy`，您需要创建一个 JSON 文件，其中包含用于更新策略的补丁操作。以下 `patch-managementPolicy.json` 将当前 `managementPolicy` 替换为示例策略，该策略向 AWS 账户 111122223333 和 444455556666 授予访问权限，使其能够创建与私有自定义域名 `private.example.com` 的域名访问关联。

   ```
   [{
       "op": "replace",
       "path": "/managementPolicy",
       "value": "{\"Version\":\"2012-10-17\",		 	 	 \"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"arn:aws:iam::111122223333:root\", \"arn:aws:iam::444455556666:root\"]},\"Action\":\"apigateway:CreateAccessAssociation\",\"Resource\":\"arn:aws:apigateway:us-west-2:111122223333:/domainnames/private.example.com+abcd1234\"}]}"
   }]
   ```

    以下 [update-domain-name](https://docs.aws.amazon.com/cli/latest/reference/apigateway/update-domain-name.html) 命令使用 `patch-managementPolicy.json` 更新了 `managementPolicy`。

   ```
   aws apigateway update-domain-name \
       --domain-name private.example.com \
       --domain-name-id abcd1234 \
       --patch-operations file://patch-managementPolicy.json
   ```

   授予访问权限后，您需要通知 API 使用方，他们可以建立域名访问关联。如果您使用 AWS RAM，AWS RAM 将为您执行此步骤。

1. 要更新 `execute-api` 服务的 `policy`，您需要创建一个 JSON 文件，其中包含用于更新策略的补丁操作。以下 `patch-policy.json` 将当前 `policy` 替换为示例策略，该策略授予两个 VPC 端点调用私有自定义域名 `private.example.com` 的访问权限。

   ```
   [{
       "op": "replace",
       "path": "/policy",
       "value": "{\"Version\": \"2012-10-17\",		 	 	 \"Statement\": [{\"Effect\": \"Allow\",\"Principal\": \"*\",\"Action\": \"execute-api:Invoke\",\"Resource\": \"arn:aws:execute-api:us-west-2:111122223333:/domainnames/private.example.com+abcd1234\"},{\"Effect\": \"Deny\",\"Principal\": \"*\",\"Action\": \"execute-api:Invoke\",\"Resource\": \"arn:aws:execute-api:us-west-2:111122223333:/domainnames/private.example.com+abcd1234\",\"Condition\": {\"StringNotEquals\": {\"aws:SourceVpce\": [\"vpce-abcd1234\",\"vpce-xyzz0000\"]}}}]}"
   }]
   ```

    通过以下 [update-domain-name](https://docs.aws.amazon.com/cli/latest/reference/apigateway/update-domain-name.html) 命令，使用 `patch-policy.json` 更新 `policy`。

   ```
   aws apigateway update-domain-name \
       --domain-name private.example.com \
       --domain-name-id abcd1234 \
       --patch-operations file://patch-policy.json
   ```

## 拒绝对私有自定义域名的访问权限
<a name="apigateway-private-custom-domains-provider-share-cli-deny"></a>

要停止共享私有自定义域名，您需要拒绝私有自定义域名与 API 使用方的 VPC 端点之间的域名访问关联。

**拒绝对私有自定义域名的访问权限**

1. 以下 `reject-domain-name-access-association` 命令拒绝域名访问关联。

   ```
   aws apigateway reject-domain-name-access-association \
       --domain-name-access-association-arn arn:aws:apigateway:us-west-2:444455556666:/domainnameaccessassociations/domainname/private.example.com+abcd1234/vpcesource/vpce-abcd1234 \
       --domain-name-arn arn:aws:apigateway:us-west-2:111122223333:/domainnames/private.example.com+abcd1234
   ```

1. 修改 `patch-managementPolicy.json` 以删除 API 提供方账户的权限，使其不能创建与您的私有自定义域名的域名访问关联。以下 `patch-managementPolicy.json` 从 `managementPolicy` 中删除一个账户：

   ```
   [{
        "op": "replace",
        "path": "/managementPolicy",
        "value": "{\"Version\":\"2012-10-17\",		 	 	 \"Statement\":[{\"Effect\":\"Allow\",\"Principal\":\"*\",\"Action\":\"apigateway:CreateAccessAssociation\",\"Resource\":\"arn:aws:apigateway:us-west-2:111122223333:/domainnames/private.example.com+abcd1234\"}]}"
   }]
   ```

   以下 [update-domain-name](https://docs.aws.amazon.com/cli/latest/reference/apigateway/update-domain-name.html) 命令使用 `patch-managementPolicy.json` 更新 `managementPolicy`。

   ```
   aws apigateway update-domain-name \
       --domain-name private.example.com \
       --domain-name-id abcd1234 \
       --patch-operations file://patch-managementPolicy.json
   ```

1. 修改 `patch-policy.json`，删除 API 提供方的 VPC 端点调用您的私有自定义域名的访问权限。以下 `patch-policy.json` 从 `policy` 中删除 VPC 端点 ID：

   ```
   [{
       "op": "replace",
       "path": "/policy",
       "value": "{\"Version\":\"2012-10-17\",		 	 	 \"Statement\":[{\"Effect\":\"Allow\",\"Principal\":\"*\",\"Action\":\"execute-api:Invoke\",\"Resource\":\"arn:aws:execute-api:us-west-2:111122223333:/domainnames/private.example.com+abcd1234\"},{\"Effect\":\"Deny\",\"Principal\":\"*\",\"Action\":\"execute-api:Invoke\",\"Resource\":\"arn:aws:execute-api:us-west-2:111122223333:/domainnames/private.example.com+abcd1234\",\"Condition\":{\"StringNotEquals\":{\"aws:SourceVpce\":\"vpce-abcd1234\"}}}]}"
   }]
   ```

   以下 [update-domain-name](https://docs.aws.amazon.com/cli/latest/reference/apigateway/update-domain-name.html) 命令使用 `patch-policy.json` 更新了 `policy`。

   ```
   aws apigateway update-domain-name \
       --domain-name private.example.com \
       --domain-name-id abcd1234 \
       --patch-operations file://patch-policy.json
   ```

## 此过程中使用的示例策略
<a name="apigateway-private-custom-domains-provider-share-cli-policies"></a>

接下来的部分演示之前过程中使用的示例策略。

以下示例策略针对 Amazon API Gateway 管理服务的 `managementPolicy`。此策略向 AWS 账户 111122223333 和 444455556666 授予访问权限，使其能够创建与私有自定义域名 `private.example.com` 的域名访问关联。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "111122223333",
                    "444455556666"
                ]
            },
            "Action": "apigateway:CreateAccessAssociation",
            "Resource": "arn:aws:apigateway:us-west-2:111122223333:/domainnames/private.example.com+a1b2c3"
        }
    ]
}
```

------

以下示例策略是用于 `execute-api` 服务的 `policy` 的策略。此策略授予 VPC 端点 `vpce-abcd1234` 和 `vpce-xyzz0000` 调用私有自定义域名的访问权限。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:us-west-2:111122223333:/domainnames/private.example.com+abcd1234"
        },
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:us-west-2:111122223333:/domainnames/private.example.com+abcd1234",
            "Condition": {
                "StringNotEquals": {
                    "aws:SourceVpce": [
                        "vpce-abcd1234",
                        "vpce-xyzz0000"
                    ]
                }
            }
        }
    ]
}
```

------