🐕

AmplifyのアクセスログをGitHub Actionsを用いて日時でS3にアップロードする

2021/12/12に公開

Amplify のアクセスログは S3 や CloudWatch Logs との Integration がサポートされてない

Amplify はとても便利なサービスです。
なので、アクセスログもコンソールぽちぽちやったらすぐに S3 に転送されるようにできると思っていた...

できないです。
https://docs.aws.amazon.com/amplify/latest/userguide/access-logs.html

アクセスログを取得する方法は、下記の 2 通り

  • コンソールからアクセスログをダウンロードする
  • AWS CLI を用いてダウンロード URL を生成して、そこからダウンロードする

いちいちコンソールからダウンロードするのはめんどくさいので、当然 AWS CLI を使って自動で S3 に転送する仕組みを考えた。

自動でアクセスログを S3 に転送したい

最初は下記を参考にEventBridgeでスケジュール発火してLambdaでとってくる方法を考えた。
https://dev.classmethod.jp/articles/amplify-accesslog-to-s3/

ただ Lambda を作るのもちょっとめんどくさい。

AWS CLI と curl で取得する方法発見。タイトルの通り、これならサクッと取得できそう。
https://zenn.dev/noid11/articles/6620e494816a4ea9b56b

なら 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 ロールが使えるようになってました。
https://docs.github.com/ja/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services

やり方もそんなに難しくなくて、最高です!

参考

Discussion