该策略未通过旧版解析

Man*_*eja 24 amazon-web-services amazon-iam aws-lambda

我正在尝试在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"
}]}
Run Code Online (Sandbox Code Playgroud)

rub*_*ful 28

我收到了这个错误,无法弄明白.一位同事和我倾盆而下,然后我们发现我没有留下替换变量Fn::Sub,例如

"Resource": "arn:aws:logs::${AWS::AccountId}:*
Run Code Online (Sandbox Code Playgroud)

会导致这个错误,当然应该是

"Resource": { "Fn::Sub": "arn:aws:logs::${AWS::AccountId}:*" }
Run Code Online (Sandbox Code Playgroud)

顺便说一句,根据我的经验,我同意上面的EJ Brennan,你不能在区域使用通配符,而是像我那样把它留空.

  • 令人难以置信的是,cloudformation错误报告太糟糕了,您必须进行纸面分析和调试。 (2认同)

Joh*_*Mee 17

如果您正在使用,serverless您可以通过在资源前添加前缀来指示您想要变量替换!Sub:

  Resource:
    - !Sub arn:aws:dynamodb:*:${AWS::AccountId}:table/${self:provider.environment.DYNAMODB_TABLE}
Run Code Online (Sandbox Code Playgroud)

不需要插件(如果无服务器版本是最新的)。

  • 这是最好的方法;自此推出以来,“serverless-pseudo-parameters”插件甚至已被弃用 (2认同)

asp*_*pak 11

如果 s3 失败,请确保您使用的是正确的 arn 格式:

  • 正确的一个是 3 ::: arn:aws:s3:::AccountABucketName

    "资源": "arn:aws:s3:::AccountAbucketName"

  • 错误一 2 :: arn:aws:s3::AccountABucketName

    "资源": "arn:aws:s3::AccountAbucketName"

计算s3和之间的冒号数AccountABucketName

  • 哇......我认为丢失的分号很难发现......谢谢! (2认同)

小智 5

我今天发现了一个有趣的新错误状态:

如果:

  • 您有一个 CFN 模板,您可以在其中通过参数提供帐户 ID
  • 并且您使用Default参数的道具来提供帐户 ID
  • 并且帐户 ID 以 0

CFN 实际上会将参数作为整数读取(并将其强制转换为 9.3476294382E10) - 无论您是否拥有Type: String该参数,或用于!!str显式强制转换。

所以解决方案是手动向部署提供参数,而不是使用Default: "093476294382".

希望我能拯救别人一些时间。


E.J*_*nan 0

我不认为你可以在 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