通过 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 堆栈