

# 为 Amazon RDS Custom for SQL Server 设置环境
<a name="custom-setup-sqlserver"></a>

在为 Amazon RDS Custom for SQL Server 数据库实例创建和管理数据库实例之前，请确保执行以下任务。

**Contents**
+ [

## 设置 RDS Custom for SQL Server 的先决条件
](#custom-setup-sqlserver.review)
  + [

### 使用 AWS 管理控制台自动创建实例配置文件
](#custom-setup-sqlserver.instanceProfileCreation)
+ [

## 步骤 1：为您的 IAM 主体授予所需的权限
](#custom-setup-sqlserver.iam-user)
+ [

## 步骤 2：配置网络、实例配置文件和加密
](#custom-setup-sqlserver.iam-vpc)
  + [

### 使用 CloudFormation 进行配置
](#custom-setup-sqlserver.cf)
    + [

#### CloudFormation 所需的参数
](#custom-setup-sqlserver.cf.params)
    + [

#### 下载 CloudFormation 模板文件
](#custom-setup-sqlserver.cf.download)
    + [

#### 使用 CloudFormation 配置资源
](#custom-setup-sqlserver.cf.config)
  + [

### 手动配置
](#custom-setup-sqlserver.manual)
    + [

#### 请确保您有对称的加密 AWS KMS 密钥
](#custom-setup-sqlserver.cmk)
    + [

#### 手动创建您的 IAM 角色和实例配置文件
](#custom-setup-sqlserver.iam)
      + [

##### 创建 AWSRDSCustomSQLServerInstanceRole IAM 角色
](#custom-setup-sqlserver.iam.create-role)
      + [

##### 将访问策略添加到 AWSRDSCustomSQLServerInstanceRole
](#custom-setup-sqlserver.iam.add-policy)
      + [

##### 创建您的 RDS Custom for SQL Server 实例配置文件
](#custom-setup-sqlserver.iam.create-profile)
      + [

##### 请将 AWSRDSCustomSQLServerInstanceRole 添加到您的 RDS Custom for SQL Server 实例配置文件中
](#custom-setup-sqlserver.iam.add-profile)
    + [

#### 手动配置您的 VPC
](#custom-setup-sqlserver.vpc)
      + [

##### 配置您的 VPC 安全组
](#custom-setup-sqlserver.vpc.sg)
      + [

##### 为依赖项 AWS 服务配置端点
](#custom-setup-sqlserver.vpc.endpoints)
      + [

##### 配置实例元数据服务
](#custom-setup-sqlserver.vpc.imds)
+ [

## 跨实例限制
](#custom-setup-sqlserver.cross-instance-restriction)

**注意**  
有关如何设置先决条件和启动 Amazon RDS Custom for SQL Server 的分步教程，请参阅[通过 CloudFormation 模板开始使用 Amazon RDS Custom for SQL Server（网络设置）](https://aws.amazon.com/blogs/database/get-started-with-amazon-rds-custom-for-sql-server-using-an-aws-cloudformation-template-network-setup/)和[了解创建 Amazon RDS Custom for SQL Server 实例需满足的先决条件](https://aws.amazon.com/blogs/database/explore-the-prerequisites-required-to-create-an-amazon-rds-custom-for-sql-server-instance/)。

## 设置 RDS Custom for SQL Server 的先决条件
<a name="custom-setup-sqlserver.review"></a>

在创建 RDS Custom for SQL Server 数据库实例之前，请确保您的环境符合本主题中描述的要求。也可以使用 CloudFormation 模板在您的AWS 账户中设置先决条件。有关更多信息，请参阅[使用 CloudFormation 进行配置](#custom-setup-sqlserver.cf)

RDS Custom for SQL Server 要求您配置以下先决条件：
+ 配置创建实例所需的 AWS Identity and Access Management（IAM）权限。这是向 RDS 发出 `create-db-instance` 请求所需的 AWS Identity and Access Management（IAM）用户或角色。
+ 配置 RDS Custom for SQL Server 数据库实例所需的必备资源：
  + 配置加密 RDS Custom 实例所需的 AWS KMS 密钥。RDS Custom 在创建实例时需要使用客户托管密钥进行加密。KMS 密钥 ARN、ID、别名 ARN 或别名在创建 RDS Custom 数据库实例的请求中作为 `kms-key-id` 参数传递。
  + 在 RDS Custom for SQL Server 数据库实例中配置所需的权限。RDS Custom 在创建实例时会将实例配置文件附加到数据库实例，并使用它在数据库实例中进行自动化。在 RDS Custom 创建请求中，实例配置文件名称设置为 `custom-iam-instance-profile`。可以从 AWS 管理控制台创建实例配置文件或手动创建实例配置文件。有关更多信息，请参阅[使用 AWS 管理控制台自动创建实例配置文件](#custom-setup-sqlserver.instanceProfileCreation)和[手动创建您的 IAM 角色和实例配置文件](#custom-setup-sqlserver.iam)。
  + 根据对 RDS Custom for SQL Server 的要求配置网络设置。RDS Custom 实例位于您在创建实例时提供的子网中（配置有数据库子网组）。这些子网必须允许 RDS Custom 实例与实现 RDS 自动化所需的服务进行通信。

**注意**  
要满足上述要求，请确保没有任何限制账户级别权限的服务控制策略（SCP）。  
如果您使用的账户属于 AWS 组织，则该账户可能具有限制账户级别权限的服务控制策略（SCP）。确保 SCP 不会限制对于您使用以下过程创建的用户和角色的权限。  
有关 SCP 的更多信息，请参阅《AWS Organizations 用户指南》**中的[服务控制策略 (SCP)](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html)。使用 AWS CLI 命令 [describe-organization](https://docs.aws.amazon.com/cli/latest/reference/organizations/describe-organization.html) 检查您的账户是否属于 AWS 组织。  
有关 AWS Organizations 的更多信息，请参阅《AWS Organizations 用户指南》**中的[什么是 AWS Organizations](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html)。

有关 RDS Custom for SQL Server 的一般要求，请参阅 [RDS Custom for SQL Server 的一般要求](custom-reqs-limits-MS.md#custom-reqs-limits.reqsMS)。

### 使用 AWS 管理控制台自动创建实例配置文件
<a name="custom-setup-sqlserver.instanceProfileCreation"></a>

RDS Custom 要求您创建和配置实例配置文件以启动任何 RDS Custom for SQL Server 数据库实例。使用 AWS 管理控制台只需一个步骤即可创建和附加新的实例配置文件。此选项位于**创建数据库**、**还原快照**和**还原到时间点**控制台页面的“RDS Custom 安全性”部分。选择**创建新的实例配置文件**以提供实例配置文件名称后缀。AWS 管理控制台将创建新的实例配置文件，该配置文件具有执行 RDS Custom 自动化任务所需的权限。要自动创建新的实例配置文件，您的登录 AWS 管理控制台用户必须具有 `iam:CreateInstanceProfile`、`iam:AddRoleToInstanceProfile`、`iam:CreateRole` 和 `iam:AttachRolePolicy` 权限。

**注意**  
此选项只在 AWS 管理控制台中可用。如果您使用的是 CLI 或 SDK，请使用 RDS Custom 提供的 CloudFormation 模板或手动创建实例配置文件。有关更多信息，请参阅[手动创建您的 IAM 角色和实例配置文件](#custom-setup-sqlserver.iam)。

## 步骤 1：为您的 IAM 主体授予所需的权限
<a name="custom-setup-sqlserver.iam-user"></a>

确保您有足够的访问权限来创建 RDS Custom 实例。可以使用控制台或 CLI 创建 RDS Custom for SQL Server 数据库实例的 IAM 用户或 IAM 角色（称为 *IAM 主体*）必须实施以下任一策略，才能成功创建数据库实例：
+ `AdministratorAccess` 策略
+ 具有以下其他权限的 `AmazonRDSFullAccess` 策略：

  ```
  iam:SimulatePrincipalPolicy
  cloudtrail:CreateTrail
  cloudtrail:StartLogging
  s3:CreateBucket
  s3:PutBucketPolicy
  s3:PutBucketObjectLockConfiguration
  s3:PutBucketVersioning 
  kms:CreateGrant
  kms:DescribeKey
  kms:Decrypt
  kms:ReEncryptFrom
  kms:ReEncryptTo
  kms:GenerateDataKeyWithoutPlaintext
  kms:GenerateDataKey
  ec2:DescribeImages
  ec2:RunInstances
  ec2:CreateTags
  ```

  RDS Custom 在创建实例期间使用这些权限。这些权限在您的账户中配置执行 RDS Custom 操作所需的资源。

  有关 `kms:CreateGrant` 权限的更多信息，请参阅 [AWS KMS key 管理](Overview.Encryption.Keys.md)。

以下示例 JSON 策略授予所需的权限。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ValidateIamRole",
            "Effect": "Allow",
            "Action": "iam:SimulatePrincipalPolicy",
            "Resource": "*"
        },
        {
            "Sid": "CreateCloudTrail",
            "Effect": "Allow",
            "Action": [
                "cloudtrail:CreateTrail",
                "cloudtrail:StartLogging"
            ],
            "Resource": "arn:aws:cloudtrail:*:*:trail/do-not-delete-rds-custom-*"
        },
        {
            "Sid": "CreateS3Bucket",
            "Effect": "Allow",
            "Action": [
                "s3:CreateBucket",
                "s3:PutBucketPolicy",
                "s3:PutBucketObjectLockConfiguration",
                "s3:PutBucketVersioning"
            ],
            "Resource": "arn:aws:s3:::do-not-delete-rds-custom-*"
        },
        {
            "Sid": "CreateKmsGrant",
            "Effect": "Allow",
            "Action": [
                "kms:CreateGrant",
                "kms:DescribeKey"
            ],
            "Resource": "*"
        }
    ]
}
```

------

IAM 主体需要以下额外权限，才能使用自定义引擎版本（CEV）：

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ConfigureKmsKeyEncryptionPermission",
            "Effect": "Allow",
            "Action": [
                "kms:CreateGrant",
                "kms:DescribeKey",
                "kms:Decrypt",
                "kms:ReEncryptFrom",
                "kms:ReEncryptTo",
                "kms:GenerateDataKeyWithoutPlaintext",
                "kms:GenerateDataKey"
            ],
            "Resource": "arn:aws:kms:us-east-1:111122223333:key/key_id"
        },
        {
            "Sid": "CreateEc2Instance",
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeImages",
                "ec2:RunInstances",
                "ec2:CreateTags"
            ],
            "Resource": "*"
        }
    ]
}
```

------

将 *111122223333* 替换为您用来创建实例的账户 ID。将 *us-east-1* 替换为您用来创建实例的 AWS 区域。将 *key\$1id* 替换为客户自主管理型密钥 ID。可以根据需要添加多个密钥。

有关启动 EC2 实例所需的资源级权限的更多信息，请参阅[启动实例（RunInstances）](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ExamplePolicies_EC2.html#iam-example-runinstances)。

此外，IAM 主体需要对 IAM 角色具有 `iam:PassRole` 权限。必须将其附加到在请求的 `custom-iam-instance-profile` 参数中传递的实例配置文件，以创建 RDS Custom 数据库实例。实例配置文件及其附加的角色稍后将在[步骤 2：配置网络、实例配置文件和加密](#custom-setup-sqlserver.iam-vpc)中创建。

**注意**  
确保之前列出的权限不受服务控制策略 (SCP)、权限边界或与 IAM 主体关联的会话策略的限制。

## 步骤 2：配置网络、实例配置文件和加密
<a name="custom-setup-sqlserver.iam-vpc"></a>

您可以使用以下任一过程来配置 IAM 实例配置文件角色、虚拟私有云 (VPC) 和 AWS KMS 对称加密密钥：
+ [使用 CloudFormation 进行配置](#custom-setup-sqlserver.cf)（推荐）
+ [手动配置](#custom-setup-sqlserver.manual)

**注意**  
如果您的账户属于任一 AWS Organizations，请确保实例配置文件角色所需的权限不受服务控制策略（SCP）限制。  
此主题中的网络配置在与不公开访问的数据库实例配合使用时效果最佳。您无法从 VPC 外部直接连接到此类数据库实例。

### 使用 CloudFormation 进行配置
<a name="custom-setup-sqlserver.cf"></a>

为了简化设置，您可以使用 CloudFormation 模板文件创建 CloudFormation 堆栈。CloudFormation 模板根据 RDS Custom 的要求创建所有网络配置、实例配置文件和加密资源。

要了解如何创建堆栈，请参阅《CloudFormation 用户指南》**中的[在 CloudFormation 控制台上创建堆栈](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-create-stack.html)。

有关如何使用 CloudFormation 模板启动 Amazon RDS Custom for SQL Server 的教程，请参阅 *AWS 数据库博客* 中的[通过 CloudFormation 模板开始使用 Amazon RDS Custom for SQL Server](https://aws.amazon.com/blogs/database/get-started-with-amazon-rds-custom-for-sql-server-using-an-aws-cloudformation-template-network-setup/)。

**Topics**
+ [

#### CloudFormation 所需的参数
](#custom-setup-sqlserver.cf.params)
+ [

#### 下载 CloudFormation 模板文件
](#custom-setup-sqlserver.cf.download)
+ [

#### 使用 CloudFormation 配置资源
](#custom-setup-sqlserver.cf.config)

#### CloudFormation 所需的参数
<a name="custom-setup-sqlserver.cf.params"></a>

使用 CloudFormation 配置 RDS Custom 必备资源需要以下参数：

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/custom-setup-sqlserver.html)

#### CloudFormation 创建的资源
<a name="custom-setup-sqlserver.cf.list"></a>

使用默认设置成功创建 CloudFormation 堆栈会在您的 AWS 账户中创建以下资源：
+ 对称加密 KMS 密钥，用于加密 RDS Custom 管理的数据。
+ 使用 `AmazonRDSCustomInstanceProfileRolePolicy` 将实例配置文件与 IAM 角色相关联，以提供 RDS Custom 所需的权限。有关更多信息，请参阅《AWS 托管策略参考指南》**中的 [AmazonRDSCustomServiceRolePolicy](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonRDSCustomServiceRolePolicy.html)。
+ 将 CIDR 范围指定为 CloudFormation 参数的 VPC。默认值为 `10.0.0.0/16`。
+ 在参数中指定了 CIDR 范围的两个私有子网，以及 AWS 区域中的两个不同可用区。子网 CIDR 的默认值为 `10.0.128.0/20` 和 `10.0.144.0/20`。
+ 一个在参数中指定了 CIDR 范围的公有子网。子网 CIDR 的默认值为 10.0.0.0/20。EC2 实例位于此子网中，可用于连接到 RDS Custom 实例。
+ 为 VPC 设置了 DHCP 选项，域名解析为 Amazon 域名系统 (DNS) 服务器。
+ 与两个私有子网关联但无法访问互联网的路由表。
+ 与公有子网关联且可以访问互联网的路由表。
+ 与 VPC 关联且允许互联网访问公有子网的互联网网关。
+ 网络访问控制列表（ACL），与两个私有子网关联并且在 VPC 内只能访问 HTTPS 和数据库端口。
+ 要与 RDS Custom 实例关联的 VPC 安全组。限制对 RDS Custom 所需的 AWS 服务端点的出站 HTTPS 访问，以及对 EC2 实例安全组的入站数据库端口的访问。
+ 要与公有子网中的 EC2 实例关联的 VPC 安全组。限制出站数据库端口对 RDS Custom 实例安全组的访问。
+ 对于为 RDS Custom 所需的 AWS 服务端点创建的 VPC 端点，要与它们关联的 VPC 安全组。
+ 在其中创建 RDS Custom 实例的数据库子网组。此模板创建的两个私有子网已添加到数据库子网组中。
+ 对应于 RDS Custom 所需的每个 AWS 服务端点的 VPC 端点。

除了上述列表之外，将可用性配置设置为多可用区还会创建以下资源：
+ 允许私有子网之间通信的网络 ACL 规则。
+ 对与 RDS Custom 实例关联的 VPC 安全组中多可用区端口的入站和出站访问权限。
+ 与进行多可用区通信所需的 AWS 服务端点连接的 VPC 端点。

此外，设置 RDP 访问配置还会创建以下资源：
+ 配置从您的源 IP 地址对公有子网的 RDP 访问权限：
  + 允许建立从您的源 IP 到公有子网的 RDP 连接的网络 ACL 规则。
  + 对从您的源 IP 连接到与 EC2 实例关联的 VPC 安全组的 RDP 端口进行入口访问。
+ 配置从公有子网中的 EC2 实例到私有子网中的 RDS Custom 实例的 RDP 访问权限：
  + 允许建立从公有子网到私有子网的 RDP 连接的网络 ACL 规则。
  + 对从与 EC2 实例关联的 VPC 安全组连接到与 RDS Custom 实例关联的 VPC 安全组的 RDP 端口进行入站访问

使用以下过程为 RDS Custom for SQL Server 创建 CloudFormation 堆栈。

#### 下载 CloudFormation 模板文件
<a name="custom-setup-sqlserver.cf.download"></a>

**下载模板文件**

1. 打开链接 [custom-sqlserver-onboard.zip](samples/custom-sqlserver-onboard.zip) 的上下文（右键单击）菜单，然后选择 **Save Link As**（将链接另存为）。

1. 将文件保存并提取到您的计算机中。

#### 使用 CloudFormation 配置资源
<a name="custom-setup-sqlserver.cf.config"></a>

**使用 CloudFormation 配置资源**

1. 通过以下网址打开 CloudFormation 控制台：[https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)。

1. 要启动 Create Stack（创建堆栈）向导，请选择 **Create Stack**（创建堆栈）。

   此时会显示 **Create stack**（创建快照）。

1. 对于 **Prerequisite - Prepare template**（先决条件 - 准备模板），请选择 **Template is ready**（模板已就绪）。

1. 对于 **Select Template**（选择模板），执行以下操作：

   1. 对于 **Template source**(模板来源)，选择 **Upload a template file**(上载模板文件)。

   1. 对于**选择文件**，请导航到并选择正确的文件。

1. 选择**下一步**。

   此时将出现 **Specify stack details**（指定堆栈详细信息）页面。

1. 对于**堆栈名称**，输入 **rds-custom-sqlserver**。

1. 对于 **Parameters**（参数），请执行以下操作：

   1. 要保留原定设置选项，请选择 **Next**（下一步)。

   1. 要更改选项，请选择相应的可用性配置、网络配置和 RDP 访问配置，然后选择**下一步**。

      在更改参数之前，请仔细阅读每个参数的说明。
**注意**  
如果您选择在此 CloudFormation 堆栈中至少创建一个多可用区实例，请确保 CloudFormation 堆栈参数**为先决条件设置选择可用性配置**设置为 `Multi-AZ`。如果您将 CloudFormation 堆栈创建为单可用区，请在创建第一个多可用区实例之前将 CloudFormation 堆栈更新为多可用区配置。

1. 在**配置堆栈选项**页面上，请选择**下一步**。

1. 在 **Review rds-custom-sqlserver**（查看 rds-custom-sqlserver）页面上，请执行以下操作：

   1. 对于**功能**，请选中****我确认 CloudFormation 可能使用自定义名称创建 IAM 资源****复选框。

   1. 选择**创建堆栈**。

**注意**  
请勿直接从资源页面更新从该 CloudFormation 堆栈创建的资源。这可以防止您使用 CloudFormation 模板将后续更新应用于这些资源。

CloudFormation 创建 RDS Custom for SQL Server 所需的资源。如果堆栈创建失败，请通读 **Events**（事件）选项卡，以查看哪项资源创建失败及其状态原因。

对于将作为参数传递以创建 RDS Custom for SQL Server 数据库实例的所有资源，控制台中此 CloudFormation 堆栈的 **Outputs**（输出）选项卡应包含有关它们的信息。确保使用 CloudFormation 为 RDS Custom 数据库实例创建的 VPC 安全组和数据库子网组。原定设置情况下，RDS 会尝试附加原定设置 VPC 安全组，该安全组可能没有您所需的访问权限。

如果您使用了 CloudFormation 来创建资源，则可以跳过[手动配置](#custom-setup-sqlserver.manual)。

#### 更新 CloudFormation 堆栈
<a name="custom-setup-sqlserver.cf.update"></a>

您还可以在创建后更新 CloudFormation 堆栈的一些相关配置。可以更新的配置包括：
+ RDS Custom for SQL Server 的可用性配置
  + **为先决条件设置选择可用性配置**：更新此参数可在单可用区和多可用区配置之间切换。如果您将此 CloudFormation 堆栈用于至少一个多可用区实例，则必须更新该堆栈以选择多可用区配置。
+ RDS Custom for SQL Server 的 RDP 访问配置
  + 您的源的 IPv4 CIDR 块：您可以通过更新此参数来更新您的源的 IPv4 CIDR 块（或 IP 地址范围）。将此参数设置为空白会删除从源 CIDR 块到公有子网的 RDP 访问配置。
  + 设置对 RDS Custom for SQL Server 的 RDP 访问：启用或禁用从 EC2 实例到 RDS Custom for SQL Server 实例的 RDP 连接。

#### 删除 CloudFormation 堆栈
<a name="custom-setup-sqlserver.cf.delete"></a>

在从 CloudFormation 堆栈中删除所有使用资源的 RDS Custom 实例后，即可删除该堆栈。RDS Custom 不会跟踪 CloudFormation 堆栈，因此当存在使用堆栈资源的数据库实例时，它不会阻止删除该堆栈。在删除该堆栈时，请确保没有使用堆栈资源的 RDS Custom 数据库实例。

**注意**  
当您删除 CloudFormation 堆栈时，该堆栈创建的所有资源都会被删除，但 KMS 密钥除外。KMS 密钥会进入等待删除状态并且将在 30 天后删除。要保留 KMS 密钥，请在 30 天宽限期内执行 [CancelKeyDeletion](https://docs.aws.amazon.com/kms/latest/APIReference/API_CancelKeyDeletion.html) 操作。

### 手动配置
<a name="custom-setup-sqlserver.manual"></a>

如果您选择手动配置资源，请执行以下任务。

**注意**  
为了简化设置，您可以使用 CloudFormation 模板文件来创建 CloudFormation 堆栈，而不是手动配置。有关更多信息，请参阅 [使用 CloudFormation 进行配置](#custom-setup-sqlserver.cf)。  
也可以使用 AWS CLI 来完成本部分的操作。如果是，请下载并安装最新的 CLI。

**Topics**
+ [

#### 请确保您有对称的加密 AWS KMS 密钥
](#custom-setup-sqlserver.cmk)
+ [

#### 手动创建您的 IAM 角色和实例配置文件
](#custom-setup-sqlserver.iam)
+ [

#### 手动配置您的 VPC
](#custom-setup-sqlserver.vpc)

#### 请确保您有对称的加密 AWS KMS 密钥
<a name="custom-setup-sqlserver.cmk"></a>

RDS Custom 需要对称的加密 AWS KMS key。在创建 RDS Custom for SQL Server 数据库实例时，确保提供 KMS 密钥标识符做为参数 `kms-key-id`。有关更多信息，请参阅 [为 Amazon RDS Custom for SQL Server 创建并连接到数据库实例](custom-creating-sqlserver.md)。

您有以下选项：
+ 如果您的 AWS 账户中有现有的客户自主管理型 KMS 密钥，则可以将其与 RDS Custom 一起使用。无需进一步操作。
+ 如果您已经为不同的 RDS Custom 引擎创建了客户自主管理型对称加密 KMS 密钥，可以重用相同的 KMS 密钥。无需进一步操作。
+ 如果您的账户中没有现有的客户自主管理型对称加密 KMS 密钥，请按照《AWS Key Management Service 开发人员指南》**的[创建密钥](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html#create-symmetric-cmk)中的说明创建一个 KMS 密钥。
+ 如果您正在创建 CEV 或 RDS Custom 数据库实例，而您的 KMS 密钥位于其他 AWS 账户 中，请务必使用 AWS CLI。您不能将 AWS 控制台与跨账户 KMS 密钥一起使用。

**重要**  
RDS Custom 不支持 AWS 托管式 KMS 密钥。

确保您的对称加密密钥为 IAM 实例配置文件中的 `kms:Decrypt`（IAM）角色授予对 `kms:GenerateDataKey` 和 AWS Identity and Access Management 操作的访问权限。如果您的账户中有一个新的对称加密密钥，不需要进行任何更改。否则，请确保对称加密密钥的策略授予对这些操作的访问权限。

有关更多信息，请参阅 [步骤 4：为 RDS Custom for Oracle 配置 IAM](custom-setup-orcl.md#custom-setup-orcl.iam-vpc)。

#### 手动创建您的 IAM 角色和实例配置文件
<a name="custom-setup-sqlserver.iam"></a>

可以手动创建实例配置文件并使用它来启动 RDS Custom 实例。如果计划在 AWS 管理控制台中创建实例，请跳过此部分。AWS 管理控制台允许您创建实例配置文件并将其附加到 RDS Custom 数据库实例。有关更多信息，请参阅 [使用 AWS 管理控制台自动创建实例配置文件](#custom-setup-sqlserver.instanceProfileCreation)。

手动创建实例配置文件时，请将实例配置文件名称作为 `custom-iam-instance-profile` 参数传递给 `create-db-instance` CLI 命令。RDS Custom 使用与此实例配置文件关联的角色，通过运行自动化功能来管理实例。

**为 RDS Custom for SQL Server 创建 IAM 实例配置文件和 IAM 角色**

1. 创建名为 `AWSRDSCustomSQLServerInstanceRole` 的 IAM 角色，并带有信任策略，以便 Amazon EC2 可代入此角色。

1. 将 AWS 托管策略 `AmazonRDSCustomInstanceProfileRolePolicy` 添加到 `AWSRDSCustomSQLServerInstanceRole`。

1. 为名为 `AWSRDSCustomSQLServerInstanceProfile` 的 RDS Custom for SQL Server 创建 IAM 实例配置文件。

1. 将 `AWSRDSCustomSQLServerInstanceRole` 添加到实例配置文件。

##### 创建 AWSRDSCustomSQLServerInstanceRole IAM 角色
<a name="custom-setup-sqlserver.iam.create-role"></a>

以下示例将创建 `AWSRDSCustomSQLServerInstanceRole` 角色。信任策略将允许 Amazon EC2 代入该角色。

```
aws iam create-role \
    --role-name AWSRDSCustomSQLServerInstanceRole \
    --assume-role-policy-document '{
        "Version": "2012-10-17",		 	 	 
          "Statement": [
            {
              "Action": "sts:AssumeRole",
              "Effect": "Allow",
              "Principal": {
                  "Service": "ec2.amazonaws.com"
              }
            }
          ]
        }'
```

##### 将访问策略添加到 AWSRDSCustomSQLServerInstanceRole
<a name="custom-setup-sqlserver.iam.add-policy"></a>

要提供所需的权限，请将 AWS 托管策略 `AmazonRDSCustomInstanceProfileRolePolicy` 附加到 `AWSRDSCustomSQLServerInstanceRole`。`AmazonRDSCustomInstanceProfileRolePolicy` 允许 RDS Custom 实例发送和接收消息，并执行各种自动化操作。

**注意**  
确保访问策略中的权限不受 SCP 或与实例配置文件角色关联的权限边境所限制。

以下示例将 AWS 托管策略 `AmazonRDSCustomInstanceProfileRolePolicy` 附加到 `AWSRDSCustomSQLServerInstanceRole` 角色。

```
aws iam attach-role-policy \
    --role-name AWSRDSCustomSQLServerInstanceRole \
    --policy-arn arn:aws:iam::aws:policy/AmazonRDSCustomInstanceProfileRolePolicy
```

##### 创建您的 RDS Custom for SQL Server 实例配置文件
<a name="custom-setup-sqlserver.iam.create-profile"></a>

实例配置文件是包含单个 IAM 角色的容器。RDS Custom 使用实例配置文件将角色传递给实例。

如果使用 AWS 管理控制台创建 Amazon EC2 角色，该控制台会自动创建实例配置文件，将其命名为与所创建角色相同的名称。请按如下方式创建您的实例配置文件，将其命名为 `AWSRDSCustomSQLServerInstanceProfile`。

```
aws iam create-instance-profile \
    --instance-profile-name AWSRDSCustomSQLServerInstanceProfile
```

##### 请将 AWSRDSCustomSQLServerInstanceRole 添加到您的 RDS Custom for SQL Server 实例配置文件中
<a name="custom-setup-sqlserver.iam.add-profile"></a>

将 `AWSRDSCustomInstanceRoleForRdsCustomInstance` 角色添加到先前创建的 `AWSRDSCustomSQLServerInstanceProfile` 配置文件中。

```
aws iam add-role-to-instance-profile \
    --instance-profile-name AWSRDSCustomSQLServerInstanceProfile \
    --role-name AWSRDSCustomSQLServerInstanceRole
```

#### 手动配置您的 VPC
<a name="custom-setup-sqlserver.vpc"></a>

就像 Amazon EC2 实例或 Amazon RDS 实例一样，您的 RDS Custom 数据库实例位于基于 Amazon VPC 服务的虚拟私有云 (VPC) 中。您将提供并配置自己的 VPC。因此，您将能够完全控制实例联网设置。

RDS Custom 将通信从数据库实例发送到其他 AWS 服务。确保可以从您在其中创建 RDS Custom 数据库实例的子网访问以下服务：
+ Amazon CloudWatch (`com.amazonaws.region.monitoring`)
+ Amazon CloudWatch Logs (`com.amazonaws.region.logs`)
+ Amazon CloudWatch Events (`com.amazonaws.region.events`)
+ Amazon EC2（`com.amazonaws.region.ec2` 和 `com.amazonaws.region.ec2messages`）
+ Amazon S3 (`com.amazonaws.region.s3`)
+ AWS Secrets Manager (`com.amazonaws.region.secretsmanager`)
+ AWS Systems Manager（`com.amazonaws.region.ssm` 和 `com.amazonaws.region.ssmmessages`）

如果创建多可用区部署
+ Amazon Simple Queue Service (`com.amazonaws.region.sqs`)

如果 RDS Custom 无法与必需的服务通信，它会发布以下事件：

```
Database instance in incompatible-network. SSM Agent connection not available. Amazon RDS can't connect to the dependent AWS services.
```

```
Database instance in incompatible-network. Amazon RDS can't connect to dependent AWS services. Make sure port 443 (HTTPS) allows outbound connections, and try again. "Failed to connect to the following services: s3 events"
```

为避免 `incompatible-network` 错误，请确保您的 RDS Custom 数据库实例与 AWS 服务之间通信所涉及的 VPC 组件满足以下要求：
+ 数据库实例可以在端口 443 上建立到其他 AWS 服务的出站连接。
+ VPC 允许对源自 RDS Custom 数据库实例的请求进行传入响应。
+ RDS Custom 可以正确解析每个 AWS 服务的端点的域名。

如果您已经为其他 RDS Custom 数据库引擎配置了 VPC，可以重用该 VPC 并跳过此过程。

**Topics**
+ [

##### 配置您的 VPC 安全组
](#custom-setup-sqlserver.vpc.sg)
+ [

##### 为依赖项 AWS 服务配置端点
](#custom-setup-sqlserver.vpc.endpoints)
+ [

##### 配置实例元数据服务
](#custom-setup-sqlserver.vpc.imds)

##### 配置您的 VPC 安全组
<a name="custom-setup-sqlserver.vpc.sg"></a>

*安全组*充当 VPC 实例的虚拟防火墙，以控制入站和出站流量。RDS Custom 数据库实例在其网络接口上附加了一个用于保护该实例的安全组。请确保该安全组允许通过 HTTPS 在 RDS Custom 和其他 AWS 服务之间传输流量。可以将此安全组作为实例创建请求中的 `vpc-security-group-ids` 参数进行传递。

**为 RDS Custom 配置安全组**

1. 登录到AWS 管理控制台并打开 Amazon VPC 控制台，网址：[https://console.aws.amazon.com/vpc](https://console.aws.amazon.com/vpc)。

1. 允许 RDS Custom 使用原定设置安全组，或创建您自己的安全组。

   有关详细说明，请参阅[通过创建安全组提供对 VPC 中的数据库实例的访问](CHAP_SettingUp.md#CHAP_SettingUp.SecurityGroup)。

1. 确保您的安全组允许在端口 443 上建立出站连接。RDS Custom 需要此端口来与依赖项 AWS 服务进行通信。

1. 如果您有私有 VPC 并且使用 VPC 端点，请确保与数据库实例关联的安全组允许在端口 443 上建立到 VPC 端点的出站连接。还要确保与 VPC 端点关联的安全组允许在端口 443 上建立来自数据库实例的入站连接。

   如果不允许传入连接，RDS Custom 实例将无法连接到 AWS Systems Manager 和 Amazon EC2 端点。有关更多信息，请参阅《AWS Systems Manager 用户指南》**中的[创建 Virtual Private Cloud 端点](https://docs.aws.amazon.com/systems-manager/latest/userguide/setup-create-vpc.html)。

1. 对于 RDS Custom for SQL Server 多可用区实例，请确保与数据库实例关联的安全组允许在端口 1120 上建立与该安全组本身的入站和出站连接。这是在多可用区 RDS Custom for SQL Server 数据库实例上建立对等主机连接所必需的。

有关安全组的更多信息，请参阅 [Amazon VPC 开发人员指南](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html)中的*您的 VPC 的安全组*。

##### 为依赖项 AWS 服务配置端点
<a name="custom-setup-sqlserver.vpc.endpoints"></a>

我们建议您按照以下说明为 VPC 中的每项服务添加端点。但是，您也可以使用任何其他解决方案，只要使您的 VPC 能够与 AWS 服务端点通信即可。例如，您可以使用网络地址转换 (NAT) 或 AWS Direct Connect。

**为与 RDS Custom 配合使用的 AWS 服务配置端点**

1. 通过 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/) 打开 Amazon VPC 控制台。

1. 在导航栏中，使用区域选择器来选择 AWS 区域。

1. 在导航窗格中，选择**端点**。在主窗格中，选择**创建端点**。

1. 对于 **Service category**（服务类别），选择 **AWS 服务**。

1. 对于 **Service Name**（服务名称），请选择表中显示的端点。

1. 对于 **VPC**，选择您的 VPC。

1. 对于**子网**，请从每个可用区中选择一个要包括的子网。

   VPC 端点可以跨越多个可用区。AWS 为您选择的每个子网中的 VPC 端点创建一个弹性网络接口。每个网络接口有一个域名系统 (DNS) 主机名和私有 IP 地址。

1. 对于 **Security group**（安全组），请选择或创建一个安全组。

   您可以使用安全组来控制对您的端点的访问，就像您使用防火墙一样。确保安全组允许端口 443 上来自数据库实例的入站连接。有关安全组的更多信息，请参阅 *Amazon VPC 用户指南* 中的[您的 VPC 的安全组](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html)。

1. 或者，您可以将策略附加到 VPC 端点。端点策略可以控制对您要连接到的 AWS 服务的访问权限。原定设置策略允许所有请求通过端点。如果您使用自定义策略，请确保策略中允许来自数据库实例的请求。

1. 选择**创建端点**。

下表说明了如何查找您的 VPC 用于出站通信所需的端点列表。


| 服务 | 端点格式 | 备注和链接 | 
| --- | --- | --- | 
|  AWS Systems Manager  |  采用以下端点格式： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/custom-setup-sqlserver.html)  |  有关每个区域中端点的列表，请参阅《Amazon Web Services 一般参考》**中的 [AWS Systems Manager 端点和限额](https://docs.aws.amazon.com/general/latest/gr/ssm.html)。  | 
|  AWS Secrets Manager  |  采用端点格式 `secretsmanager.region.amazonaws.com`。  |  有关每个区域中端点的列表，请参阅《Amazon Web Services 一般参考》**中的 [AWS Secrets Manager 端点和限额](https://docs.aws.amazon.com/general/latest/gr/asm.html)。  | 
|  Amazon CloudWatch  |  采用以下端点格式： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/custom-setup-sqlserver.html)  | 有关每个区域中的端点列表，请参阅：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/custom-setup-sqlserver.html) | 
|  Amazon EC2  |  采用以下端点格式： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/custom-setup-sqlserver.html)  |  有关每个区域中端点的列表，请参阅《Amazon Web Services 一般参考》**中的 [Amazon Elastic Compute Cloud 端点和限额](https://docs.aws.amazon.com/general/latest/gr/ec2-service.html)。  | 
|  Amazon S3  |  采用端点格式 `s3.region.amazonaws.com`。  |  有关每个区域中端点的列表，请参阅《Amazon Web Services 一般参考》**中的 [Amazon Simple Storage Service 端点和限额](https://docs.aws.amazon.com/general/latest/gr/s3.html)。 要了解 Amazon S3 的网关端点的更多信息，请参阅《Amazon VPC 开发人员指南**》中的 [Amazon S3 端点](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints-s3.html)。 要了解如何创建访问点，请参阅《Amazon VPC 开发人员指南**》中的[创建访问点](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/access-points-create-ap.html)。 要了解如何为 Amazon S3 创建网关端点，请参阅[网关 VPC 端点](https://docs.aws.amazon.com/vpc/latest/privatelink/vpce-gateway.html)。  | 
|  Amazon Simple Queue Service  | 采用端点格式 sqs.region.amazonaws.com | 要查看每个区域中端点的列表，请参阅 [Amazon Simple Storage Service 端点和限额](https://docs.aws.amazon.com/general/latest/gr/sqs-service.html) | 

##### 配置实例元数据服务
<a name="custom-setup-sqlserver.vpc.imds"></a>

请确保您的实例可以执行以下操作：
+ 可使用 Instance Metadata Service Version 2 (IMDSv2) 来访问实例元数据服务。
+ 允许通过端口 80 (HTTP) 到 IMDS 链接 IP 地址的出站通信。
+ 从 `http://169.254.169.254` IMDSv2 链接请求实例元数据。

有关更多信息，请参阅《Amazon EC2 用户指南》**中的[使用 IMDSv2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html)。

## 跨实例限制
<a name="custom-setup-sqlserver.cross-instance-restriction"></a>

当您按照上述步骤创建实例配置文件时，系统会使用 AWS 托管策略 `AmazonRDSCustomInstanceProfileRolePolicy` 向 RDS Custom 提供实现实例管理和监控自动化所需的权限。该托管策略可确保这些权限仅允许访问 RDS Custom 运行自动化功能所需的资源。建议使用该托管策略来支持新功能并满足安全要求，这些要求会自动应用于现有的实例配置文件，无需人工干预。有关更多信息，请参阅[AWS 托管策略：AmazonRDSCustomInstanceProfileRolePolicy](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-security-iam-awsmanpol.html#rds-security-iam-awsmanpol-AmazonRDSCustomInstanceProfileRolePolicy)。

`AmazonRDSCustomInstanceProfileRolePolicy` 托管策略将实例配置文件限制为具有跨账户访问权限，但它可能允许在同一账户内跨 RDS Custom 实例访问某些 RDS Custom 托管资源。根据您的要求，您可以使用权限边界进一步限制跨实例访问。权限边界策略定义基于身份的策略可以授予实体的最大权限，但它本身并不授予权限。有关更多信息，请参阅[评估有边界的有效权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html#access_policies_boundaries-eval-logic)。

例如，以下边界策略限制实例配置文件角色对特定 AWS KMS 密钥的访问权限，并限制跨使用不同 AWS KMS 密钥的实例对 RDS Custom 托管式资源的访问权限。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "DenyOtherKmsKeyAccess",
            "Effect": "Deny",
            "Action": "kms:*",
            "NotResource": "arn:aws:kms:us-east-1:111122223333:key/KMS_key_ID"
        }
    ]
}
```

------

**注意**  
请确保权限边界不会阻止 `AmazonRDSCustomInstanceProfileRolePolicy` 向 RDS Custom 授予的任何权限。