如何使用 CodePipeline 和预装 ACL 将构件部署到不同账户中的 Amazon S3?

上次更新日期: 2022 年 1 月 5 日

我想将项目部署到其他账户中的 Amazon Simple Storage Service (Amazon S3) 存储桶。有没有办法将 AWS CodePipeline 与 Amazon S3 部署操作提供程序和预装访问控制列表 (ACL) 搭配使用来执行此操作?

解决方案

注意:以下示例过程假定如下情况:

  • 您有两个 AWS 账户:开发账户和生产账户。
  • 开发账户中的输入存储桶称为 codepipeline-input-bucket(启动了版本控制)。
  • 开发账户中的默认构件存储桶称为 codepipeline-us-east-1-0123456789
  • 生产账户中的输出存储桶称为 codepipeline-output-bucket
  • 您正在将开发账户中的构件部署到生产账户中的 S3 存储桶。
  • 您使用预装 ACL 为生产账户中的存储桶拥有者提供归开发账户所有的对象的访问权限。
    注意:要部署构件并将开发账户设为对象拥有者,请参阅如何使用 CodePipeline 将构件部署到不同账户中的 Amazon S3?

在开发账户中创建 CodePipeline

1.    打开 CodePipeline 控制台。然后,选择创建管道

2.    对于管道名称,输入您的管道名称。例如:crossaccountdeploy

注意:角色名称文本框会自动填充服务角色名称 AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy。您也可以选择另一个现有的服务角色。

3.    展开高级设置部分。

4.    对于构件存储,请选择默认位置
注意:如果使用案例需要,则可以选择自定义位置

5.    对于加密密钥,选择默认 AWS 托管密钥

6.    选择下一步

7.    对于添加源阶段页面上的源提供商,选择 Amazon S3

8.    对于存储桶,输入您的开发输入 S3 存储桶的名称。例如:codepipeline-input-bucket
重要提示:输入存储桶必须启动版本控制才能使用 CodePipeline。

9.    对于 S3 对象键,输入 sample-website.zip

重要提示:要使用示例 AWS 网站而不是您自己的网站,请参阅教程:创建一个使用 Amazon S3 作为部署提供程序的管道。然后,在 1:将静态网站文件部署到 Amazon S3 部分的前提条件中搜索“示例静态网站”。

10.    对于更改检测选项,选择 Amazon CloudWatch Events(推荐)

11.    选择下一步

12.    在添加构建阶段页面上,选择跳过构建阶段。然后,选择跳过

13.    对于添加部署阶段页面上的部署提供程序,选择 Amazon S3

14.    对于区域,选择输出 S3 存储桶所在的 AWS 区域。例如:美国东部(弗吉尼亚北部)

15.    对于存储桶,输入生产输出 S3 存储桶的名称。例如:codepipeline-output-bucket

16.    选中在部署前提取文件复选框。
注意:如果需要,请为部署路径输入路径。

17.    展开其他配置

18.    对于预装 ACL,选择 bucket-owner-full-control
注意:bucket-owner-full-control 向生产账户中的存储桶拥有者授予由开发账户部署并归其所有的对象。有关更多信息,请参阅预装 ACL

19.    选择下一步

20.    选择创建管道。管道正在运行,但源阶段失败。出现以下错误:“密钥为 'sample-website.zip' 的对象不存在。”

此文章的上传示例网站至输入存储桶部分将向描述如何解决此错误。

使用 AWS Identity and Access Management (IAM) 策略配置 CodePipeline 服务角色,为生产账户的输出存储桶添加 S3 访问权限

1.    打开开发账户中的 IAM 控制台

2.    在导航窗格中,选择策略。然后选择创建策略

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.    选择 Review policy(查看策略)。

5.    在名称中,为策略输入名称。例如:prodbucketaccess

6.    选择创建策略

7.    在导航窗格中,选择角色

8.    从角色列表中选择 AWSCodePipelineServiceRole-us-east-1-crossaccountdeploy。这是 CodePipeline 服务角色。
注意:如果您的使用案例需要,您可以使用自己的服务角色。

9.    选择附加策略

10.    选择您创建的策略 (prodbucketaccess)。然后,选择连接策略以授予 CodePipeline 对生产输出 S3 存储桶的访问权限。

配置生产账户中的输出存储桶以允许从开发账户中访问

1.    打开生产账户中的 Amazon S3 控制台

2.    在存储桶名称列表中,选择您的生产输出 S3 存储桶。例如:codepipeline-output-bucket

3.    选择权限。然后,选择存储桶策略

4.    在文本编辑器中,输入以下策略,然后选择保存

重要提示: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.    在存储桶名称列表中,选择您的开发输入 S3 存储桶。例如:codepipeline-input-bucket

3.    选择上传。然后,选择添加文件

4.    选择下载的 sample-website.zip 文件。

5.    选择上传以运行管道。管道运行时,会出现以下情况:

  • 源操作从开发输入 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) 中提取的对象的拥有者。生产账户中的存储桶拥有者还拥有对已部署项目的完全访问权限。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?