【问题标题】:Codebuild with SAM CLI Cross Account S3 issueCodebuild 与 SAM CLI Cross Account S3 问题
【发布时间】:2020-02-02 01:44:34
【问题描述】:

我在当前公司有一个多帐户设置。我在账户 B 中使用 CodeBuild,我正在运行一个构建规范,将转换后的 sam 模板上传到账户 A 中的 s3 存储桶。因此,Cloudformation 包将代码的 sam 构建上传到“account-a-bucket”。该作业成功地将工件部分中定义的转换后的模板上传到账户 B 中的存储桶。尝试在账户 C 中部署模板时出现问题。因为 codebuild 在构建步骤中创建 lambda 代码工件并将对象写入帐户之外的存储桶。当您查看存储在存储桶中的实际 lambda 工件时,例如 s3:://account-a-bucket/e309uofijokasjdfokajsllsk ,您将在对象权限中看到它不属于任何帐户。因此没有人可以访问它。如何让 codebuild 在另一个帐户存储桶中创建对象,使其归一个帐户所有?

另外需要注意的是,我已经将存储桶策略配置为向我组织中的所有帐户授予对帐户存储桶的访问权限,此外还授予帐户的规范 ID 以获取权限。所以我知道一个事实是 lambda 工件是在没有规范帐户所有者的情况下创建的,但是上传的工件(在 buildspec 的工件部分中)是在帐户规范 ID 下创建的。

我知道你可以使用,例如我在构建阶段使用

aws s3api 复制对象 --bucket destination_awsexammplebucket --key source_awsexamplebucket/myobject --acl bucket-owner-full-control

我可以使用 --acl bucket-owner-full-control,但这不是 aws cloudformation 包支持的标志。

env:
  variables:
      RELEASE_NUMBER: ""
      MINOR_NUMBER: "value"

 phases:
  install:
    runtime-versions:
       docker: 18
  build:
    commands:
      - echo Building Release Version $RELEASE_NUMBER
      - pip install --user aws-sam-cli
      - USER_BASE_PATH=$(python -m site --user-base)
      - export PATH=$PATH:$USER_BASE_PATH/bin
      - sam build -t template.yaml
      - aws cloudformation package --template-file template.yaml --s3-bucket account-a-bucket --output-template-file TransformedTemplate.yaml

artifacts:
    files:
       - TransformedTemplate.yaml
    discard-paths: yes

【问题讨论】:

    标签: amazon-web-services amazon-s3 amazon-iam aws-codebuild aws-sam-cli


    【解决方案1】:

    “aws cloudformation package”命令没有“--acl”选项,这是您面临问题的原因。这是一个悬而未决的问题 [1],但没有任何吸引力。

    目前,我认为您可以从“TransformedTemplate.yaml”中解析出 S3 对象键,然后在您的构建规范中运行以下命令以将 ACL 放在 S3 对象上:

    $ aws s3api put-object-acl --bucket account-a-bucket --key keyname --acl bucket-owner-full-control
    

    对于解析 json 文件,'jq' 可能是最好的实用程序。由于您使用的是 Yaml,因此 yq [2] 似乎是一种选择,尽管我自己从未测试过。

    参考:
    [1] https://github.com/aws/aws-cli/issues/2681
    [2]https://yq.readthedocs.io/en/latest/

    【讨论】:

    • 嘿@shariqmaws,感谢您的反馈。我正是采用了这种方法,它让我的账户 A 可以访问存储桶。我在转换后的模板上使用了 grep 来查找 codeURi 字段。有效。但是问题是我的帐户 C 仍然无法访问该对象,因为它仍然由帐户 B 拥有,并且帐户 A 也具有完全访问权限,但没有所有权。所以账户 C 不能工作
    猜你喜欢
    • 2021-04-29
    • 1970-01-01
    • 2022-10-07
    • 2020-07-20
    • 2011-07-03
    • 1970-01-01
    • 2013-06-17
    • 2021-10-15
    • 1970-01-01
    相关资源
    最近更新 更多