在 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
:5432
/ebdb
?user=username
&password=mypassword
"
}
URL 的突出显示部分对应于数据库的端点、端口、数据库名称、用户名和密码。
创建存储桶和上传文件
-
打开 Amazon S3 控制台
。 -
选择 Create Bucket(创建存储桶)。
-
键入 Bucket Name(存储桶名称),然后选择 Region(区域)。
-
选择创建。
-
打开该存储桶,然后选择 Upload(上载)
-
按照提示操作上传该文件。
默认情况下,您的账户拥有该文件并有权管理文件。但是,只有当您明确授予 IAM 用户和角色访问权限时,它们才有此权限。请通过将策略添加到实例配置文件来向 Elastic Beanstalk 环境中的实例授予权限。
默认实例配置文件命名为 aws-elasticbeanstalk-ec2-role
。如果您不确定实例配置文件的名称,则可以在环境管理控制台中的 Configuration(配置)页面上找到该配置文件。
向实例配置文件添加权限
-
打开 IAM 控制台
。 -
选择 Roles(角色)。
-
选择 aws-elasticbeanstalk-ec2-role。
-
选择 Add inline policy(添加内联策略)。
-
添加允许实例检索文件的策略。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "database", "Action": [ "s3:GetObject" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::
/DOC-EXAMPLE-BUCKET
-123456789012beanstalk-database.json
" ] } ] }将存储桶和对象名称替换为您的存储桶和对象的名称。
接下来,将一个配置文件添加到源代码中以指示 Elastic Beanstalk 在部署期间从 Amazon S3 下载文件。
~/my-app/.ebextensions/database.config
Resources:
AWSEBAutoScalingGroup:
Metadata:
AWS::CloudFormation::Authentication:
S3Auth:
type: "s3"
buckets: ["DOC-EXAMPLE-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/DOC-EXAMPLE-BUCKET
-123456789012
/beanstalk-database.json
此配置文件将执行两项操作。Resources
键将身份验证方法添加到环境的 Auto Scaling 组元数据。Elastic Beanstalk 可以使用此身份验证方法来访问 Amazon S3。files
键允许 Elastic Beanstalk 在部署期间从 Amazon S3 下载文件并将其本地存储在 /tmp/
中。
使用位于源代码根级的 .ebextensions
文件夹中的配置文件部署应用程序。如果正确配置了权限,则部署将成功且文件将下载到环境中的所有实例。如果未成功,配置将失败。
最后,将代码添加到应用程序来读取 JSON 文件并使用连接字符串连接到数据库。