策略旧版解析失败



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

计算 s3AccountABucketName 之间的冒号数

如果您使用的是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 分钟(

相关内容

  • 没有找到相关文章