如何使用 CodePipeline 和标准 ACL 将构件部署到其他 AWS 账户中的 Amazon S3?
我想使用具有 Amazon S3 部署操作提供程序的 AWS CodePipeline 和标准访问控制列表 (ACL) 将构件部署到其他账户中的 Amazon Simple Storage Service (Amazon S3) 存储桶。
解决方法
**注意:**以下示例过程基于以下假设:
- 您有两个 AWS 账户: 开发账户和生产账户。
- 开发账户中的输入存储桶名为 codepipeline-input-bucket(已激活版本控制)。
- 开发账户中的默认构件存储桶名为 codepipeline-us-east-1-0123456789。
- 生产账户中的输出存储桶名为 codepipeline-output-bucket。
- 您正在将构件从开发账户部署到生产账户中的 S3 存储桶。
- 您正在使用标准 ACL 为生产账户中的存储桶拥有者提供对开发账户所拥有对象的访问权限。
**注意:**要部署构件并将生产账户设置为对象拥有者,请参阅如何使用 CodePipeline 将构件部署到其他账户中的 Amazon S3?
在开发账户中创建 CodePipeline
1.打开 CodePipeline 控制台。然后,选择 Create pipeline(创建管道)。
2.对于 Pipeline name(管道名称),输入管道的名称。例如:crossaccountdeploy。
**注意:**Role name(角色名称)文本框将自动填充服务角色名称 AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy。您也可以选择其他现有的服务角色。
3.展开 Advanced settings(高级设置)部分。
4.对于 Artifact store(构件商店),选择 Default location(默认位置)。
**注意:**如果您的用例需要,您可以选择 Custom location(自定义位置)。
5.对于 Encryption key(加密密钥),选择 Default AWS Managed Key(默认 AWS 托管式密钥)。
6.选择下一步。
7.在 Add source stage(添加源阶段)页面上,对于 Source provider(源提供程序),选择 Amazon S3。
8.对于 Bucket(存储桶),输入您的开发输入 S3 存储桶的名称。例如:codepipeline-input-bucket。
**重要事项:**输入存储桶必须激活版本控制才能使用 CodePipeline。
9.对于 S3 object key(S3 对象键),输入 sample-website.zip。
**重要事项:**要使用示例 AWS 网站而不是您自己的网站,请参阅“教程: 创建使用 Amazon S3 作为部署提供程序的管道”。然后,在“先决条件”(“1: 将静态网站文件部署到 Amazon S3”部分)中搜索“sample static website”。
10.对于 Change detection options(更改检测选项),选择 Amazon CloudWatch Events (recommended)(Amazon CloudWatch Events(推荐))。
11. 选择下一步。
12.在 Add build stage(添加构建阶段)页面上,选择 Skip build stage(跳过构建阶段)。然后,选择 Skip(跳过)。
13.在 Add deploy stage(添加部署阶段)页面上,对于 Deploy provider(部署提供程序),选择 Amazon S3。
14.对于 Region(区域),选择您的输出 S3 存储桶所在的 AWS 区域。例如: US East (N. Virginia)(美国东部(弗吉尼亚州北部))
15.对于 Bucket(存储桶),输入您的生产输出 S3 存储桶的名称。例如:codepipeline-output-bucket。
16.选中 Extract file before deploy(在部署前提取文件)复选框。
**注意:**如果需要,请为 Deployment path(部署路径)输入一个路径。
17.展开 Additional configuration(其他配置)。
18.对于 Canned ACL(标准 ACL),选择 bucket-owner-full-control。
**注意:**bucket-owner-full-control 可为生产账户中的存储桶拥有者提供对开发账户所部署和拥有的对象的完全访问权限。有关详细信息,请参阅 标准 ACL。
19.选择 Next(下一步)。
20.选择 Create pipeline(创建管道)。管道将运行,但源阶段将失败。出现以下错误: “The object with key 'sample-website.zip' does not exist“(具有“sample-website.zip”键的对象不存在)。
本文的“将示例网站上传到输入存储桶”部分介绍了如何解决此错误。
使用 AWS Identity and Access Management (IAM) 策略配置 CodePipeline 服务角色,该策略可为生产账户的输出存储桶添加 S3 访问权限
1.在开发账户中打开 IAM 控制台。
2.在导航窗格中,选择 Policies(策略)。然后,选择 Create policy(创建策略)。
3.选择 JSON 选项卡。然后,在 JSON 编辑器中输入以下策略:
**重要事项:**请将 codepipeline-output-bucket 替换为您的生产输出 S3 存储桶的名称。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:*", "Resource": "arn:aws:s3:::codepipeline-output-bucket/*" }, { "Effect": "Allow", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::codepipeline-output-bucket" } ] }
4.选择查看策略。
5.对于 Name(名称),输入策略的名称。例如:prodbucketaccess。
6.选择 Create policy(创建策略)。
7.在导航窗格中,选择 Roles(角色)。
8.从角色列表中选择 AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy。这是 CodePipeline 服务角色。
**注意:**如果您的用例需要,您可以使用自己的服务角色。
9.选择 Attach polices(附加策略)。
10.选择您创建的策略 (prodbucketaccess)。然后,选择 Attach policy(附加策略)以授予 CodePipeline 对生产输出 S3 存储桶的访问权限。
配置生产账户中的输出存储桶以允许开发账户进行访问
1.在生产账户中打开 Amazon S3 控制台。
2.在 Bucket name(存储桶名称)列表中,选择您的生产输出 S3 存储桶。例如:codepipeline-output-bucket。
3.选择 Permissions(权限)。然后,选择 Bucket Policy(存储桶策略)。
4.在文本编辑器中,输入以下策略,然后选择 Save(保存):
**重要事项:**请将 dev-account-id 替换为开发环境的 AWS 账户 ID。请将 codepipeline-output-bucket 替换为您的生产输出 S3 存储桶的名称。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::dev-account-id:root" }, "Action": "s3:Put*", "Resource": "arn:aws:s3:::codepipeline-output-bucket/*" }, { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::dev-account-id:root" }, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::codepipeline-output-bucket" } ] }
将示例网站上传到输入存储桶
1.在开发账户中打开 Amazon S3 控制台。
2.在 Bucket name(存储桶名称)列表中,选择您的开发输入 S3 存储桶。例如:codepipeline-input-bucket。
3.选择 Upload(上传)。然后,选择 Add files(添加文件)。
4.选择您下载的 sample-website.zip 文件。
5.选择 Upload(上传)以运行管道。当管道运行时,会出现以下情况:
- 源操作将从开发输入 S3 存储桶 (codepipeline-input-bucket) 中选择sample-website.zip。然后,源操作会将 zip 文件作为源构件放入开发账户 (codepipeline-us-east-1-0123456789) 的默认构件存储桶中。
- 在部署操作中,CodePipeline 服务角色 (AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy) 会使用其访问权限部署到生产输出 S3 存储桶 (codepipeline-output-bucket)。部署操作还会应用标准 ACL bucket-owner-full-control。
**注意:**开发账户是生产输出 S3 存储桶 (codepipeline-output-bucket) 中提取的对象的拥有者。生产账户中的存储桶拥有者也具有对已部署构件的完全访问权限。

相关内容
- AWS 官方已更新 5 个月前
- AWS 官方已更新 2 年前
- AWS 官方已更新 10 个月前