My External Storage

Aug 30, 2021 - 3 minute read - Comments - aws

S3に保存されたAWS ALBのアクセスログをローカルでさっと確認するワンライナー

AWS ALBのログを漁って疎通確認をするときにちょっとラクするためのスニペットメモ。

$ aws s3 ls s3://${ALB_LOG_BUCKET}/AWSLogs/${ACCOUNT_ID}/elasticloadbalancing/ap-northeast-1/2021/08/30/ \
| awk '{print " s3://${ALB_LOG_BUCKET}/AWSLogs/${ACCOUNT_ID}/elasticloadbalancing/ap-northeast-1/2021/08/30/"$4}' \
| xargs -IS3URL aws s3 cp S3URL - | zcat

TL;DR

  • ALBのアクセスログはS3バケットに圧縮ファイルとして保存される
  • ログを確認したいとき、以下の手順を毎回踏むのがめんどくさい
    • AWS ConsoleからS3のアクセスログ用バケットを開く
    • オブジェクトの保存時刻を見てログが入ってそうな圧縮ファイルをダウンロードする
    • ローカルで解凍する
    • ログを確認する
    • 圧縮ファイルを削除する
    • 期待するログがなかったら再度圧縮ファイルのダウンロードから始める
  • 以下のコマンドを実行すれば圧縮ファイルをダウンロードしなくてもログを確認することができる
  • 該当日のすべての圧縮ファイルをGETするため、本番環境の利用時は課金など注意すること
$ aws s3 ls s3://${ALB_LOG_BUCKET}/AWSLogs/${ACCOUNT_ID}/elasticloadbalancing/ap-northeast-1/2021/08/30/ \
| awk '{print " s3://${ALB_LOG_BUCKET}/AWSLogs/${ACCOUNT_ID}/elasticloadbalancing/ap-northeast-1/2021/08/30/"$4}' \
| xargs -IS3URL aws s3 cp S3URL - | zcat

AWS ALBのログを漁りたい

開発中にインフラ構築をしていたり外部との疎通確認にアクセスログを確認したいときが度々ある。 AWS ALBのアクセスログの取得は結構簡単で、次のドキュメント通りに設定すればよい。

ただし、設定は簡単なのだがS3に圧縮ファイルが保存されるので実際にログを探すのはやや骨が折れる。

AWSコンソールからのログの確認手順

S3に保存されたログを確認するには次のような手順を踏むことになるだろう。

  1. AWS ConsoleからS3のアクセスログ用バケットを開く
  2. オブジェクトの保存時刻を見てログが入ってそうな圧縮ファイルをダウンロードする
  3. ローカルで解凍する
  4. ログを確認する
  5. 圧縮ファイルを削除する
  6. 期待するログがなかったら再度圧縮ファイルのダウンロードから始める

毎回ファイルを探すのが非常にめんどくさい。 また、圧縮ファイルをローカルに保存する(本番環境のバケットの中身を保存する)のがルール的にまずい組織もあるだろう。

awsコマンドを使ってログを標準出力に流すワンライナー

どうにかラクできないか?と思って書いたワンライナーが以下になる。

$ aws s3 ls s3://${ALB_LOG_BUCKET}/AWSLogs/${ACCOUNT_ID}/elasticloadbalancing/ap-northeast-1/2021/08/30/ \
| awk '{print " s3://${ALB_LOG_BUCKET}/AWSLogs/${ACCOUNT_ID}/elasticloadbalancing/ap-northeast-1/2021/08/30/"$4}' \
| xargs -IS3URL aws s3 cp S3URL - | zcat

利用するコマンド

パイプでつないで各々のコマンドを使う意図は次の通り。

aws s3 lsコマンドの結果として出力されるオブジェクト名には検索でしていしたプレフィックスがつかない。そのため、awkコマンドでプレフィックスを付けている。
ALBのアクセスログの場合のプレフィックスは次の通り。

bucket[/prefix]/AWSLogs/aws-account-id/elasticloadbalancing/region/yyyy/mm/dd/aws-account-id_elasticloadbalancing_region_load-balancer-id_end-time_ip-address_random-string.log.gz

あとはその完全パスのオブジェクト一覧にたいしてxargsコマンドでawsコマンドを再度実行する。 zcatは圧縮ファイルの中身を解凍してからcatしてくれる便利コマンド。

最後に(注意点)

アクセスログを漁るときはzcatzgrepを多用するが今回もzcatにはお世話になった。
注意点としてはS3はオブジェクトをGETするにもコストがかかるので、本場環境で多用しすぎると思わぬ課金にあうかもしれない。利用は自己責任で。 私自身はALB構築時のアクセスログ保存確認くらいのタイミング(curl数回叩いたあとログが出てるか確認する)でしか使っていない。

awkxargs力を上げればかなり効率的にコマンドライン生活を送れそうなのだがなかなか手が回っていない。この辺は地味にエンジニア力の基礎として大事そう。

参考

関連記事