带有SAM CLI跨帐户S3的Codebuild问题

时间:2019-10-03 17:32:02

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

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

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

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

上传

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

1 个答案:

答案 0 :(得分:2)

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

就目前而言,我认为您可以从“ TransformedTemplate.yaml”中解析出S3对象密钥,然后在您的buildspec中运行以下命令以在A3对象上放置ACL:

$ 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/