该策略未通过旧版解析

时间:2017-03-27 11:22:02

标签: amazon-web-services aws-lambda amazon-iam

我正在尝试在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"
}]}

9 个答案:

答案 0 :(得分:15)

我收到此错误,无法解决。一位同事和我倒在上面,然后我们发现我留下了一个没有Fn::Sub的替代变量,例如

"Resource": "arn:aws:logs::${AWS::AccountId}:*

将导致此错误,当然应该是

"Resource": { "Fn::Sub": "arn:aws:logs::${AWS::AccountId}:*" }

顺便说一句,根据我的经验,我同意E.J.上面的Brennan,您不能对区域使用通配符,而应像在此一样将其保留为空白。

答案 1 :(得分:3)

如果您使用的是 serverless,您可以通过在资源前加上 !Sub 前缀来表明您想要变量替换:

  Resource:
    - !Sub arn:aws:dynamodb:*:${AWS::AccountId}:table/${self:provider.environment.DYNAMODB_TABLE}

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

答案 2 :(得分:1)

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

如果:

  • 您有一个CFN模板,可在其中通过参数提供帐户ID
  • 然后您使用参数的Default属性提供帐户ID
  • 并且帐户ID以0开头

CFN实际上会将参数读取为整数(并将其强制转换为9.3476294382E10) -无论您在参数上使用Type: String,还是使用!!str对其进行显式转换。

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

希望我可以节省一些时间。

答案 3 :(得分:1)

为了调试 CloudFormation 语法错误(其中许多错误消息与上述类似),我建议在部署前使用 cfn-lint 进行验证。以后你会感谢我的。

答案 4 :(得分:0)

我不认为你可以在arn上对该区域进行通配,所以你可能需要这样的东西:

  

arn:aws:logs:us-east-1:*:*

,您可以在其中指定您使用的区域代替我们 - east-1。

此处提供更多信息:

http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#arn-syntax-cloudwatch-logs

答案 5 :(得分:0)

您可能遇到的一个问题是cloudwatch日志ARNS可以有6个符号,因为日志组和日志流之间存在额外的问题。例如:

"Resource": "arn:aws:logs:us-west-2:123456789012:/my/log/group:log-stream"

或您的情况:

"Resource": "arn:aws:logs:*:*:*:*

我发现如果没有添加第6个:某些ARNS(例如上面更具体的示例)会出现此错误。我意识到这确实与文档(包括E.J提供的文档)相矛盾,所以也许它是AWS内部的一个错误

http://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/iam-identity-based-access-control-cwl.html

答案 6 :(得分:0)

我认为你可以做到

    "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"
                    ]
                },
                "/*"
            ]
        ]
    }

可能需要调整结尾

答案 7 :(得分:0)

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

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

    “资源”:“ arn:aws:s3 ::: AccountABucketName”

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

    “资源”:“ arn:aws:s3 :: AccountABucketName”

答案 8 :(得分:0)

我的问题是我尝试了 class VisitController { private function updateVisitors(Visit $visit, Collection $newVisitors): void { $newVisitorsPluck = []; foreach ($newVisitors as $visitor) { $newVisitorsPluck[$visitor->getId()] = $visitor->getType(); } $existingVisitors = $visit->Visitors()->pluck('visitor_type', 'visitor_id')->toArray(); $this->deleteRemovedVisitors($visit, $newVisitorsPluck, $existingVisitors); $this->addNewVisitors($visit, $newVisitorsPluck, $existingVisitors); } private function deleteRemovedVisitors(Visit $visit, array $newVisitors, array $existingVisitors): void { $deleteItems = array_diff_assoc($existingVisitors, $newAVisitors); foreach ($deleteItems as $visitorId => $visitorType) { DB::table('visitors_table') ->where('visit_id', '=', $visit->getKey()) ->where('visitor_id', '=', $visitorId) ->where('visitor_type', '=', $visitorType) ->delete(); } } private function addNewVisitors(Visit $visit, array $newVisitors, array $existingVisitors): void { $addItems = array_diff_assoc($newVisitors, $existingVisitors); foreach ($addItems as $visitorId => $visitorType) { $visit->Visitors()->save( new Visitvisitor([ ... ]) ); } } } 而不是 "Effect": "ALLOW"。嗯……