1

私はCloudTrailからイベントを取得して解析するラムダ関数に取り組んでいます。PythonでCloudTrailログを解析する

私はこのスクリプトを持っている:

s3.download_file(bucket, key, download_path) 
     with gzip.open(download_path, "r") as f: 
      data = json.loads(f.read()) 
      print json.dumps(data) 
      for event in data['Records']: 
       if event['eventName'] in event_list: 
        dateEvent = datetime.strptime(event['eventTime'], "%Y-%m-%dT%H:%M:%SZ") 
        for element in event['userIdentity']: 
         for session in element[0]['sessionContext']: 
          username = session['userName'] 
          role = session['arn'] 

私はイベントのうち、userNamearnの値を取得することはできません。このエラーが表示されます:

string indices must be integers: TypeError 
Traceback (most recent call last): 
File "/var/task/lambda_function.py", line 34, in lambda_handler 
for session in element[0]['sessionContext']: 
TypeError: string indices must be integers 

どのようにするのですか?正しい方法は何ですか?一時的なIAM資格情報がそのイベントの際に使用された場合、それらは唯一存在するため

"userIdentity": { 
       "principalId": "aaaaaaaaaaaaaaaaaaaa", 
       "accessKeyId": "aaaaaaaaaaaaaaaaaaaaa", 
       "sessionContext": { 
        "sessionIssuer": { 
         "userName": "aaaaaaaaaaaaa", 
         "type": "Role", 
         "arn": "arn:aws:iam::aaaaaaaaaaaaaaaaaa:role/aaaaaaa", 
         "principalId": "aaaaaaaaaaaaaaaaaa", 
         "accountId": "aaaaaaaaaaaaaaaaaaa" 
        }, 
        "attributes": { 
         "creationDate": "2017-09-14T15:03:08Z", 
         "mfaAuthenticated": "false" 
       } 
      }, 
     "type": "AssumedRole", 
     "arn": "aaaaaaaaaaaaaaaaaaaaaaaa", 
     "accountId": "aaaaaaaaaaaaaaaaaa" 
    }, 
+0

あなたが 'セッション' を印刷する場合、あなたは何を得るのですか?あなたはおそらくJSONの間違ったレベルですか? –

+0

申し訳ありませんが、あなたは '要素'を印刷できますか? –

答えて

2

userIdentity要素がまたはsessionContext要素を持っていない可能性があります。ここでは

はJSON文字列です。 sessionContextなし

userIdentity要素は次のようになります。

"userIdentity": { 
    "type": "IAMUser", 
    "principalId": "AIDAJ45Q7YFFAREXAMPLE", 
    "arn": "arn:aws:iam::123456789012:user/Alice", 
    "accountId": "123456789012", 
    "accessKeyId": "AKIAIOSFODNN7EXAMPLE", 
    "userName": "Alice" 
} 

しかしsessionContext要素とuserIdentityは次のように次のようになります。

"userIdentity": { 
    "type": "AssumedRole", 
    "principalId": "AROAIDPPEZS35WEXAMPLE:AssumedRoleSessionName", 
    "arn": "arn:aws:sts::123456789012:assumed-role/RoleToBeAssumed/MySessionName", 
    "accountId": "123456789012", 
    "accessKeyId": "AKIAIOSFODNN7EXAMPLE", 
    "sessionContext": { 
     "attributes": { 
     "creationDate": "20131102T010628Z", 
     "mfaAuthenticated": "false" 
     }, 
     "sessionIssuer": { 
     "type": "Role", 
     "principalId": "AROAIDPPEZS35WEXAMPLE", 
     "arn": "arn:aws:iam::123456789012:role/RoleToBeAssumed", 
     "accountId": "123456789012", 
     "userName": "RoleToBeAssumed" 
     } 
    } 
} 

...または、それもこのようになります。ロールフェデレーションが発生していない場合

"userIdentity": { 
    "type": "IAMUser", 
    "principalId": "EX_PRINCIPAL_ID", 
    "arn": "arn:aws:iam::123456789012:user/Alice", 
    "accountId": "123456789012", 
    "accessKeyId": "EXAMPLE_KEY_ID", 
    "userName": "Alice", 
    "sessionContext": {"attributes": { 
     "mfaAuthenticated": "false", 
     "creationDate": "2014-03-06T15:15:06Z" 
    }} 
} 

だから戻ってあなたのコードに行く:sessionContextがリストではありませんので、

for element in event['userIdentity']: 
    for session in element[0]['sessionContext']: 
     username = session['userName'] 
     role = session['arn'] 

element[0]は存在しません。

使用しているまたは想定されているユーザ名とロールARNをフェッチする場合は、これが機能すると思います。 IAMUserまたはAssumedRole経由で直接行われたイベントを考慮します。

user_identity = event['userIdentity'] 

# check to see if we have a sessionContext[sessionIssuer] 
if 'sessionIssuer' in user_identity.get('sessionContext', {}): 
    user_name = user_identity['sessionContext']['sessionIssuer']['userName'] 
    arn = user_identity['sessionContext']['sessionIssuer']['arn'] 
else: 
    user_name = user_identity['userName'] 
    arn = user_identity['arn'] 

そして、あなたの処理ループの一部として:

for event in data['Records']: 
    if event['eventName'] in event_list: 
     dateEvent = datetime.strptime(event['eventTime'], "%Y-%m-%dT%H:%M:%SZ") 
     user_identity = event['userIdentity'] 

     # check to see if we have a sessionContext[sessionIssuer] 
     if 'sessionIssuer' in user_identity.get('sessionContext', {}): 
      user_name = user_identity['sessionContext']['sessionIssuer']['userName'] 
      arn = user_identity['sessionContext']['sessionIssuer']['arn'] 
     else: 
      user_name = user_identity['userName'] 
      arn = user_identity['arn'] 
関連する問題