AMI的“云托管”过滤器密钥的JMESPath问题

时间:2020-05-15 16:54:51

标签: amazon-web-services jmespath cloudcustodian

我有一个用例,我想使用由Cloud Custodian创建的定期运行的Lambda函数来查找已与特定帐户共享的AWS AMI。

为了测试这一点,我创建了两个AMI:一个是私有/未共享的,一个是与已知帐户共享的。当我运行Lambda函数时,收到消息Filtered from 2 to 2 ami,即我使用的过滤器无法按照我希望的方式工作-我希望它可以从2到1 AMI进行过滤。

这是我使用的过滤器(我在此处输入了帐户的通用编号):

        filters:
          - type: image
            key: LaunchPermissions[0].UserId
            value: "123456789012"

我为密钥使用了不同的变体,但是在每种情况下都找不到我希望策略过滤器查找的AMI。我用https://jmespath.org对照下面的JSON检查了路径,它似乎返回了我想要的内容:

{
    "ImageId": "ami-1234567890",
    "LaunchPermissions": [
        {
            "UserId": "123456789012"
        }
    ]
}

我确定我没有正确处理image属性,但是我似乎无法弄清楚哪个JMESPath将给我帐户ID字符串。

有人可以在这里给我指点吗?

1 个答案:

答案 0 :(得分:0)

这种策略通常利用检查 AMI 启动权限的 cross-account 过滤器。

基本用法将匹配跨帐户共享的任何 AMI:

policies:
  - name: ami-cross-account
    resource: ami
    filters:
      - type: cross-account

您可以跳过已知帐户:

policies:
  - name: ami-cross-account
    resource: ami
    filters:
      - type: cross-account
        whitelist:
          - 111111111111
          - 222222222222

检查仅授予特定帐户的权限不太简单。 cross-account 过滤器本身不支持这种情况,但如果没有该过滤器,ami 资源将不包含启动权限详细信息。您需要改为组合过滤器,例如:

policies:
  - name: ami-cross-account
    resource: ami
    filters:
      - type: cross-account
      - type: value
        key: '"c7n:LaunchPermissions"[].UserId'
        value:
          - "123456789012"
        value_type: swap
        op: intersect

所以您有一些选择,但如果可以满足您的需求,建议单独使用 cross-account 过滤器。

相关问题