GitHub ActionsでCloudFront + S3にファイルをアップロードする

先日、仕事で初めてAWSでシステムを構築したんですが、S3のアップロード方法を全く考えられておらず、S3に直アップロードという方法を取りました。
当然、チームでの作業にかなり支障をきたしてしまいました・・・。
今回はその反省としてGitHub Actionsを使ってS3にアップロードすることに成功したので、備忘録として書いておきます。

CloudFront経由のS3の公開については過去記事にて紹介しているので割愛します。 suguru-no-rururu.hatenablog.com

1.レポジトリ作成

まずはgithubに管理用のレポジトリを作成します。 久々にレポジトリ作ると毎回忘れているのでこの記事を参考にしています。 qiita.com

2. Github Actionsの設定

レポジトリが作成できたら、Actionsをクリック。
「Set up this workflow」があるので、それをクリック。 f:id:katttsu105:20210508121910p:plain

Actionsには以下のように書きました。
access_key_idとsecret_access_keyは後々githubで設定するので、直書きはしないでください。

name: CI

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2
      
      - name: Configure AWS credentials from account
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.TEST_AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.TEST_AWS_SECRET_ACCESS_KEY }}
          aws-region: ap-northeast-1

      - name: Copy Files to s3
        run: |
          aws s3 sync ./public s3://test-aws-service-k --delete

コードの紹介をしていきます。 mainというブランチにpushされた時にjobsが走るようにしています。
masterなど使っているブランチ名に変更してください。

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

リージョンはS3のバケットがあるリージョンに変更してください。

aws-region: ap-northeast-1

今回はpublic配下にあるファイルを付け足すようにしています。
--deleteオプションはS3のバケットにあるが、githubのレポジトリにないファイル・ディレクトリを削除するものです。

aws s3 sync ./public s3://test-aws-service-k --delete

3. SercretsにAWSのaccess_key_idとsecret_access_keyを設定

続いてgithubのSettings > サイドバーのSecretsから「New repository secret」をクリック。 f:id:katttsu105:20210508132811p:plain

そちらにIAMユーザーのaccess_key_idとsecret_access_keyを貼り付けます。
keyは先ほど、Github Actionsに設定したTEST_AWS_ACCESS_KEY_IDTEST_AWS_SECRET_ACCESS_KEYとします。 f:id:katttsu105:20210508133215p:plain

以上で設定は完了です。
作成したレポジトリにpushするとS3のバケットに反映されていると思います。