Использование Lambda для получения информации из вызова API CloudTrail - PullRequest
0 голосов
/ 14 июля 2020

У меня есть правило CloudWatch, настроенное для запуска функции Lambda при создании новой учетной записи AWS. Я использую вызовы API из CloudTrail с именем события CreateAccountResult. В журнале CloudTrail он в основном дает мне следующие данные:

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

       "accountId": " *accountID* ",

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

Срабатывающая лямбда-функция написана в Python 3.7 и использует этот идентификатор учетной записи для создания AWS коннектора к программе с именем Trend Micro Deep Security. В настоящее время я вручную беру этот идентификатор учетной записи, заменяю его переменной и запускаю скрипт:

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"))

То, что я хотел бы сделать, это написать некоторый код в лямбда-функцию, которая извлекает идентификатор учетной записи из события CloudTrail, запустившего функцию Lambda, и использовать его для замены строки переменной для завершения этого сценария, по существу, автоматизируя процесс.

Кто-нибудь знает способ выполнить sh это?

Заранее спасибо!

РЕДАКТИРОВАТЬ: Мне нужно проверить это перед реализацией, но я не могу свободно создавать учетные записи для проб и ошибок. Если бы вы также могли предоставить средства для извлечения идентификатора учетной записи из существующего журнала CloudTrail, чтобы я мог проверить его работу, это было бы очень полезно.

Я тестировал экземпляры EC2 чтобы получить идентификатор экземпляра, но AWS создание учетной записи и создание экземпляра EC2 кажутся слишком разными, чтобы точно проверить это.

Ответы [ 2 ]

0 голосов
/ 16 июля 2020

Спасибо, ребята!

Поработал с этим ответом, чтобы прийти к выводу. Похоже, наш триггер немного отличается ...

{
  "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"
        }
    }
}
0 голосов
/ 15 июля 2020
  1. Если ваше правило события, как показано ниже, вы можете изменить детали выборки лямбда-кода из того же события.

     {
       "source": [
         "aws.cloudtrail"
       ],
       "detail-type": [
         "AWS API Call via CloudTrail"
       ],
       "detail": {
         "eventSource": [
           "cloudtrail.amazonaws.com"
         ],
         "eventName": [
           "CreateAccountResult"
         ]
       }
     }
    
  2. Я изменил лямбда-код на используйте тот же вызов правила события, чтобы получить сведения об идентификаторе учетной записи и выполнить его. получить точные данные для этих двух строк

    event_state = event['createAccountStatus']['state']
    event_accountId = event['createAccountStatus']['accountId']
    
...