0

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

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

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

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

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

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

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

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

4

1 回答 1

0

这种策略通常利用检查 AMI 启动权限的跨账户过滤器。

基本用法将匹配跨账户共享的任何 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如果它可以满足你的需求,建议单独使用过滤器。

于 2021-04-14T18:58:23.230 回答