Моему клиенту нужна генеральная уборка AWS!
Прежде чем мы сможем закрыть инстансы EC2, нам нужно выяснить, кто их предоставил, и спросить, используют ли они инстанс до сих пор, прежде чем мы их удалим. AWS, похоже, не предоставляет готовых функций для сообщения о том, кто является «владельцем» / «поставщиком» экземпляра EC2, как я понимаю, мне нужно проанализировать кучу заархивированных заархивированных файлов журнала, находящихся в S3 .
Проблема в том, что их автоматизация использует STS AssumeRole для предоставления экземпляров. Это означает, что событие RunInstances в журналах не отслеживается до фактического пользователя (поправьте меня, если я ошибаюсь, пожалуйста, надеюсь, я ошибаюсь).
AWS blog представляет собой историю вымышленного персонажа Алисы и ее шагов по отслеживанию события TerminateInstance до пользователя, которое включает 2 события журнала: событие TerminateInstance и событие «где-то во времени» события AssumeRole, содержащего фактические данные пользователя. Есть ли прагматичный подход, который можно использовать для сопоставления этих двух событий?
Вот мой POC, который анализирует журнал cloudtrail с s3:
import boto3
import gzip
import json
boto3.setup_default_session(profile_name=<your_profile_name>)
s3 = boto3.resource('s3')
s3.Bucket(<your_bucket_name>).download_file(<S3_path>, "test.json.gz")
with gzip.open('test.json.gz','r') as fin:
file_contents = fin.read().replace('\n', '')
json_data = json.loads(file_contents)
for record in json_data['Records']:
if record['eventName'] == "RunInstances":
user = record['userIdentity']['userName']
principalid = record['userIdentity']['principalId']
for index, instance in enumerate(record['responseElements']['instancesSet']['items']):
print "instance id: " + instance['instanceId']
print "user name: " + user
print "principalid " + principalid
Однако детали являются общими, поскольку эти роли разделяют многие группы. Как я могу найти информацию о пользователе до того, как он примет роль в сценарии?
ОБНОВЛЕНИЕ: я провел небольшое исследование, и, похоже, я могу сопоставить событие Runinstances с событием AssumeRole с помощью общего «accessKeyId», и это должно показать мне имя учетной записи, прежде чем она примет роль. Однако сложно. Не все события RunInstances содержат этот accessKeyId, например, если 'invokedby' было событием автомасштабирования.