AWS Elastic Beanstalk
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

配合使用 Elastic Beanstalk 和 Amazon Relational Database Service

AWS Elastic Beanstalk 为在 Elastic Beanstalk 环境中运行 Amazon Relational Database Service (Amazon RDS) 实例提供了支持。这对于开发和测试环境极为有用。但对生产环境却不理想,因为这会将数据库实例的生命周期绑定到应用程序的环境的生命周期。

注意

如果您之前没有将数据库实例与应用程序结合使用,请先尝试使用 Elastic Beanstalk 控制台将一个数据库实例添加到测试环境。这样,您就可以验证应用程序是否能够读取环境属性、构建连接字符串以及在将 Amazon Virtual Private Cloud (Amazon VPC) 和安全组配置添加到组合之前连接到数据库实例。有关更多信息,请参阅 向 Elastic Beanstalk 环境中添加数据库

要从环境中分离数据库实例,您可以在 Amazon RDS 中运行数据库实例并将应用程序配置为在启动时连接到该数据库实例。这样,您就可以将多个环境连接到数据库、在不影响数据库的情况下终止环境以及通过蓝/绿部署执行无缝更新。

要允许环境中的 Amazon EC2 实例连接到外部数据库,您可以使用一个额外的安全组配置环境的 Auto Scaling 组。您附加到环境的安全组可以是附加到数据库实例的同一安全组,也可以是数据库的安全组允许从中传入流量的其他安全组。

注意

您可以通过向数据库的安全组添加规则来将环境连接到数据库,该安全组允许来自自动生成的安全组 (由 Elastic Beanstalk 附加到环境的 Auto Scaling 组) 的入口流量。但是,这样做会在两个安全组之间建立依赖关系。随后,当您尝试终止环境时,Elastic Beanstalk 将无法删除环境的安全组,因为数据库的安全组依赖于环境的安全组。

在启动数据库实例并配置安全组后,您可以使用环境属性将连接信息(终端节点、密码等) 传递到应用程序。这是当您在环境中运行数据库实例时,Elastic Beanstalk 使用的相同机制。

为了提高安全性,您可以将连接信息存储在 Amazon S3 中,并将 Elastic Beanstalk 配置为在部署期间检索该信息。利用配置文件 (.ebextensions),您可以在部署应用程序时配置环境中的实例以从 Amazon S3 安全地检索文件。

在默认 VPC 中启动并连接到外部 Amazon RDS 实例

要将外部数据库与在 Elastic Beanstalk 中运行的应用程序结合使用,请首先使用 Amazon RDS 启动数据库实例。您使用 Amazon RDS 启动的任何实例都完全独立于 Elastic Beanstalk 和 Elastic Beanstalk 环境,并且在配置上不依赖于 Elastic Beanstalk。这意味着,您可以使用 Amazon RDS 支持的任何数据库引擎和实例类型,甚至是 Elastic Beanstalk 未使用的数据库引擎和实例类型。

以下过程介绍默认 VPC 的流程。如果您使用的是自定义 VPC,该流程也是相同的。唯一的附加要求是环境和数据库实例位于同一子网中,或位于可以互相通信的子网中。有关配置与 Elastic Beanstalk 一起使用的自定义 VPC 的详细信息,请参阅将 Elastic Beanstalk 与 Amazon Virtual Private Cloud 结合使用

在默认 VPC 中启动 RDS 数据库实例

  1. 打开 RDS 控制台

  2. 在导航窗格中选择 Instances

  3. 选择启动数据库实例

  4. 选择数据库引擎。选择 Next

  5. 选择一个使用案例 (如果系统有提示)。

  6. Specify DB details (指定数据库详细信息) 下,查看默认设置并根据需要进行调整。请注意以下选项:

    • DB instance class (数据库实例类) – 选择对于您的工作负载具有适当的内存量和 CPU 能力的实例大小。

    • 多可用区部署 – 为了获得高可用性,请设置为在其他区域创建副本

    • Master username (主用户名)Master password (主密码) – 数据库用户名和密码。请记下这些设置,因为您以后将使用这些值。

  7. 选择 Next

  8. Database options (数据库选项) 下,对于 Database name (数据库名称),输入 ebdb。记下数据库端口值以供以后使用。

  9. 验证其余选项的默认设置,然后选择启动数据库实例

