API Gateway アクセスログ設定

9月 14, 2020APIGateway,AWS

API Gatewayの送信元IPをCloudWatchに記録したい

やりたいこと

  • API Gatewayのログは、デフォルトではCloudWatch Logsには記録されません。そして、API Gatewayの設定にログのロールを設定できますが、実はこのロールを設定しただけではCloudWatch Logsにはログは残りません。
  • また、ELBやEC2にインストールしたWebサーバーであれば、標準で送信元IPアドレスがログに記録されますが、API Gatewayの場合は、アクセスログを設定しなければ、送信元IPアドレスをログに記録することはできないのです。
 

実行ログとアクセスログ

  • API Gatewayのログには、実行ログとアクセスログがあります。以下ドキュメントからの引用です。
  • 今回は、アクセスログを設定したいと思います。
CloudWatch での API ログ作成には実行ログ作成とアクセスログ作成の 2 つのタイプがあります。実行ログ作成では、API Gateway は CloudWatch Logs を管理します。このプロセスには、ロググループとログストリームの作成、および呼び出し元のリクエストとレスポンスのログストリームへのレポートが含まれます。記録されたデータには、エラーまたは実行の追跡 (リクエストまたはレスポンスパラメータ値またはペイロードなど)、Lambda オーソライザー (以前のカスタムオーソライザー) が使用するデータ、API キーが必要かどうか、使用量プランが有効かどうかなどの情報が含まれます。
アクセスログの作成では、API 開発者として、API にアクセスしたユーザーと、呼び出し元が API にアクセスした方法を記録します。独自のロググループを作成したり、既存のロググループを選択したりすることができます。これらは、API Gateway で管理することができます。アクセスの詳細を指定するには、$context 変数を選択し、選択した形式で表示し、ロググループを宛先として選択します。各ログの一意性を維持するために、アクセスログ形式に $context.requestId を含める必要があります。
 
  • 実行ログの取得方法は、下記記事を参照ください。
 

アクセスログ設定方法

API Gateway用のロール準備

  • IAMにて、API Gateway用のロールを準備します。このロールにはCloudWatch Logsにログを記録するためのポリシー(AmazonAPIGatewayPushToCloudWatchLogs)を割り当てます。このポリシーが割り当てられていないとログは何も記録されません。
  • 上記で作成したロールのARN を忘れずにコピーします。
 

API Gatewayにロールを設定

  • API Gatewayの設定に、先ほどコピーしたロールのARN を貼り付け保存します。この設定はリージョン内のAPI Gateway全体に適用されます。
   

APIのステージにアクセスログ出力を有効化

  • 各APIのステージにて、アクセスログ出力を有効化します。設定のポイントは下記の通り。ログの形式は必要に応じて、変更ください。
    • カスタムアクセスのログ記録
      • アクセスログの有効化 ⇒ 有効
      • Access Log Destination ARN  ⇒ CloudWatch LogsのロググループのARNを指定(下記参照)
      • ログの形式 ⇒ 入力の例より[CSV]を押して、デフォルトのパラメータを指定(下記参照)
  • ロググループのARNは、下記となります。リージョン、アカウント番号、ロググループ名を置換します。事前に、ロググループを作成ください。
    • arn:aws:logs:region:account-id:log-group:log_group_name
  • ログの形式に指定するサンプルは、下記となります。今回やりたいことである送信元IPは、「$context.identity.sourceIp」として記録されます。

$context.identity.sourceIp,$context.identity.caller,$context.identity.user,$context.requestTime,$context.httpMethod,$context.resourcePath,$context.protocol,$context.status,$context.responseLength,$context.requestId
   
  • なお、実行ログとアクセスログは独立しており、両方を有効化することができます。
 

アクセスログサンプル

  • 以下、アクセスログのサンプルです。無事、送信元IPがCloudWatch Logsに記録されました。