哪个用户启动了EC2实例?

时间:2014-05-06 08:15:33

标签: amazon-web-services amazon-ec2 amazon-iam

我有一些EC2实例,我不知道是谁推出了它们。

有没有办法知道是谁推出了特定的实例?

3 个答案:

答案 0 :(得分:15)

不幸的是,这些信息无法通过API调用直接获得 - 您目前有两种选择:

  1. 根据您的需求,您可以使用DescribeInstances API操作来查看用于启动该实例的key-name来近似您的目标(如果有的话,它是可选的,但通常就位) - 假设您已遵循安全最佳实践并且每个IAM用户使用专用的EC2密钥对(而不是共享密钥),则密钥通常应表示启动该实例的用户;)
  2. 现在您可以激活AWS CloudTrail记录您帐户的AWS API调用并向您提供日志文件提供您之后的信息

      

    记录的信息包括API调用者的身份,   API调用的时间,API调用者的源IP地址,   请求参数以及AWS返回的响应元素   服务。

  3.      AWS CloudTrail是一个姗姗来迟且非常宝贵的工具,可以提供前所未有的AWS使用情况;它很容易get started,目前只有一些警告:

答案 1 :(得分:0)

扩展Steffen Opel关于记录即服务的答案: 您可以使用第三方服务来可视化CloudTrail数据或设置您自己的解决方案。

Amazon Parters可以帮助您找到这样的服务。 如果您想围绕此构建自己的解决方案,那么此TrailDash也可以为您提供帮助。

答案 2 :(得分:0)

假设您已经在控制台中配置了CloudTrail(以监视正确的事件),这是一个可行的解决方案,可以在给定实例ID的情况下检索启动某个EC2实例的用户名。

此解决方案使用AWS CLI检索有关启动了哪些实例的信息,并使用进行解析。


调用aws cloudtrail lookup-events函数时,我们可以指定:

  • 事件的名称。在这种情况下,为 RunInstances
  • 开始搜索的日期,开始日期。可以在EC2实例启动时。
  • 要搜索的日期,结束日期。实例启动后可能只有一分钟。

首先,让我们找出实例启动的时间:

$ instance_id="i-123"
$ instance_launch_date=$(aws ec2 describe-instances --instance-ids $instance_id | jq '.Reservations[].Instances[].LaunchTime')
$ echo $instance_launch_date
"2020-07-08T15:21:02.000Z"

现在,让我们对日期进行清理,以使其采用适用于CloudTrail API的正确格式。

$ launch_date=$(sed -E 's/\"([0-9]{4})-([0-9]{2})-([0-9]{2}).([0-9]{2}):([0-9]{2}):([0-9]{2}).+/\2\/\3\/\1 \4:\5:\6/' <<< $instance_launch_date)
$ start_date=$(date -d "${launch_date}" +"%s")
$ echo $start_date
1594221662

现在,让我们将结束日期定义为实例启动的日期加上1分钟:

$ end_date=$(date -d "${launch_date} 1 min" +"%s")
echo $end_date
1594221722

现在调用CloudTrail API,并使用jq过滤输出:

aws cloudtrail lookup-events --lookup-attributes AttributeKey=EventName,AttributeValue=RunInstances --start-time $start_date --end-time $end_date | jq --arg INSTANCE_ID "$instance_id" '.Events[] | select(.CloudTrailEvent | fromjson | .responseElements.instancesSet.items[].instanceId | contains($INSTANCE_ID)) | .Username '
"paolo"