接下来,修改附加到数据库实例的安全组以允许相应的端口上的入站流量。这与您稍后要附加到 Elastic Beanstalk 环境的安全组相同,因此您添加的规则将向同一安全组中的其他资源授予入口流量权限。

修改 RDS 实例的安全组上的入口流量规则

  1. 打开 Amazon RDS 控制台

  2. 选择 Instances

  3. 选择您的数据库实例的名称以查看其详细信息。

  4. 详细信息部分下,记下在此页面上显示的子网安全组终端节点,以便您以后使用此信息。

  5. 安全与网络下面,您可以查看与数据库实例关联的安全组。打开链接以在 Amazon EC2 控制台中查看安全组。

     Amazon RDS 控制台中的“数据库实例”页面的“详细信息”部分
  6. 在安全组详细信息中,选择入站选项卡。

  7. 选择 Edit

  8. 选择 Add Rule

  9. 对于 Type,请选择应用程序使用的数据库引擎。

  10. 对于,键入 sg- 以查看可用安全组的列表。选择当前安全组以允许安全组中的资源从同一组中的其他资源接收数据库端口上的流量。

     在 Amazon EC2 控制台中编辑安全组的入站规则
  11. 选择 Save (保存)

接下来,将数据库实例的安全组添加到您的运行环境。此过程将使 Elastic Beanstalk 使用附加的其他安全组重新配置环境中的所有实例。

向环境添加安全组

  1. 打开 Elastic Beanstalk 控制台

  2. 导航到您的环境的管理页

  3. 选择 Configuration

  4. 实例配置卡上,选择修改

  5. EC2 安全组下面,选择 Elastic Beanstalk 创建的实例安全组以及要附加到实例的安全组。

  6. 选择 Apply

  7. 阅读警告,然后选择确认

接下来,使用环境属性将连接信息传递到环境。当您使用 Elastic Beanstalk 控制台向环境添加数据库实例时,Elastic Beanstalk 会使用 RDS_HOSTNAME 之类的环境属性将连接信息传递到您的应用程序。您可以使用相同的属性,这将允许您将相同的应用程序代码与集成的数据库实例和外部数据库实例结合使用,您也可以选择自己的属性名称。

为 Amazon RDS 数据库实例配置环境属性

  1. 打开 Elastic Beanstalk 控制台

  2. 导航到您的环境的管理页

  3. 选择 Configuration

  4. Software 配置卡上,选择 Modify

  5. Environment properties (环境属性) 部分,定义应用程序读取的用于构建连接字符串的变量。为了与具有集成 RDS 数据库实例的环境兼容,请使用以下内容。

    • RDS_HOSTNAME – 数据库实例的主机名。

      Amazon RDS 控制台标签 – 终端节点 (这是主机名)

    • RDS_PORT – 数据库实例接受连接的端口。默认值因数据库引擎而异。

      Amazon RDS 控制台标签 – Port

    • RDS_DB_NAME – 数据库名称,ebdb

      Amazon RDS 控制台标签 – DB Name

    • RDS_USERNAME – 您为数据库配置的用户名。

      Amazon RDS 控制台标签 – Username

    • RDS_PASSWORD – 您为数据库配置的密码。

     添加了 RDS 属性的“环境属性”部分
  6. 选择 Apply

如果您尚未将应用程序编程为读取环境属性和构建连接字符串,请参阅以下特定于语言的主题以获得指导:

最后,根据应用程序读取环境变量的时间,您可能需要在环境中的实例上重新启动应用程序服务器。

重新启动您的环境的应用程序服务器

  1. 打开 Elastic Beanstalk 控制台

  2. 导航到您的环境的管理页

  3. 选择操作,然后选择重启应用程序服务器

在 EC2 Classic 中启动并连接到外部 Amazon RDS 实例

如果您将 EC2 Classic (无 VPC) 与 AWS Elastic Beanstalk 结合使用,该过程会由于安全组的工作方式的差异而略微改变。在 EC2 Classic 中,数据库实例无法使用 EC2 安全组,因此会获取只适用于 Amazon RDS 的数据库安全组。

您可以向数据库安全组添加规则以允许来自 EC2 安全组的入口流量,但您无法将数据库安全组附加到环境的 Auto Scaling 组。要避免在数据库安全组和您的环境之间建立依赖关系,您必须在 Amazon EC2 中创建第三个安全组,在数据库安全组中添加一个规则以便为新安全组授予入口权限,然后将其分配给您的 Elastic Beanstalk 环境中的 Auto Scaling 组。

