

# 为 Amazon RDS Custom for Oracle 设置您的环境
<a name="custom-setup-orcl"></a>

在创建 Amazon RDS Custom for Oracle 数据库实例之前，请执行以下任务。

**Topics**
+ [步骤 1：创建或重用对称加密 AWS KMS 密钥](#custom-setup-orcl.cmk)
+ [步骤 2：下载并安装 AWS CLI](#custom-setup-orcl.cli)
+ [步骤 3：提取 RDS Custom for Oracle 的 CloudFormation 模板](#custom-setup-orcl.cf.downloading)
+ [步骤 4：为 RDS Custom for Oracle 配置 IAM](#custom-setup-orcl.iam-vpc)
+ [步骤 5：为您的 IAM 用户或角色授予所需的权限](#custom-setup-orcl.iam-user)
+ [步骤 6：为 RDS Custom for Oracle 配置 VPC](#custom-setup-orc.vpc-config)

## 步骤 1：创建或重用对称加密 AWS KMS 密钥
<a name="custom-setup-orcl.cmk"></a>

*客户托管密钥*是您的 AWS 账户中由您创建、拥有和管理的 AWS KMS keys。RDS Custom 需要客户自主管理型对称加密 KMS 密钥。创建 RDS Custom for Oracle 数据库实例时，您需要提供 KMS 密钥标识符。有关更多信息，请参阅 [为 Amazon RDS Custom for Oracle 配置数据库实例](custom-creating.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.iam-vpc)。

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

## 步骤 2：下载并安装 AWS CLI
<a name="custom-setup-orcl.cli"></a>

AWS 为您提供了命令行界面以使用 RDS Custom 功能。您可以使用 AWS CLI 的版本 1 或版本 2。

有关下载和安装 AWS CLI 的信息，请参阅[安装或更新 AWS CLI 的最新版本](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。

如果满足以下任一条件，请跳过此步骤：
+ 您计划仅从 AWS 管理控制台访问 RDS Custom。
+ 您已为 Amazon RDS 或其他 RDS Custom 数据库引擎下载了 AWS CLI。

## 步骤 3：提取 RDS Custom for Oracle 的 CloudFormation 模板
<a name="custom-setup-orcl.cf.downloading"></a>

为了简化设置，我们强烈建议您使用 CloudFormation 模板创建 CloudFormation 堆栈。如果您计划手动配置 IAM 和 VPC，请跳过此步骤。

**Topics**
+ [步骤 3a：下载 CloudFormation 模板文件](#custom-setup-orcl.cf.dl-templates)
+ [步骤 3b：提取 custom-oracle-iam.json](#custom-setup-orcl.cf.downloading.ca-role)
+ [步骤 3c：提取 custom-vpc.json](#custom-setup-orcl.cf.downloading.ca-pn)

### 步骤 3a：下载 CloudFormation 模板文件
<a name="custom-setup-orcl.cf.dl-templates"></a>

CloudFormation 模板是对构成堆栈的 AWS 资源的声明。此模板存储为 JSON 文件。

**下载 CloudFormation 模板文件**

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

1. 将该文件保存到您的计算机。

1. 对于链接 [custom-vpc.zip](samples/custom-vpc.zip) 重复之前的步骤。

   如果您已经配置了适用于 RDS Custom 的 VPC，请跳过此步骤。

### 步骤 3b：提取 custom-oracle-iam.json
<a name="custom-setup-orcl.cf.downloading.ca-role"></a>

打开您下载的 `custom-oracle-iam.zip` 文件，然后解压缩文件 `custom-oracle-iam.json`。文件的开头如下所示。

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Parameters": {
    "EncryptionKey": {
      "Type": "String",
      "Default": "*",
      "Description": "KMS Key ARN for encryption of data managed by RDS Custom and by DB Instances."
    }
  },
  "Resources": {
    "RDSCustomInstanceServiceRole": {
      "Type": "AWS::IAM::Role",
      "Properties": {
        "RoleName": { "Fn::Sub": "AWSRDSCustomInstanceRole-${AWS::Region}" },
        "AssumeRolePolicyDocument": {
          "Version": "2012-10-17",		 	 	 
          "Statement": [
            {
              "Action": "sts:AssumeRole",
              "Effect": "Allow",
              "Principal": {
                "Service": "ec2.amazonaws.com"
              }
            }
          ]
        },...
```

### 步骤 3c：提取 custom-vpc.json
<a name="custom-setup-orcl.cf.downloading.ca-pn"></a>

**注意**  
如果您为 RDS Custom for Oracle 配置了现有 VPC，则跳过此步骤。有关更多信息，请参阅 [为 RDS Custom for Oracle 手动配置 VPC](#custom-setup-orcl.vpc)。

打开您下载的 `custom-vpc.zip` 文件，然后解压缩文件 `custom-vpc.json`。文件的开头如下所示。

```
{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Parameters": {
    "PrivateVpc": {
      "Type": "AWS::EC2::VPC::Id",
      "Description": "Private VPC Id to use for RDS Custom DB Instances"
    },
    "PrivateSubnets": {
      "Type": "List<AWS::EC2::Subnet::Id>",
      "Description": "Private Subnets to use for RDS Custom DB Instances"
    },
    "RouteTable": {
      "Type": "String",
      "Description": "Route Table that must be associated with the PrivateSubnets and used by S3 VPC Endpoint",
      "AllowedPattern": "rtb-[0-9a-z]+"
    }
  },
  "Resources": {
    "DBSubnetGroup": {
      "Type": "AWS::RDS::DBSubnetGroup",
      "Properties": {
        "DBSubnetGroupName": "rds-custom-private",
        "DBSubnetGroupDescription": "RDS Custom Private Network",
        "SubnetIds": {
          "Ref": "PrivateSubnets"
        }
      }
    },...
```

## 步骤 4：为 RDS Custom for Oracle 配置 IAM
<a name="custom-setup-orcl.iam-vpc"></a>

您使用 IAM 角色或 IAM 用户（称为 IAM 实体），通过控制台或 AWS CLI 创建 RDS Custom 数据库实例。此 IAM 实体必须具有创建实例所需的权限。

您可以使用 CloudFormation 或手动步骤配置 IAM。

**重要**  
强烈建议您使用 CloudFormation 配置您的 RDS Custom for Oracle 环境。这种技术最简单，最不容易出错。

**Topics**
+ [使用 CloudFormation 配置 IAM](#custom-setup-orcl.cf.config-iam)
+ [手动创建您的 IAM 角色和实例配置文件](#custom-setup-orcl.iam)

### 使用 CloudFormation 配置 IAM
<a name="custom-setup-orcl.cf.config-iam"></a>

当您对 IAM 使用 CloudFormation 模板时，该模板会创建以下必需的资源：
+ 名为 `AWSRDSCustomInstanceProfile-region` 的实例配置文件
+ 一个名为 `AWSRDSCustomInstanceRole-region` 的服务角色
+ 附加到服务角色的名为 `AWSRDSCustomIamRolePolicy` 的访问策略

**要采用 CloudFormation 配置 IAM**

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

1. 开启 Create Stack（创建堆栈）向导，然后选择 **Create Stack**（创建堆栈）。

1. 在 **Create stack**（创建堆栈）页面上，执行以下操作：

   1. 对于 **Prepare template**（准备模板），选择 **Template is ready**（模板就绪）。

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

   1. 对于**选择文件**，请导航到 **custom-oracle-iam.json** 并选择此文件。

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

1. 在 **Specify stack details**（指定堆栈详细信息）页面中，请执行以下操作：

   1. 对于**堆栈名称**，输入 **custom-oracle-iam**。

   1. 选择 **Next**(下一步)。

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

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

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

   1. 选择**提交**。

   CloudFormation 创建 RDS Custom for Oracle 所需的 IAM 角色。在左侧面板中，当 **custom-oracle-iam** 显示 **CREATE\$1COMPLETE** 时，继续执行下一步。

1. 在左侧面板中，选择 **custom-oracle-iam**。在右侧面板中，执行以下操作：

   1. 选择**堆栈信息**。堆栈的 ID 格式为：**arn:aws:cloudformation:*region*:*account-no*:stack/custom-oracle-iam/*identifier***。

   1. 选择**资源**。您将看到以下内容：
      + 名为 **AWSRDSCustomInstanceProfile-*region*** 的实例配置文件
      + 名为 **AWSRDSCustomInstanceRole-*region*** 的服务角色

      创建 RDS Custom 数据库实例时，您需要提供实例配置文件 ID。

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

使用 CloudFormation 时，配置是最简单的。但是，您还可以手动配置 IAM。对于手动设置，请执行以下操作：
+ [步骤 1：创建 IAM 角色 AWSRDSCustomInstanceRoleForRdsCustomInstance](#custom-setup-orcl.iam.create-role).
+ [步骤 2：将访问策略添加到 AWSRDSCustomInstanceRoleForRdsCustomInstance 中](#custom-setup-orcl.iam.add-policy).
+ [步骤 2：将访问策略添加到 AWSRDSCustomInstanceRoleForRdsCustomInstance 中](#custom-setup-orcl.iam.create-profile).
+ [步骤 4：将 AWSRDSCustomInstanceRoleForRdsCustomInstance 添加到 AWSRDSCustomInstanceProfile](#custom-setup-orcl.iam.add-profile).

#### 步骤 1：创建 IAM 角色 AWSRDSCustomInstanceRoleForRdsCustomInstance
<a name="custom-setup-orcl.iam.create-role"></a>

在此步骤中，您将使用命名格式 `AWSRDSCustomInstanceRole-region` 创建角色。使用信任策略，以便 Amazon EC2 可以代入该角色。以下示例假设您已将环境变量 `$REGION` 设置为要在其中创建数据库实例的 AWS 区域。

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

#### 步骤 2：将访问策略添加到 AWSRDSCustomInstanceRoleForRdsCustomInstance 中
<a name="custom-setup-orcl.iam.add-policy"></a>

在将内联策略嵌入 IAM 角色中时，内联策略将用作角色的访问（权限）策略的一部分。您将创建 `AWSRDSCustomIamRolePolicy` 策略，以允许 Amazon EC2 发送和接收消息，以及执行各种操作。

以下示例创建 `AWSRDSCustomIamRolePolicy` 名为的访问策略，然后将其添加到 IAM 角色 `AWSRDSCustomInstanceRole-region`。此示例假定您已设置以下环境变量：

`$REGION`  
将此变量设置为您计划在其中创建数据库实例的 AWS 区域。

`$ACCOUNT_ID`  
将此变量设置为您的 AWS 账户号码。

`$KMS_KEY`  
将此变量设置为您要用于 RDS Custom 数据库实例的 AWS KMS key 的 Amazon 资源名称（ARN）。要指定多个 KMS 密钥，请将其添加到语句 ID (Sid) 11 的 `Resources` 部分。

```
aws iam put-role-policy \
  --role-name AWSRDSCustomInstanceRole-$REGION \
  --policy-name AWSRDSCustomIamRolePolicy \
  --policy-document '{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Action": [
                "ssm:DescribeAssociation",
                "ssm:GetDeployablePatchSnapshotForInstance",
                "ssm:GetDocument",
                "ssm:DescribeDocument",
                "ssm:GetManifest",
                "ssm:GetParameter",
                "ssm:GetParameters",
                "ssm:ListAssociations",
                "ssm:ListInstanceAssociations",
                "ssm:PutInventory",
                "ssm:PutComplianceItems",
                "ssm:PutConfigurePackageResult",
                "ssm:UpdateAssociationStatus",
                "ssm:UpdateInstanceAssociationStatus",
                "ssm:UpdateInstanceInformation",
                "ssm:GetConnectionStatus",
                "ssm:DescribeInstanceInformation",
                "ssmmessages:CreateControlChannel",
                "ssmmessages:CreateDataChannel",
                "ssmmessages:OpenControlChannel",
                "ssmmessages:OpenDataChannel"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Sid": "2",
            "Effect": "Allow",
            "Action": [
                "ec2messages:AcknowledgeMessage",
                "ec2messages:DeleteMessage",
                "ec2messages:FailMessage",
                "ec2messages:GetEndpoint",
                "ec2messages:GetMessages",
                "ec2messages:SendReply"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Sid": "3",
            "Effect": "Allow",
            "Action": [
                "logs:PutRetentionPolicy",
                "logs:PutLogEvents",
                "logs:DescribeLogStreams",
                "logs:DescribeLogGroups",
                "logs:CreateLogStream",
                "logs:CreateLogGroup"
            ],
            "Resource": [
                "arn:aws:logs:'$REGION':'$ACCOUNT_ID':log-group:rds-custom-instance*"
            ]
        },
        {
            "Sid": "4",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": [
                "arn:aws:s3:::do-not-delete-rds-custom-*/*"
            ]
        },
        {
            "Sid": "5",
            "Effect": "Allow",
            "Action": [
                "cloudwatch:PutMetricData"
            ],
            "Resource": [
                "*"
            ],
            "Condition": {
                "StringEquals": {
                    "cloudwatch:namespace": [
                        "RDSCustomForOracle/Agent"
                    ]
                }
            }
        },
        {
            "Sid": "6",
            "Effect": "Allow",
            "Action": [
                "events:PutEvents"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Sid": "7",
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetSecretValue",
                "secretsmanager:DescribeSecret"
            ],
            "Resource": [
                "arn:aws:secretsmanager:'$REGION':'$ACCOUNT_ID':secret:do-not-delete-rds-custom-*",
                "arn:aws:secretsmanager:'$REGION':'$ACCOUNT_ID':secret:rds-custom!oracle-do-not-delete-*"
            ]
        },
        {
           "Sid": "8",
           "Effect": "Allow",
           "Action": [
             "s3:ListBucketVersions"
           ],
           "Resource": [
             "arn:aws:s3:::do-not-delete-rds-custom-*"
           ]
         },
         {
            "Sid": "9",
            "Effect": "Allow",
            "Action": "ec2:CreateSnapshots",
            "Resource": [
                "arn:aws:ec2:*:*:instance/*",
                "arn:aws:ec2:*:*:volume/*"
            ],
            "Condition": {
                "StringEquals": {
                    "ec2:ResourceTag/AWSRDSCustom": "custom-oracle"
                }
            }
          },
          {
            "Sid": "10",
            "Effect": "Allow",
            "Action": "ec2:CreateSnapshots",
            "Resource": [
                "arn:aws:ec2:*::snapshot/*"
            ]
          },
          {
            "Sid": "11",
            "Effect": "Allow",
            "Action": [
              "kms:Decrypt",
              "kms:GenerateDataKey"
            ],
            "Resource": [
              "arn:aws:kms:'$REGION':'$ACCOUNT_ID':key/'$KMS_KEY'"
            ]
          },
          {
            "Sid": "12",
            "Effect": "Allow",
            "Action": "ec2:CreateTags",
            "Resource": "*",
            "Condition": {
                "StringLike": {
                    "ec2:CreateAction": [
                        "CreateSnapshots"
                    ]
                }
            }
        },
        {
            "Sid": "13",
            "Effect": "Allow",
            "Action": [
                "sqs:SendMessage",
                "sqs:ReceiveMessage",
                "sqs:DeleteMessage",
                "sqs:GetQueueUrl"
            ],
            "Resource": "arn:aws:sqs:'$REGION':'$ACCOUNT_Id':do-not-delete-rds-custom-*",
            "Condition": {
                "StringLike": {
                    "aws:ResourceTag/AWSRDSCustom": "custom-oracle"
                }
            }
        }
    ]
}'
```

#### 步骤 3：创建 RDS Custom 实例配置文件 AWSRDSCustomInstanceProfile
<a name="custom-setup-orcl.iam.create-profile"></a>

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

如果您使用 CLI 创建角色，则是以单独操作的形式创建角色和实例配置文件，可以为它们提供不同的名称。按如下方式创建您的 IAM 实例配置文件，并使用格式 `AWSRDSCustomInstanceProfile-region` 对该配置文件命名。以下示例假设您已将环境变量 `$REGION` 设置为要在其中创建数据库实例的 AWS 区域。

```
aws iam create-instance-profile \
    --instance-profile-name AWSRDSCustomInstanceProfile-$REGION
```

#### 步骤 4：将 AWSRDSCustomInstanceRoleForRdsCustomInstance 添加到 AWSRDSCustomInstanceProfile
<a name="custom-setup-orcl.iam.add-profile"></a>

将您的 IAM 角色添加到您之前创建的实例配置文件。以下示例假设您已将环境变量 `$REGION` 设置为要在其中创建数据库实例的 AWS 区域。

```
aws iam add-role-to-instance-profile \
    --instance-profile-name AWSRDSCustomInstanceProfile-$REGION \
    --role-name AWSRDSCustomInstanceRole-$REGION
```

## 步骤 5：为您的 IAM 用户或角色授予所需的权限
<a name="custom-setup-orcl.iam-user"></a>

确保创建 CEV 或 RDS Custom 数据库实例的 IAM 主体（用户或角色）具有以下任一策略：
+ `AdministratorAccess` 策略
+ 具有 Amazon S3 和 AWS KMS、CEV 创建和数据库实例创建所需权限的 `AmazonRDSFullAccess` 策略

**Topics**
+ [Amazon S3 和 AWS KMS 所需的 IAM 权限](#custom-setup-orcl.s3-kms)
+ [创建 CEV 所需的 IAM 权限](#custom-setup-orcl.cev)
+ [从 CEV 创建数据库实例所需的 IAM 权限](#custom-setup-orcl.db)

### Amazon S3 和 AWS KMS 所需的 IAM 权限
<a name="custom-setup-orcl.s3-kms"></a>

要创建 CEV 或 RDS Custom for Oracle 数据库实例，IAM 主体需要访问 Amazon S3 和 AWS KMS。以下示例 JSON 策略授予所需的权限。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "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": "*"
        }
    ]
}
```

------

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

### 创建 CEV 所需的 IAM 权限
<a name="custom-setup-orcl.cev"></a>

要创建 CEV，IAM 主体需要以下额外权限：

```
s3:GetObjectAcl
s3:GetObject
s3:GetObjectTagging
s3:ListBucket
mediaimport:CreateDatabaseBinarySnapshot
```

以下示例 JSON 策略授予访问桶 *my-custom-installation-files* 及其内容所需的额外权限。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AccessToS3MediaBucket",
            "Effect": "Allow",
            "Action": [
                "s3:GetObjectAcl",
                "s3:GetObject",
                "s3:GetObjectTagging",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::my-custom-installation-files",
                "arn:aws:s3:::my-custom-installation-files/*"
            ]
        },
        {
            "Sid": "PermissionForByom",
            "Effect": "Allow",
            "Action": [
                "mediaimport:CreateDatabaseBinarySnapshot"
            ],
            "Resource": "*"
        }
    ]
}
```

------

您可以使用 S3 存储桶策略向调用者的账户授予 Amazon S3 的类似权限。

### 从 CEV 创建数据库实例所需的 IAM 权限
<a name="custom-setup-orcl.db"></a>

要从现有的 CEV 创建 RDS Custom for Oracle 数据库实例，IAM 主体需要以下额外权限。

```
iam:SimulatePrincipalPolicy
cloudtrail:CreateTrail
cloudtrail:StartLogging
```

以下示例 JSON 策略授予验证 IAM 角色和将信息记录到 AWS CloudTrail 所需的权限。

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

------

## 步骤 6：为 RDS Custom for Oracle 配置 VPC
<a name="custom-setup-orc.vpc-config"></a>

就像 Amazon EC2 实例或 Amazon RDS 实例一样，您的 RDS Custom 数据库实例位于基于 Amazon VPC 服务的虚拟私有云 (VPC) 中。您将提供并配置自己的 VPC。与 RDS Custom for SQL Server 不同，RDS Custom for Oracle 不创建访问控制列表或安全组。您必须附加自己的安全组、子网和路由表。

您可以使用 CloudFormation 或手动流程配置您的虚拟私有云（VPC）。

**重要**  
强烈建议您使用 CloudFormation 配置您的 RDS Custom for Oracle 环境。这种技术最简单，最不容易出错。

**Topics**
+ [使用 CloudFormation 配置 VPC（建议）](#custom-setup-orcl.cf.config-vpc)
+ [为 RDS Custom for Oracle 手动配置 VPC](#custom-setup-orcl.vpc)

### 使用 CloudFormation 配置 VPC（建议）
<a name="custom-setup-orcl.cf.config-vpc"></a>

如果您已经为其他 RDS Custom 引擎配置了 VPC 并且想要重用现有的 VPC，请跳过此步骤。此部分假设如下：
+ 您已使用 CloudFormation 创建 IAM 实例配置文件和角色。
+ 您知道路由表 ID。

  要使数据库实例成为私有实例，该实例必须位于私有子网中。要使子网成为私有子网，该子网不得与具有原定设置互联网网关的路由表关联。有关更多信息，请参阅《Amazon VPC 用户指南》**中的[配置路由表](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Route_Tables.html)。

当您对 VPC 使用 CloudFormation 模板时，该模板会创建以下资源：
+ 私有 VPC
+ 名为 `rds-custom-private` 的子网组
+ 以下 VPC 端点，您的数据库实例使用这些端点与从属 AWS 服务进行通信：
  + `com.amazonaws.region.ec2messages`
  + `com.amazonaws.region.events`
  + `com.amazonaws.region.logs`
  + `com.amazonaws.region.monitoring`
  + `com.amazonaws.region.s3`
  + `com.amazonaws.region.secretsmanager`
  + `com.amazonaws.region.ssm`
  + `com.amazonaws.region.ssmmessages`

  如果您要创建多可用区部署：
  + `com.amazonaws.region.sqs`
**注意**  
对于使用现有账户的复杂网络设置，如果访问权限尚不存在，建议您手动配置对从属服务的访问权限。有关更多信息，请参阅 [确保您的 VPC 可以访问从属 AWS 服务](#custom-setup-orcl.vpc.endpoints)。

**要采用 CloudFormation 配置 VPC**

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

1. 启动“创建堆栈”向导，选择**创建堆栈**，然后选择**使用新资源（标准）**。

1. 在 **Create stack**（创建堆栈）页面上，执行以下操作：

   1. 对于 **Prepare template**（准备模板），选择 **Template is ready**（模板就绪）。

   1. 在 **Template source**（模板来源）项下，选择 **Upload a template file**（上载模板文件）。

   1. 对于 **Choose file**（选择文件），请导航到 `custom-vpc.json` 并选择。

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

1. 在 **Specify stack details**（指定堆栈详细信息）页面中，请执行以下操作：

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

   1. 对于 **Parameters**（参数），请选择要用于 RDS Custom 数据库实例的私有子网。

   1. 选择要用于 RDS Custom 数据库实例的私有 VPC ID。

   1. 输入与私有子网关联的路由表。

   1. 选择 **Next**(下一步)。

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

1. 在**审核 custom-vpc** 页面上，选择**提交**。

   CloudFormation 会配置您的私有 VPC。在左侧面板中，当 **custom-vpc** 显示 **CREATE\$1COMPLETE** 时，继续执行下一步。

1. （可选）查看您的 VPC 的详细信息。在**堆栈**窗格中，选择 **custom-vpc**。在右窗格中，执行以下操作：

   1. 选择**堆栈信息**。堆栈的 ID 格式为：**arn:aws:cloudformation:*region*:*account-no*:stack/custom-vpc/*identifier***。

   1. 选择**资源**。您应该看到一个名为 **rds-custom-private** 的子网组和若干使用命名格式 **vpce-*string*** 的 VPC 端点。每个端点对应于 RDS Custom 需要与之通信的一项 AWS 服务。有关更多信息，请参阅 [确保您的 VPC 可以访问从属 AWS 服务](#custom-setup-orcl.vpc.endpoints)。

   1. 选择**参数**。您应该看到私有子网、私有 VPC 和您在创建堆栈时指定的路由表。在创建数据库实例时，您需要提供 VPC ID 和子网组。

### 为 RDS Custom for Oracle 手动配置 VPC
<a name="custom-setup-orcl.vpc"></a>

除了使用 CloudFormation 自动创建 VPC 之外，您还可以手动配置 VPC。当您具有使用现有资源的复杂网络设置时，此选项可能是最好的。

**Topics**
+ [确保您的 VPC 可以访问从属 AWS 服务](#custom-setup-orcl.vpc.endpoints)
+ [配置实例元数据服务](#custom-setup-orcl.vpc.imds)

#### 确保您的 VPC 可以访问从属 AWS 服务
<a name="custom-setup-orcl.vpc.endpoints"></a>

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 并跳过此过程。

#### 配置实例元数据服务
<a name="custom-setup-orcl.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)。

RDS Custom for Oracle 自动化程序预设情况下使用 IMDSv2，方法是在底层 Amazon EC2 实例上设置 `HttpTokens=enabled`。但是，您也可以根据需要使用 IMDSv1。有关更多信息，请参阅《Amazon EC2 用户指南》[https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-options.html](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-options.html)中的*配置实例元数据选项*。