我目前正在参加使用AWS EMR的一门课程。每次我想使用EMR时,都必须启动一个.sh(我们将其称为launch.sh
)脚本,该脚本基本上是在启动一个cloudformation模板(例如,它称为cf.json
)。 template_url
中有一个launch.sh
变量,可将其定向到带有http端点的s3(cf.json
)中的json文件。
我有权对该存储桶进行读写操作(不能删除/附加ACL)。我成功创建了cf.json
的副本,并将其称为cf2.json
。但是,当我将launch.sh
指向cf2.json
时,出现权限被拒绝的错误。
您知道是什么原因造成的吗?在cloudformation中是否有关于template_url
的权限控制?
这是我得到的错误。我屏蔽了日志中的所有详细信息,以防止隐私问题。
An error occurred (AccessDenied) when calling the CreateStack operation: User:
arn:aws:sts::12345678:assumed-role/CrossStack-IamRole-
ABCDEFGH/i-0123456 is not authorized to perform:
cloudformation:CreateStack on resource: arn:aws:cloudformation:us-east-
1:12345678:stack/student-emr/*
但是,当我使用原始网址时,会收到一条成功消息:
Creating EMR Cluster. This will take about 15 minutes...
{
"StackId": "arn:aws:cloudformation:us-east-1:12345678:stack/student-emr/some-hash-id"
}
这是launch.sh
aws cloudformation create-stack --region $emr_region --stack-name $stackname \
--template-url $template_url \
--parameters ParameterKey=Owner,ParameterValue=$student_id \
--role-arn $cf_role_arn
我更改了$template_url
变量的值
注意
两个.json文件(cf.json
和cf2.json
)都没有public-read
ACL,我已通过尝试从我的个人计算机复制该文件进行确认,该文件在尝试时会返回403执行s3 cp
。
答案 0 :(得分:1)
我在https://aws.amazon.com/blogs/devops/aws-cloudformation-security-best-practices/的AWS文档中找到了它
您可以在IAM角色中强制使用template_url
{
"Version":"2012-10-17",
"Statement":[{
"Effect": "Deny",
"Action": [
"cloudformation:CreateStack",
“cloudformation:UpdateStack”
],
"Resource": "*",
"Condition": {
"StringNotEquals": {
"cloudformation:TemplateURL": [
"https://s3.amazonaws.com/cloudformation-templates-us-east-1/IAM_Users_Groups_and_Policies.template"
]
}
}
},
{
"Effect": "Deny",
"Action": [
"cloudformation:CreateStack",
"cloudformation:UpdateStack"
],
"Resource": "*",
"Condition": {
"Null": {
"cloudformation:TemplateURL": "true"
}
}
}]
}