在 EC2 Classic (无 VPC) 中启动 RDS 实例

  1. 打开 RDS 管理控制台

  2. 选择 Launch a DB Instance

  3. 继续执行向导,直至到达 Advanced Settings 页。记下为以下选项输入的值:

    • Master Username (主用户名)

    • Master Password (主密码)

  4. 对于 Network and Security 设置,请选择以下选项:

    • VPCNot in VPC。如果此选项不可用,则您的账户可能不支持 EC2-Classic,或者您可能已选择仅在 VPC 中可用的实例类型

    • 可用区No Preference

    • 数据库安全组Create new Security Group

  5. 配置剩余选项并选择 Launch DB Instance。记下为以下选项输入的值:

    • Database Name (数据库名称)

    • Database Port (数据库端口)

在 EC2-Classic 中,数据库实例将具有数据库安全组,而不是 VPC 安全组。您无法将数据库安全组附加到 Elastic Beanstalk 环境,因此需要创建一个新安全组,您可为其授予访问数据库实例的权限并将其附加到环境。我们将安全组此称为桥接安全组 并将其命名为 webapp-bridge

创建桥接安全组

  1. 打开 Amazon EC2 控制台.

  2. 在导航侧边栏中的 Network & Security 下,选择 Security Groups

  3. 选择 Create Security Group

  4. 对于 Security group name,请键入 webapp-bridge

  5. 对于 Description,请键入 Provide access to DB instance from Elastic Beanstalk environment instances

  6. 对于 VPC,将默认值保持选中状态。

  7. 选择 Create

接下来,修改附加到数据库实例的安全组以允许来自桥接安全组的入站流量。

修改 RDS 实例的安全组上的入口流量规则

  1. 打开 Amazon RDS 控制台

  2. 选择 Instances

  3. 选择数据库实例的条目旁的箭头以展开视图。

  4. 选择 Details 选项卡。

  5. Security and Network 部分中,与数据库实例关联的安全组将会显示。打开链接以在 Amazon EC2 控制台中查看安全组。

  6. 在安全组详细信息中,将 Connection Type 设置为 EC2 Security Group

  7. EC2 Security Group Name 设置为您创建的桥接安全组的名称。

  8. 选择 Authorize

接下来,将桥接安全组添加到您的运行环境。此过程要求使用附加的其他安全组重新配置环境中的所有实例。

向环境添加安全组

  1. 打开 Elastic Beanstalk 控制台

  2. 导航到您的环境的管理页

  3. 选择 Configuration

  4. 实例配置卡上,选择修改

  5. EC2 安全组下面,选择 Elastic Beanstalk 创建的实例安全组以及要附加到实例的安全组。

  6. 选择 Apply

  7. 阅读警告,然后选择确认

接下来,使用环境属性将连接信息传递到环境。当您使用 Elastic Beanstalk 控制台向环境添加数据库实例时,Elastic Beanstalk 会使用 RDS_HOSTNAME 之类的环境属性将连接信息传递到您的应用程序。您可以使用相同的属性,这将允许您将相同的应用程序代码与集成的数据库实例和外部数据库实例结合使用,您也可以选择自己的属性名称。

配置环境属性

  1. 打开 Elastic Beanstalk 控制台

  2. 导航到您的环境的管理页

  3. 选择 Configuration

  4. Software 配置卡上,选择 Modify

  5. Environment Properties 部分中,定义应用程序读取的用于构建连接字符串的变量。为了实现于与具有集成 RDS 实例的环境的兼容,请使用以下内容:

    • RDS_DB_NAME – Amazon RDS 控制台中显示的 DB Name

    • RDS_USERNAME – 向环境添加数据库时输入的 Master Username

    • RDS_PASSWORD – 向环境添加数据库时输入的 Master Password

    • RDS_HOSTNAME – Amazon RDS 控制台中显示的数据库实例的 Endpoint

    • RDS_PORT – Amazon RDS 控制台中显示的 Port

    选择加号符号可添加其他属性。

  6. 选择 Apply

如果您尚未将应用程序编程为读取环境属性和构建连接字符串,请参阅以下特定于语言的主题以获得指导:

最后,根据应用程序读取环境变量的时间,您可能需要在环境中的实例上重新启动应用程序服务器。

