

# 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 区域中。
+ 您可以将一个资源共享用于多个主体，在创建资源共享之后，您可以向其中添加多个主体。我们建议您尽可能重用资源共享。
+ 您始终需要向 API 使用方的 VPC 端点授予访问权限，使其能够调用您的私有自定义域名以及映射到该域名的所有私有 API。
+ 如果 API 使用方和 API 提供方在同一个组织中使用 AWS Organizations，则会自动接受资源共享。您仍然需要使用 AWS RAM 创建资源共享。
+ 如果 API 使用方和 API 提供方在同一个组织中使用 AWS Organizations，并且您的组织中已经启用了资源共享，则组织中与您进行共享的所有主体将自动获得对资源共享的访问权限。此过程无需邀请，您可以跳过资源共享。
+ 如果 API 使用方未在 **12 小时**内接受资源共享，则 API 提供方必须重新共享资源。
+ 在您创建资源共享后，AWS RAM 为私有自定义域名更新 Amazon API Gateway 管理服务的 `managementPolicy`，以防止在未明确授予 `allow` 访问权限的情况下，向主体提供访问权限。有关更多信息，请参阅《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 User Guide**》中的 [Creating a resource share in 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 或 Organizations 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. 通过以下网址登录到 Amazon API Gateway 控制台：[https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)。

1. 在主导航窗格中，选择**自定义域名**。

1. 选择您与其他 AWS 账户共享的私有自定义域名。

1. 在**资源策略**选项卡上，选择**编辑资源策略**。

1. 将 API 使用方的 VPC 端点 ID 添加到您的资源策略中。

   在您的私有自定义域名的**域详细信息**页面上，您可在**资源共享**选项卡的**域名访问关联**部分中找到 API 使用方的 VPC 端点 ID。

1. 选择**保存更改**。

------
#### [ 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\"]}}}]}"
```

------