はじめに
APIGatewayカスタムアクセスログを設定する際の注意点
AWSマネジメントコンソールからAPI Gatewayのカスタムアクセスログを設定する際、公式ドキュメントに従って設定を行うとは思いますが、実はドキュメントだけでは不足しているポイントがあります。
それは、カスタムログフォーマットでの改行の設定方法です。
実際に案件で対応した際に、 ‘\n’ (改行コード)をログ末尾に追記しました。しかし、ログエントリは改行されず不完全なものだったため、今回検証しました。
AWSマネジメントコンソール上での設定
公式ドキュメントでは、改行を表すために ‘\n’ (改行コード)を設定するように記載されていますが、実際にAWSマネジメントコンソール上で設定を行う際には、’\n’を入力するのではなく、直接Enterキーを押して新しい行を作成する必要があります。
このステップを見落とすと、設定したはずの改行が反映されず、ログが期待通りに出力されない原因となります。
設定例
– csv形式
– 送信先はAmazon Data Firehose
– 最終的にS3へ転送する
AWS CLI、API、SDKを使用した設定
一方で、AWS CLI、APIやSDKを使用してカスタムアクセスログを設定する場合は、改行を表すために文字列 ‘\n’ を使用します。
この方法では、コード内で直接 ‘\n’ を指定し、これを通じてログメッセージの改行を制御します。
改行の重要性
API Gatewayのログを適切にフォーマットすることは非常に重要です。改行を設定しない場合、API Gatewayから出力されるすべてのログが一つのログエントリとして扱われてしまいます。
これは、ログの可読性を大幅に低下させるだけでなく、後続のログ分析作業を困難にします。
以下に改行された場合と、されていない場合のログエントリ例を記載していますが、可読性がまるで違います。
また、Athenaでクエリする際に改行されていないと、正確にクエリすることができず、分析に使えない不完全なログとなってしまいます。
改行しない場合のログ例
<接続元ipアドレス> - $ [13/Mar/2024:06:32:46 +0000] \"GET / HTTP/1.1"$ 1318 3369bd7a-1add-4180-b852-3db52f139c98 UjhGTEZTtjMEAMw=\n<接続元ipアドレス> - $ [13/Mar/2024:06:32:53 +0000] \"GET /pets/{petId} HTTP/1.1"$ 49 1d4032ad-614b-49f6-8a46-48aeab699045 UjhHbFJINjMEPIg=\n<接続元ipアドレス>
改行した場合のログ例
<接続元ipアドレス>,-,-,13/Mar/2024:09:04:22 +0000,GET,/pets/{petId},HTTP/1.1,200,49,fe764615-1d69-4145-82a1-276a0b3478d1 <接続元ipアドレス>,-,-,13/Mar/2024:09:04:24 +0000,GET,/pets/{petId},HTTP/1.1,200,49,6cc1ce60-a1a9-40f4-b2da-d59bf8ff073e <接続元ipアドレス>,-,-,13/Mar/2024:09:04:25 +0000,GET,/pets/{petId},HTTP/1.1,200,49,dfe675e0-a4f8-440d-a5bd-953def3dd68e
Athenaでの分析
AWS Athenaを使用してAPI Gatewayのログを分析する際、適切にフォーマットされたログがあると、SQLクエリを使用して簡単にデータを検索、分析することができます。
ログの各エントリが適切に改行されていれば、特定のAPI呼び出しやエラーメッセージを素早く特定できるようになります。
Athenaテーブル作成クエリ 例
パーティショニングは適当なものを追加してください
CREATE EXTERNAL TABLE IF NOT EXISTS <Table_Name> ( `ip` STRING, `caller` STRING, `user` STRING, `requestTime` STRING, `httpMethod` STRING, `resourcePath` STRING, `protocol` STRING, `status` STRING, `responseLength` STRING, `requestId` STRING, `extendedRequestId` STRING ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' WITH SERDEPROPERTIES ( 'serialization.format' = ',', 'field.delim' = ',' ) LOCATION 's3://<S3_Bucket_Name>/<prefix>/' TBLPROPERTIES ( 'has_encrypted_data'='true' ) ;
クエリ結果
ログエントリ毎に区切られた形でクエリできています
まとめ
AWS API Gatewayのカスタムアクセスログを設定する際には、設定環境(マネジメントコンソールかCLI/API/SDKか)に応じて正しい改行コードの設定方法を理解し、適用することが重要です。
これにより、ログの可読性と後続の分析作業の効率が大幅に向上します。
AWSを使用したアプリケーションの運用において、このような細かい設定が大きな違いを生むことを念頭に置いて、日々の管理作業を行っていきましょう。