我的客户需要 AWS 大扫除!
在我们可以终止 EC2 实例之前,我们需要找出谁提供了这些实例,并在我们删除它们之前询问他们是否仍在使用该实例。AWS 似乎没有提供开箱即用的功能来报告 EC2 实例的“所有者”/“供应商”是谁,据我了解,我需要解析驻留在 S3 中的归档压缩日志文件.
问题是,他们的自动化是利用 STS AssumeRole 来提供实例。这意味着日志中的 RunInstances 事件不会追溯到实际用户(如果我错了,请纠正我,希望我错了)。
AWS 博客提供了一个虚构人物 Alice 的故事,以及她将 TerminateInstance 事件追溯到用户的步骤,该事件涉及 2 个日志事件:TerminateInstance 事件和包含实际用户详细信息的 AssumeRole 事件的“某时某时”事件. 是否有一种实用的方法可以将这两个事件关联起来?
这是我的 POC,它通过来自 s3 的 cloudtrail 日志进行解析:
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
然而,细节是通用的,因为这些角色由许多组共享。如何在脚本中担任角色之前找到用户的详细信息?
更新: 做了一些研究,看起来我可以通过共享的“accessKeyId”将 Runinstances 事件与 AssumeRole 事件相关联,并且应该在它承担角色之前向我显示帐户名称。虽然很棘手。并非所有 RunInstances 事件都包含此 accessKeyId,例如,如果“invokedby”是一个自动缩放事件。