🐕
AmplifyのアクセスログをGitHub Actionsを用いて日時でS3にアップロードする
Amplify のアクセスログは S3 や CloudWatch Logs との Integration がサポートされてない
Amplify はとても便利なサービスです。
なので、アクセスログもコンソールぽちぽちやったらすぐに S3 に転送されるようにできると思っていた...
できないです。
アクセスログを取得する方法は、下記の 2 通り
- コンソールからアクセスログをダウンロードする
- AWS CLI を用いてダウンロード URL を生成して、そこからダウンロードする
いちいちコンソールからダウンロードするのはめんどくさいので、当然 AWS CLI を使って自動で S3 に転送する仕組みを考えた。
自動でアクセスログを S3 に転送したい
最初は下記を参考にEventBridge
でスケジュール発火してLambda
でとってくる方法を考えた。
ただ Lambda を作るのもちょっとめんどくさい。
AWS CLI と curl で取得する方法発見。タイトルの通り、これならサクッと取得できそう。
なら GitHub Actions で日時でワークフロー回せばいいんじゃね、と思い作ったのがこちら
name: ExportAccessLogsToS3
on:
schedule
- cron: '0 0 * * *'
env:
TZ: UTC
permissions:
id-token: write
contents: read
jobs:
ExportAccessLogsToS3:
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-region: ${{ secrets.AWS_REGION }}
role-to-assume: ${{ secrets.ROLE_TO_ASSUME }}
- name: Generate Access logs & Export CSV & Upload S3
run: |
START_TIME=`date -d "1 days ago" "+%Y-%m-%dT00:00:00"`
END_TIME=`date -d "1 days ago" "+%Y-%m-%dT23:59:59"`
DOMAIN_NAME=xxx.amplifyapp.com
aws amplify generate-access-logs --start-time $START_TIME --end-time $END_TIME --domain-name $DOMAIN_NAME --app-id ${{ secrets.AMPLIFY_APP_ID }} --query logUrl | xargs curl -o /tmp/filename.csv
aws s3 cp /tmp/filename.csv s3://${{ secrets.S3_BUCKET_NAME }}
日時で昨日のアクセスログを収集した CSV ファイルを s3 に転送しています。
Amplify のアクセスログは UTC なので注意(なので env で UTC を設定して、cron も UTC 基準の 0 時で回しています)
余談ですが、最近 GitHub Actions に AWS クレデンシャルを直接渡さずに IAM ロールが使えるようになってました。
やり方もそんなに難しくなくて、最高です!
Discussion