Проблема JMESPath с ключом фильтра Cloud Custodian для AMI

У меня есть пример использования, когда я хотел бы найти AMI AWS, которые были совместно использованы с определенной учетной записью, с использованием периодически запускаемой функции Lambda, созданной Cloud Custodian.

Чтобы проверить это, я создал два AMI: один закрытый / закрытый, другой - общий с известной учетной записью. Когда я запускаю лямбда-функцию, я получаю сообщение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"
        }
    ]
}

Я уверен, что неправильно обращаюсь к атрибуту изображения, но я просто не могу понять, какой JMESPath даст мне строку идентификатора учетной записи.

Кто-нибудь может дать мне указатель здесь, пожалуйста?

1 ответ

Такая политика обычно использует фильтр перекрестных учетных записей, который проверяет разрешения на запуск 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

Проверить разрешения, предоставленные только определенной учетной записи, не так просто. Фильтр изначально не поддерживает этот случай, но без этого фильтра 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 Рекомендуется использовать отдельный фильтр, если он может удовлетворить ваши потребности.

Другие вопросы по тегам