首页 > 解决方案 > 使用 Lambda 从 CloudTrail API 调用中提取信息

问题描述

我设置了一条 CloudWatch 规则,以在创建新 AWS 账户时触发 Lambda 函数。我正在使用来自 CloudTrail 的 API 调用和 EventName CreateAccountResult。在 CloudTrail 日志中,它基本上为我提供了以下详细信息:

"serviceEventDetails": {
   "createAccountStatus": {
       "id": "string",
       "state": "SUCCEEDED",
       "accountName": "****",

       "accountId": " *accountID* ",

       "requestedTimestamp": "date/time",
       "completedTimestamp": "date/time"

触发的 lambda 函数是用 Python 3.7 编写的,并使用此账户 ID 创建一个 AWS 连接器,连接到名为 Trend Micro Deep Security 的程序。目前,我手动获取此帐户 ID,将其与变量交换,然后运行脚本:

import http.client
import mimetypes

def lambda_handler(event,context):
  account = ' *accountID* '
  conn = http.client.HTTPSConnection("app.deepsecurity.trendmicro.com", 443)
  payload = "{\n    \"crossAccountRoleArn\": \"arn:aws:iam::" + account + ":role/*role*\",\n    \"workspacesEnabled\": true\n}"
  headers = {
    'api-version': 'v1',
    'Content-Type': 'application/json',
    'api-secret-key': 'string'
  }
  conn.request("POST", "/api/awsconnectors", payload, headers)
  res = conn.getresponse()
  data = res.read()
  print(data.decode("utf-8"))

我希望能够做的是将一些代码写入 lambda 函数,该函数从触发 Lambda 函数的 CloudTrail 事件中提取账户 ID,并使用它来替换变量字符串以完成此脚本,本质上是自动化该过程。

有人知道实现这一目标的方法吗?

先感谢您!

编辑:我需要能够在实施之前对此进行测试,但我无法自由地创建帐户以进行反复试验。如果您还可以提供一种从现有 CloudTrail 日志中提取帐户 ID 的方法,以便我可以测试其功能,那将不胜感激。

我一直在测试使用 EC2 实例来提取实例 ID,但 AWS 帐户创建和 EC2 实例创建似乎相差太大而无法准确测试。

标签: amazon-web-serviceslambdaaws-lambdaamazon-cloudwatchamazon-cloudtrail

解决方案


多谢你们!

一直在修补这个答案以得出结论。看起来我们的触发器略有不同......

{
  "detail": {
    "eventSource": [
      "organizations.amazonaws.com"
    ],
    "eventName": [
      "CreateAccountResult"
    ]
  }
}

不过,我们还没有完全验证这一点,只是基于修改 EC2 实例以接受创建的帐户的测试。看起来 CloudTrail 日志的输出有点不同,但看起来键通常是相同的:

{
    "eventVersion": "1.05",
    "userIdentity": {
        "accountId": "###",
        "invokedBy": "AWS Internal"
    },
    "eventTime": "date/time",
    "eventSource": "organizations.amazonaws.com",
    "eventName": "CreateAccountResult",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "AWS Internal",
    "userAgent": "AWS Internal",
    "requestParameters": null,
    "responseElements": null,
    "eventID": "###",
    "readOnly": false,
    "eventType": "AwsServiceEvent",
    "recipientAccountId": "###",
    "serviceEventDetails": {
        "createAccountStatus": {
            "id": " car-#### ",
            "state": "SUCCEEDED",
            "accountName": "****",
            "accountId": " *accountID* ",
            "requestedTimestamp": "date/time",
            "completedTimestamp": "date/time"
        }
    }
}

推荐阅读