通过 CloudFormation CLi 跨账户 S3 访问

Posted

技术标签:

【中文标题】通过 CloudFormation CLi 跨账户 S3 访问【英文标题】:Cross account S3 access through CloudFormation CLi 【发布时间】:2018-06-17 10:37:00 【问题描述】:

我正在尝试通过运行以下命令使用 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。附加到我假设的角色的策略允许用户在我调试时 Administrator 访问 - 这仍然不起作用。

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

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

【问题讨论】:

调用aws sts assume-role ...并设置环境后。你能打电话给aws sts get-caller-identity 证明你确实使用了临时权限吗? 我不知道该命令,感谢您的提示。我不确定它是否证明我正在使用临时权限?然而,它们确实发生了变化。切换前返回的身份在456账号,切换后身份账号为123。 如果改变了,那么你做对了。你可以玩aws s3 ls / aws s3 ls bucket_name - 也许这样会弹出一些东西...... 我使用了 aws s3api head --bucket --key 并能够从 CLI 获取文件的详细信息。尽管如此,在 --template-url 中引用它还是行不通的。 当然,aws s3 ls 从命令行更方便。好吧,它抱怨 S3 权限,并且您清楚地提供了管理员访问权限。看起来像错误。请报告错误 - forums.aws.amazon.com - 看过,但没有运气... 【参考方案1】:

Amazon S3 通过使用存储桶策略提供跨账户访问。这些是 IAM 资源策略(应用于资源——在本例中为 S3 存储桶——而不是 IAM 委托人:用户、组或角色)。您可以在Amazon S3 Developer Guide 中阅读有关how Amazon S3 authorises access 的更多信息。

我对哪个帐户是哪个帐户有点困惑,所以我只想说,当您想在一个 AWS 帐户所拥有的存储桶中部署模板作为 中的堆栈时,您需要此存储桶策略不同的 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": "*",但我尚未对此进行测试) .

【讨论】:

以上是关于通过 CloudFormation CLi 跨账户 S3 访问的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AWS CLI 访问跨账户的 cloudwatch 指标

AWS CodePipeline 错误:不允许跨账户传递角色

将 CLI 代码转换为 CloudFormation JSON 格式

AWS CLI 与控制台和 CloudFormation 堆栈

使用 AWS CLI 将现有资源导入 CloudFormation

使用AWS CLI将现有资源导入CloudFormation