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