重新启动您的环境的应用程序服务器

  1. 打开 Elastic Beanstalk 控制台

  2. 导航到您的环境的管理页

  3. 选择操作,然后选择重启应用程序服务器

在 Amazon S3 中存储连接字符串

使用环境属性向应用程序提供连接信息是将密码置于代码外的好方法,但这不是完美解决方案。环境属性可在环境管理控制台中发现,并且可由有权在环境上描述配置设置的任何用户查看。根据平台,环境属性还可能显示在实例日志中。

您可以通过在控制的 Amazon S3 存储桶中存储连接信息来锁定该信息。基本步骤如下所示:

  • 将包含连接字符串的文件上传到 Amazon S3 存储桶。

  • 向 EC2 实例配置文件授予读取该文件的权限。

  • 将您的应用程序配置为在部署期间下载该文件。

  • 在应用程序代码中读取该文件。

首先,创建存储桶来存储包含连接字符串的文件。在本示例中,我们将使用具有单个键和值的 JSON 文件。该值是 Amazon RDS 中的 PostgreSQL 数据库实例的 JDBC 连接字符串。

beanstalk-database.json

{ "connection": "jdbc:postgresql://mydb.b5uacpxznijm.us-west-2.rds.amazonaws.com.cn:5432/ebdb?user=username&password=mypassword" }

URL 的突出显示部分对应于数据库的终端节点、端口、数据库名称、用户名和密码。

创建存储桶和上传文件

  1. 打开 Amazon S3 控制台

  2. 选择 Create Bucket

  3. 键入存储桶名称,然后选择区域

  4. 选择 Create

  5. 打开该存储桶,然后选择上传

  6. 按照提示操作上传该文件。

默认情况下,您的账户具有对该文件的所有权和管理权,但 IAM 用户和角色没有这些权限,除非您向其明确授予访问权限。请通过将策略添加到实例配置文件来向 Elastic Beanstalk 环境中的实例授予权限。

默认实例被命名为 aws-elasticbeanstalk-ec2-role。如果您不确定实例配置文件的名称,则可以在环境管理控制台中的配置页面上找到该配置文件。

向实例配置文件添加权限

  1. 打开 IAM 控制台

  2. 选择 Roles

  3. 选择 aws-elasticbeanstalk-ec2-role

  4. Inline Policies 下,选择 Create Role Policy。选择 Custom Policy

  5. 添加允许实例检索文件的策略。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "database", "Action": [ "s3:GetObject" ], "Effect": "Allow", "Resource": [ "arn:aws-cn:s3:::my-secret-bucket-123456789012/beanstalk-database.json" ] } ] }

    将存储桶和对象名称替换为您的存储桶和对象的名称。

接下来,将一个配置文件添加到源代码中以指示 Elastic Beanstalk 在部署期间从 Amazon S3 下载文件。

~/my-app/.ebextensions/database.config

Resources: AWSEBAutoScalingGroup: Metadata: AWS::CloudFormation::Authentication: S3Auth: type: "s3" buckets: ["my-secret-bucket-123456789012"] roleName: "aws-elasticbeanstalk-ec2-role" files: "/tmp/beanstalk-database.json" : mode: "000644" owner: root group: root authentication: "S3Auth" source: https://s3-us-west-2.amazonaws.com.cn/my-secret-bucket-123456789012/beanstalk-database.json

此配置文件将执行两项操作。Resources 键将身份验证方法添加到环境的 Auto Scaling 组元数据,Elastic Beanstalk 可使用该元数据访问 Amazon S3。files 键指示 Elastic Beanstalk 在部署期间从 Amazon S3 下载文件并将其本地存储在 /tmp/ 中。

使用位于源代码根级的 .ebextensions 文件夹中的配置文件部署应用程序。如果正确配置了权限,则部署将成功且文件将下载到环境中的所有实例。否则,配置将失败。

最后,将代码添加到应用程序来读取 JSON 文件并使用连接字符串连接到数据库。有关更多信息,请参阅以下特定于语言的主题:

清除外部 Amazon RDS 实例

在将外部 Amazon RDS 实例连接到 Elastic Beanstalk 环境时,数据库实例不会与环境的生命周期相关联,并且不会在您终止环境时被删除。要确保可能已存储在数据库实例中的个人信息不会被不必要地保留,请删除不再需要的任何记录或删除数据库实例。