通过CloudFormation CLi跨帐户S3访问

时间:2018-01-08 12:38:00

标签: amazon-web-services amazon-s3 amazon-cloudformation aws-cli

我正在尝试通过运行以下命令使用AWS CLI创建CloudFormation堆栈:

aws cloudformation create-stack --debug --stack-name ${stackName} --template-url ${s3TemplatePath} --parameters '${parameters}' --region eu-west-1

模板位于另一个帐户的S3存储桶中,我们可以将此帐户称为 456 。存储桶策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Example permissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::123:root"
                ]
            },
            "Action": [
                "s3:*"
            ],
            "Resource": "arn:aws:s3:::cloudformation.template.eberry.digital/*"
        }
    ]
}

(“Action:*”用于调试)。

现在扭转局面。我已登录帐户 456 ,我正在运行

aws sts assume-role --role-arn arn:aws:iam::123:role/delegate-access-to-infrastructure-account-role --role-session-name jenkins

并设置正确的环境变量以访问 123 。附加到我假设的角色的策略允许用户在我调试时管理员访问 - 这仍然不起作用。

aws s3api list-buckets

然后在帐户 123 中显示存储桶。

总结:

  • 在帐户 456 拥有的S3存储桶中将模板指定到控制台中的CloufFormation,登录帐户 123 有效。
  • 使用CLI在帐户 123 拥有的S3存储桶中指定模板有效。
  • 使用CLI在帐户 456 拥有的S3存储桶中指定模板不起作用。

错误:

  

调用CreateStack操作时发生错误(ValidationError):S3错误:拒绝访问   有关详情,请查看http://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html

我不明白我做错了什么,并且会感谢任何想法。与此同时,我会将模板上传到将使用它的所有帐户。

1 个答案:

答案 0 :(得分:5)

Amazon S3通过使用存储桶策略提供跨帐户访问。这些是IAM资源策略(应用于资源 - 在这种情况下是S3存储桶 - 而不是IAM主体:用户,组或角色)。您可以在how Amazon S3 authorises access中详细了解Amazon S3 Developer Guide

我对哪个帐户有点困惑,所以我只想说当你想在一个AWS账户所拥有的存储桶中将模板部署为一个堆栈时,你需要这个存储桶策略。 em>不同的 AWS账户。例如,模板位于AWS账户111111111111拥有的存储桶中,您希望使用该模板在AWS账户222222222222中部署堆栈。在这种情况下,您需要登录帐户222222222222并将该帐户指定为存储桶策略中的主体。

以下是提供对另一个AWS账户的访问权限的示例存储桶策略;我在我自己的CloudFormation模板桶中使用它。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::AWS_ACCOUNT_ID_WITHOUT_HYPHENS:root"
      },
      "Action": [
        "s3:GetBucketLocation",
        "s3:GetObject",
        "s3:GetObjectTagging",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::S3_BUCKET_NAME",
        "arn:aws:s3:::S3_BUCKET_NAME/*"
      ]
    }
  ]
}

您需要为要提供访问权限的AWS账户使用12位数的账户标识符,以及S3存储桶的名称(您可以使用"Resource": "*",但我没有&# 39; t测试了这个)。