我正在尝试在 AWS 中创建 IAM 角色,但在创建时遇到错误
"我们在处理您的请求时遇到了以下错误: 将权限附加到角色时出现问题。将在未经许可的情况下创建角色。 策略失败的旧版解析">
{"Version": "2012-10-17", "Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:*:*:*"
},
{
"Action": [
"sqs:SendMessage",
"sqs:GetQueueUrl"
],
"Effect": "Allow",
"Resource": "arn:aws:sqs:ap-northeast-1:SOME_ID_HERE:test-messages"
}]}
我得到了这个错误,但无法弄清楚。 我和一位同事仔细研究了它,然后我们发现我留下了一个没有Fn::Sub
的替换变量,例如
"Resource": "arn:aws:logs::${AWS::AccountId}:*"
会导致此错误,当然应该是
"Resource": { "Fn::Sub": "arn:aws:logs::${AWS::AccountId}:*" }
顺便说一句,根据我的经验,我同意上面的 E.J. 布伦南,你不能对区域使用通配符,而是像我在那里所做的那样将其留空。
如果 s3 失败,请确保您使用的是正确的 arn 格式:
-
正确的一个是 3 ::: arn:aws:s3:::AccountABucketName
"Resource": "arn:aws:s3:::AccountABucketName">
-
错误的一个 2 :: arn:aws:s3::AccountABucketName
"资源": "arn:aws:s3::AccountABucketName">
计算 s3
和 AccountABucketName
之间的冒号数
如果您使用的是serverless
您可以通过在资源前面加上 !Sub
来指示您希望替换变量:
Resource:
- !Sub arn:aws:dynamodb:*:${AWS::AccountId}:table/${self:provider.environment.DYNAMODB_TABLE}
不需要插件(如果无服务器版本是最新版本(。
我今天发现的一个有趣的新错误状态:
如果:
- 您有一个 CFN 模板,您可以在其中通过参数提供账户 ID
- 并且您使用参数的
Default
属性提供帐户 ID - 并且帐户 ID 以
0
开头
CFN 实际上会将参数读取为整数(并将其转换为 9.3476294382E10(- 无论您是否Type: String
参数,还是使用 !!str
显式强制转换它。
因此,解决方案是手动向部署提供参数,而不是使用Default: "093476294382"
。
希望我能为别人节省一些时间。
为了调试CloudFormation语法错误(其中许多都有无用的错误消息,如上面(,我建议在部署之前使用cfn-lint进行验证。你以后会感谢我的。
我的问题是我尝试了"Effect": "ALLOW"
而不是"Effect": "Allow"
。 唔
我认为您不能在 arn 上对区域进行通配符,因此您可能需要这样的东西:
arn:aws:logs:us-east-1:*:*
,您可以在其中指定用于代替 us-east-1 的区域。
更多信息在这里:
http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#arn-syntax-cloudwatch-logs
您可能遇到的一个问题是 cloudwatch 日志 ARNS 可以有 6 个符号,因为日志组和日志流之间有一个额外的符号。例如:
"Resource": "arn:aws:logs:us-west-2:123456789012:/my/log/group:log-stream"
或针对您的情况:
"Resource": "arn:aws:logs:*:*:*:*
我发现一些 ARNS(例如上面更具体的示例(如果未添加第 6 个 : 会给出此错误。我意识到这确实与文档(包括 E.J 提供的文档(相矛盾,所以也许这是 AWS 中某个地方的错误
http://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/iam-identity-based-access-control-cwl.html
我认为你可以做到
"Resource": "arn:aws:logs:us-west-2:123456789012:*"
但如果没有,您可以使用映射将您的帐户映射到该区域:
"mAWSRegionToAccountsMap": {
"us-west-2": {
"prod": "444444444673",
"dev": "678333333333"
},
"us-gov-west-1": {
"dev": "12345678903",
"prod": "234345345345"
}
}
然后使用分隔符的 ":" 将映射集成到联接中
"Resource": {
"Fn::Join": [
":",
[
"arn:aws:logs",
{
"Ref": "AWS::Region"
},
{
"Fn::FindInMap": [
"mAWSRegionToAccountsMap", {
"Ref": "AWS::Region"
},
"prod"
]
},
"/*"
]
]
}
可能需要调整结局
今天有这个 - cfn-lint
很高兴,但我得到了:
- !Sub "arn:aws:ec2:${AWS::Region}:{AWS::AccountId}:network-interface/*"
而不是:
- !Sub "arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:network-interface/*"
失踪的$
!
我也遇到了这个错误,我的错误与使用 !Sub
替换变量时缺少$
有关。
即:
"Resource": { "Fn::Sub": "arn:aws:sqs:ap-northeast-1:{SOME_ID_HERE}:test-messages" }
何时正确的表达式应为:
"Resource": { "Fn::Sub": "arn:aws:sqs:ap-northeast-1:${SOME_ID_HERE}:test-messages" }
这些工具可能很有用:
调试工具
- AWS Web 控制台策略模拟中的 UI(不过,您需要权限才能使用它(
- CLI 工具访问分析器(在 GH 存储库中没有这些示例,如何运行它不是很清楚(
- 包含本指南的 CloudTrail 可以帮助您查找最近的问题
也很高兴知道
- 无服务器变量(如果您使用
sls
(,小心${AWS::AccountId}
- 我的配置中有#{....}
,我最终写了这个 - AWS 关于验证策略的建议
不知道为什么 AWS CloudFormation 在这段时间里没有变得更有用。尽管如此,任何$
或${
都将是乐趣的源泉,尤其是当部署的堆栈不是基本的(例如,您有一个无服务器,每次尝试都需要>5 分钟(