我正在尝试通过运行以下命令使用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 中显示存储桶。
总结:
错误:
调用CreateStack操作时发生错误(ValidationError):S3错误:拒绝访问 有关详情,请查看http://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html
我不明白我做错了什么,并且会感谢任何想法。与此同时,我会将模板上传到将使用它的所有帐户。
答案 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测试了这个)。