

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 将 Infrastructure Composer 与亚马逊关系数据库服务 (Amazon RDS) 配合使用
<a name="using-composer-services-rds"></a>

AWS 基础设施编辑器 具有与亚马逊关系数据库服务（Amazon RDS）的集成。使用 Infrastructure Composer 中的 RD **S 数据库（外部）**增强组件卡，您可以将应用程序连接到在另一个 CloudFormation 或 AWS Serverless Application Model (AWS SAM) 模板上定义的 Amazon RDS DB 集群、实例和代理。

**RDS 数据库（外部）**增强型组件卡片表示在其他模板上定义的 Amazon RDS 资源。这包括：
+ 在其他模板上定义的 Amazon RDS DB 集群或实例
+ 亚马逊 RDS DB 代理

**RDS 数据库（外部）**增强型组件卡可从**资源**选项板中获得。

![Amazon RDS 数据库（外部）增强型组件卡。](http://docs.aws.amazon.com/zh_cn/infrastructure-composer/latest/dg/images/aac_use_rds_01.png)


要使用此卡片，请将其拖到基础设施编排器画布上，对其进行配置，然后将其连接到其他资源。

您可以通过 Lambda 函数将您的应用程序连接到外部 Amazon RDS DB 集群或实例。

## 要求
<a name="using-composer-services-rds-requirements"></a>

要使用此功能，必须满足以下要求：

1. 您的外部 Amazon RDS DB 集群、实例或代理必须使用 AWS Secrets Manager 来管理用户密码。要了解更多信息，请参阅[使用 Amazon RDS 管理密码和 AWS Secrets Manager](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-secrets-manager.html) *Amazon RDS 用户指南*。

1. 您在基础架构编排器中的应用程序必须是新项目，或者必须是最初在基础设施编排器中创建的。

## 过程
<a name="using-composer-services-rds-connect"></a>

### 步骤 1：配置外部 RDS 数据库卡
<a name="using-composer-services-rds-connect-step1"></a>

从 “**资源**” 选项板中，将 **RDS 数据库（外部）**增强型组件卡片拖到画布上。

选择卡片并选择 “**详细信息**”，或者双击卡片以打开 “**资源属性**” 面板。卡片的资源属性面板将出现：

![RDS 数据库（外部）增强组件卡的资源属性面板。](http://docs.aws.amazon.com/zh_cn/infrastructure-composer/latest/dg/images/aac_use_rds_03.png)


您可以在此处配置以下内容：
+ **逻辑 ID** — 外部 Amazon RDS DB 集群、实例或代理的唯一名称。此 ID 不必与您的外部 Amazon RDS DB 资源的逻辑 ID 值相匹配。
+ **数据库密钥** — 与您的 Amazon RDS DB 集群、实例或代理关联的 AWS Secrets Manager 密钥的标识符。此字段接受以下值：
  + **静态值**-数据库密钥的唯一标识符，例如机密 ARN。以下是示例：`arn:aws:secretsmanager:us-west-2:123456789012:secret:my-path/my-secret-name-1a2b3c`有关更多信息，请参阅《AWS Secrets Manager 开发人员指南》**中的 [AWS Secrets Manager 概念](https://docs.aws.amazon.com/secretsmanager/latest/userguide/getting-started.html)。
  + **输出值**-将 Secrets Manager 密钥部署到时 AWS CloudFormation，将创建一个输出值。您可以使用`[Fn::ImportValue](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-importvalue.html)`内部函数在此处指定输出值。例如 `!ImportValue MySecret`。
  + **来自 SSM 参数存储区的值** — 您可以将您的密钥存储在 SSM 参数存储库中，并使用动态引用指定其值。例如 `{{resolve:ssm:MySecret}}`。有关更多信息，请参阅《*AWS CloudFormation 用户指南》*中的 [SSM 参数](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/dynamic-references.html#dynamic-references-ssm)。
+ **数据库主机名**-可用于连接您的 Amazon RDS DB 集群、实例或代理的主机名。此值是在定义您的 Amazon RDS 资源的外部模板中指定的。接受以下值：
  + **静态值**-数据库主机名的唯一标识符，例如端点地址。以下是示例：`mystack-mydb-1apw1j4phylrk.cg034hpkmmjt.us-east-2.rds.amazonaws.com`
  + **输出值**-已部署的 Amazon RDS DB 集群、实例或代理的输出值。您可以使用`[Fn::ImportValue](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-importvalue.html)`内部函数指定输出值。例如 `!ImportValue myStack-myDatabase-abcd1234`。
  + **来自 SSM 参数存储区的值** — 您可以将数据库主机名存储在 SSM 参数存储中，并使用动态引用指定其值。例如 `{{resolve:ssm:MyDatabase}}`。
+ **数据库端口**-可用于连接您的 Amazon RDS DB 集群、实例或代理的端口号。此值是在定义您的 Amazon RDS 资源的外部模板中指定的。接受以下值：
  + **静态值**-数据库端口。例如 `3306`。
  + **输出值**-已部署的 Amazon RDS DB 集群、实例或代理的输出值。例如 `!ImportValue myStack-MyRDSInstancePort`。
  + **来自 SSM 参数存储的值**-您可以将数据库主机名存储在 SSM 参数存储中，并使用动态引用指定其值。例如 `{{resolve:ssm:MyRDSInstancePort}}`。

**注意**  
必须在此处配置逻辑 ID 值。如果您愿意，可以在部署时配置其他属性。

### 第 2 步：连接 Lambda 函数卡
<a name="using-composer-services-rds-connect-step2"></a>

从 “**资源**” 面板中，将 **Lambda 函数**增强型组件卡片拖到画布上。

将 **Lambda 函数**卡的左侧端口连接到 **RDS 数据库（外部）**卡的右侧端口。

![连接到 RDS 数据库（外部）增强组件卡的 Lambda 函数卡。](http://docs.aws.amazon.com/zh_cn/infrastructure-composer/latest/dg/images/aac_use_rds_02.png)


基础架构编排器将配置您的模板以促进此连接。

## 基础架构编排器为创建连接所做的工作
<a name="using-composer-services-rds-ref-how"></a>

完成上面列出的步骤后，基础设施编排器会执行特定操作将您的 Lambda 函数连接到您的数据库。

### 指定外部 Amazon RDS DB 集群、实例或代理时
<a name="using-composer-services-rds-ref-how-specify"></a>

当您将 **RDS 数据库（外部）**卡片拖到画布上时，基础设施编排器会根据需要更新模板的`Metadata`和`Parameters`部分。以下是示例：

```
Metadata:
  AWS::Composer::ExternalResources:
    ExternalRDS:
      Type: externalRDS
      Settings:
        Port: !Ref ExternalRDSPort
        Hostname: !Ref ExternalRDSHostname
        SecretArn: !Ref ExternalRDSSecretArn
Parameters:
  ExternalRDSPort:
    Type: Number
  ExternalRDSHostname:
    Type: String
  ExternalRDSSecretArn:
    Type: String
```

[元数据](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/metadata-section-structure.html)是一个 CloudFormation 模板部分，用于存储有关您的模板的详细信息。基础架构编排器特有的元数据存储在`AWS::Composer::ExternalResources`元数据密钥下。在这里，Infrastructure Composer 存储您为 Amazon RDS DB 集群、实例或代理指定的值。

 CloudFormation 模板的 “[参数](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-structure.html)” 部分用于存储自定义值，这些值可以在部署时插入到整个模板中。根据您提供的值类型，Infrastructure Composer 可能会在此处存储您的 Amazon RDS DB 集群、实例或代理的值，并在整个模板中指定这些值。

`Metadata`和`Parameters`部分中的字符串值使用您在 **RDS 数据库（外部）**卡上指定的逻辑 ID 值。如果更新逻辑 ID，则字符串值将发生变化。

### 将 Lambda 函数连接到您的数据库时
<a name="using-composer-services-rds-ref-how-connecting"></a>

当您将 **Lambda 函数**卡连接到 **RDS 数据库（外部）**卡时，基础设施编排器会配置环境变量和 AWS Identity and Access Management (IAM) 策略。以下是示例：

```
Resources:
  Function:
    Type: AWS::Serverless::Function
    Properties:
      ...
      Environment:
        Variables:
          EXTERNALRDS_PORT: !Ref ExternalRDSPort
          EXTERNALRDS_HOSTNAME: !Ref ExternalRDSHostname
          EXTERNALRDS_SECRETARN: !Ref ExternalRDSSecretArn
      Policies:
        - AWSSecretsManagerGetSecretValuePolicy:
            SecretArn: !Ref ExternalRDSSecretArn
```

[环境](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html#sam-function-environment)变量是您的函数可以在运行时使用的变量。要了解更多信息，请参阅*AWS Lambda 开发人员*指南中的[使用 Lambda 环境变量](https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html)。

[策略](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html#sam-function-policies)为您的函数提供权限。在这里，Infrastructure Composer 创建了一个策略，允许您的函数对 Secrets Manager 进行读取访问以获取您访问 Amazon RDS DB 集群、实例或代理的密码。