7月 18, 2019APIGateway,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に記録されました。