AWS CloudTrail を使用した AWS Lambda API コールのロギング
AWS Lambda は、ユーザー、ロール、または AWS のサービス によって実行されたアクションの記録を提供するサービスである AWS CloudTrail と統合されています。CloudTrail は Lambda に対する API コールをイベントとしてキャプチャします。キャプチャされた呼び出しには、Lambda コンソールの呼び出しと、Lambda API 操作へのコード呼び出しが含まれます。CloudTrail で収集された情報を使用して、Lambda に対するリクエスト、リクエスト元の IP アドレス、リクエストの作成日時、その他の詳細を確認できます。
各イベントまたはログエントリには、リクエストの生成者に関する情報が含まれます。アイデンティティ情報は、以下を判別するのに役立ちます:
-
ルートユーザーまたはユーザー認証情報のどちらを使用してリクエストが送信されたか
-
リクエストが IAM Identity Center ユーザーに代わって行われたかどうか。
-
リクエストがロールまたはフェデレーションユーザーのテンポラリなセキュリティ認証情報を使用して行われたかどうか。
-
リクエストが、別の AWS のサービス によって送信されたかどうか。
アカウントを作成すると、AWS アカウント で CloudTrail がアクティブになり、自動的に CloudTrail の[イベント履歴] にアクセスできるようになります。CloudTrail の [イベント履歴] では、AWS リージョン で過去 90 日間に記録された 管理イベントの表示、検索、およびダウンロードが可能で、変更不可能な記録を確認できます。詳細については、「AWS CloudTrail ユーザーガイド」の「CloudTrail イベント履歴の使用」を参照してください。[イベント履歴] の閲覧には CloudTrail の料金はかかりません。
AWS アカウント で過去 90 日間のイベントを継続的に記録するには、証跡または CloudTrail Lake イベントデータストアを作成します。
- CloudTrail 証跡
-
証跡により、CloudTrail はログファイルを Amazon S3 バケットに配信できます。AWS Management Console を使用して作成した証跡はマルチリージョンです。AWS CLI を使用する際は、単一リージョンまたは複数リージョンの証跡を作成できます。アカウント内のすべて AWS リージョン でアクティビティを把握するため、マルチリージョン証跡を作成することをお勧めします。単一リージョンの証跡を作成する場合、証跡の AWS リージョン に記録されたイベントのみを表示できます。証跡の詳細については、「AWS CloudTrail ユーザーガイド」の「AWS アカウント の証跡の作成」および「組織の証跡の作成」を参照してください。
証跡を作成すると、進行中の管理イベントのコピーを 1 つ無料で CloudTrail から Amazon S3 バケットに配信できますが、Amazon S3 ストレージには料金がかかります。CloudTrail の料金の詳細については、「AWS CloudTrail の料金
」を参照してください。Amazon S3 の料金に関する詳細については、「Amazon S3 の料金 」を参照してください。 - CloudTrail Lake イベントデータストア
-
CloudTrail Lake を使用すると、イベントに対して SQL ベースのクエリを実行できます。CloudTrail Lake は、行ベースの JSON 形式の既存のイベントを Apache ORC
形式に変換します。ORC は、データを高速に取得するために最適化された単票ストレージ形式です。イベントはイベントデータストアに集約されます。イベントデータストアは、高度なイベントセレクタを適用することによって選択する条件に基いた、イベントのイミュータブルなコレクションです。どのイベントが存続し、クエリに使用できるかは、イベントデータストアに適用するセレクタが制御します。CloudTrail Lake の詳細については、「AWS CloudTrail ユーザーガイド」の「Lake の使用AWS CloudTrail」を参照してください。 CloudTrail Lake のイベントデータストアとクエリにはコストがかかります。イベントデータストアを作成する際に、イベントデータストアに使用する料金オプションを選択します。料金オプションによって、イベントの取り込みと保存にかかる料金、および、そのイベントデータストアのデフォルトと最長の保持期間が決まります。CloudTrail の料金の詳細については、「AWS CloudTrail の料金
」を参照してください。
CloudTrail の Lambda データイベント
データイベントでは、リソース上またはリソース内で実行されるリソースオペレーション (Amazon S3 オブジェクトの読み取りまたは書き込みなど) についての情報が得られます。これらのイベントは、データプレーンオペレーションとも呼ばれます。データイベントは、多くの場合、高ボリュームのアクティビティです。デフォルトで、ほとんどのデータイベントは CloudTrail でログ記録されません。また、CloudTrail のイベント履歴にも記録されません。
サポートされているサービスに対してデフォルトでログ記録される CloudTrail のデータイベントは、LambdaESMDisabled
です。このイベントを使用して Lambda イベントソースマッピングの問題をトラブルシューティングする方法の詳細については、「CloudTrail を使用した無効な Lambda イベントソースのトラブルシューティング」を参照してください。
追加の変更がイベントデータに適用されます。CloudTrail の料金の詳細については、「AWS CloudTrail の料金
CloudTrail コンソール、AWS CLI、または CloudTrail API オペレーションを使用して、 AWS::Lambda::Function
リソースタイプのデータイベントをログ記録できます。データイベントをログに記録する方法の詳細については、「 AWS CloudTrailユーザーガイド」の「 AWS Management Consoleを使用したデータイベントのログ記録」および「AWS Command Line Interfaceを使用したデータイベントのログ記録」を参照してください。
次の表に、データイベントをログに記録できる Lambda リソースタイプを示します。データイベントタイプ (コンソール) 列には、CloudTrail コンソールの[データイベントタイプ]リストから選択する値が表示されます。resources.type 値列には、AWS CLI または CloudTrail API を使用して高度なイベントセレクタを設定するときに指定する resources.type
値が表示されます。CloudTrail に記録されたデータ API 列には、リソース タイプの CloudTrail にログ記録された API コールが表示されます。
データイベントタイプ (コンソール) | resources.type 値 | CloudTrail にログ記録されたデータ API |
---|---|---|
Lambda |
AWS::Lambda::Function
|
eventName
、readOnly
、および resources.ARN
フィールドでフィルタリングして、自分にとって重要なイベントのみをログに記録するように高度なイベントセレクタを設定できます。次の例は、特定の関数のみのイベントをログ記録するデータイベント設定の JSON ビューです。オブジェクトの詳細については、「AWS CloudTrail API リファレンス」の「AdvancedFieldSelector」を参照してください。
[ { "name": "function-invokes", "fieldSelectors": [ { "field": "eventCategory", "equals": [ "Data" ] }, { "field": "resources.type", "equals": [ "AWS::Lambda::Function" ] }, { "field": "resources.ARN", "equals": [ "
arn:aws:lambda:us-east-1:111122223333:function:hello-world
" ] } ] } ]
CCloudTrail の Lambda 管理イベント
管理イベントでは、AWS アカウント のリソースに対して実行される管理オペレーションについての情報が得られます。これらのイベントは、コントロールプレーンオペレーションとも呼ばれます。CloudTrail は、デフォルトで管理イベントをログ記録します。
Lambda は、次のアクションを管理イベントとして CloudTrail ログファイルに記録することをサポートしています。
注記
CloudTrail ログファイルでは、 eventName
に日付やバージョン情報が含まれる場合がありますが、同じ公開 API アクションを指しています。例えば、GetFunction
のアクションが GetFunction20150331v2
として表示される場合があります。次のリストは、イベント名が API アクション名と異なるタイミングを指定します。
-
AddPermission (イベント名:
AddPermission20150331v2
) -
CreateAlias (イベント名:
CreateAlias20150331
) -
CreateEventSourceMapping (イベント名:
CreateEventSourceMapping20150331
) -
CreateFunction (イベント名:
CreateFunction20150331
)(
Environment
およびZipFile
パラメータは、CreateFunction
では CloudTrail ログから省かれます)。 -
DeleteAlias (イベント名:
DeleteAlias20150331
) -
DeleteEventSourceMapping (イベント名:
DeleteEventSourceMapping20150331
) -
DeleteFunction (イベント名:
DeleteFunction20150331
) -
DeleteFunctionConcurrency (イベント名:
DeleteFunctionConcurrency20171031
) -
GetAlias (イベント名:
GetAlias20150331
) -
PublishLayerVersion (イベント名:
PublishLayerVersion20181031
)(
ZipFile
パラメータは、PublishLayerVersion
では CloudTrail ログから省かれます)。 -
PublishVersion (イベント名:
PublishVersion20150331
) -
PutFunctionConcurrency (イベント名:
PutFunctionConcurrency20171031
) -
RemovePermission (イベント名:
RemovePermission20150331v2
) -
TagResource (イベント名:
TagResource20170331v2
) -
UntagResource (イベント名:
UntagResource20170331v2
) -
UpdateAlias (イベント名:
UpdateAlias20150331
) -
UpdateEventSourceMapping (イベント名:
UpdateEventSourceMapping20150331
) -
UpdateFunctionCode (イベント名:
UpdateFunctionCode20150331v2
)(
ZipFile
パラメータは、UpdateFunctionCode
では CloudTrail ログから省かれます)。 -
UpdateFunctionConfiguration (イベント名:
UpdateFunctionConfiguration20150331v2
)(
Environment
パラメータは、UpdateFunctionConfiguration
では CloudTrail ログから省かれます)。
CloudTrail を使用した無効な Lambda イベントソースのトラブルシューティング
API アクション UpdateEventSourceMapping を使用してイベントソースマッピングの状態を変更すると、API コールは管理イベントとして CloudTrail でログ記録されます。イベントソースマッピングは、エラーが原因で Disabled
状態に直接移行することもあります。
次のサービスでは、イベントソースが Disabled 状態に移行する際、Lambda により CloudTrail に LambdaESMDisabled
データイベントが発行されます。
-
Amazon Simple Queue Service (Amazon SQS)
-
Amazon DynamoDB
-
Amazon Kinesis
Lambda は、他のイベントソースマッピングタイプでこのイベントをサポートしていません。
サポートされているサービスのイベントソースマッピングが Disabled
状態に移行した際にアラートを受信するには、CloudTrail イベント LambdaESMDisabled
を使用して Amazon CloudWatch でアラームを設定します。CloudWatch アラームの設定についての詳細は、「Creating CloudWatch alarms for CloudTrail events: examples」を参照してください。
LambdaESMDisabled
イベントメッセージの serviceEventDetails
エンティティには、次のいずれかのエラーコードが含まれます。
RESOURCE_NOT_FOUND
-
リクエストで指定されたリソースは存在しません。
FUNCTION_NOT_FOUND
-
イベントソースにアタッチされている関数が存在しません。
REGION_NAME_NOT_VALID
-
イベントソースまたは関数に指定されたリージョン名が無効です。
AUTHORIZATION_ERROR
-
アクセス許可が設定されていないか、正しく設定されていません。
FUNCTION_IN_FAILED_STATE
-
関数コードがコンパイルされない、回復不能な例外が発生した、または不正なデプロイが発生しました。
Lambda イベントの例
各イベントは任意の送信元からの単一のリクエストを表し、リクエストされた API オペレーション、オペレーションの日時、リクエストパラメーターなどに関する情報を含みます。CloudTrail ログファイルは、パブリック API コールの順序付けられたスタックトレースではないため、イベントは特定の順序で表示されません。
以下は、GetFunction
アクションと DeleteFunction
アクションの CloudTrail ログエントリの例です。
注記
eventName
には、"GetFunction20150331"
のような日付やバージョン情報が含まれることがありますが、同じ公開 API を指しています。
{ "Records": [ { "eventVersion": "1.03", "userIdentity": { "type": "IAMUser", "principalId": "A1B2C3D4E5F6G7EXAMPLE", "arn": "arn:aws:iam::111122223333:user/myUserName", "accountId": "111122223333", "accessKeyId": "AKIAIOSFODNN7EXAMPLE", "userName": "myUserName" }, "eventTime": "2015-03-18T19:03:36Z", "eventSource": "lambda.amazonaws.com", "eventName": "GetFunction", "awsRegion": "us-east-1", "sourceIPAddress": "127.0.0.1", "userAgent": "Python-httplib2/0.8 (gzip)", "errorCode": "AccessDenied", "errorMessage": "User: arn:aws:iam::111122223333:user/myUserName is not authorized to perform: lambda:GetFunction on resource: arn:aws:lambda:us-west-2:111122223333:function:other-acct-function", "requestParameters": null, "responseElements": null, "requestID": "7aebcd0f-cda1-11e4-aaa2-e356da31e4ff", "eventID": "e92a3e85-8ecd-4d23-8074-843aabfe89bf", "eventType": "AwsApiCall", "recipientAccountId": "111122223333" }, { "eventVersion": "1.03", "userIdentity": { "type": "IAMUser", "principalId": "A1B2C3D4E5F6G7EXAMPLE", "arn": "arn:aws:iam::111122223333:user/myUserName", "accountId": "111122223333", "accessKeyId": "AKIAIOSFODNN7EXAMPLE", "userName": "myUserName" }, "eventTime": "2015-03-18T19:04:42Z", "eventSource": "lambda.amazonaws.com", "eventName": "DeleteFunction20150331", "awsRegion": "us-east-1", "sourceIPAddress": "127.0.0.1", "userAgent": "Python-httplib2/0.8 (gzip)", "requestParameters": { "functionName": "basic-node-task" }, "responseElements": null, "requestID": "a2198ecc-cda1-11e4-aaa2-e356da31e4ff", "eventID": "20b84ce5-730f-482e-b2b2-e8fcc87ceb22", "eventType": "AwsApiCall", "recipientAccountId": "111122223333" } ] }
CloudTrail レコードの内容については、「AWS CloudTrail ユーザーガイド」の「CloudTrail record contents」を参照してください。