我在目前的公司中有一个多帐户设置。我在帐户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
答案 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/