[GitHub Actions] AWS S3へファイルを自動的に転送する

GitHub上にリポジトリを作成し、いつも通りpushすると自動的に仮想マシンが起動しこちらが指定した処理を行ってくれる「Actions」という機能があります。なんとパプリックリポジトリは無料、プライベートリポジトリも月間2000分(約33時間)までは無料で使えるという夢のような機能ですw

主にアプリをビルド(コンパイル)したり、テストコードを自動的に実行するといった用途に使われていますが、ここでは特定のブランチを更新しpushすると、そのファイルをAWS S3へ自動的に転送する設定を行ってみます。

AWS側の設定

S3にバケットを作成

AWSのマネジメントコンソールにログインし、S3のコーナーから適当なバケットを作成します。Actions用に特別な設定は不要です。

IAMユーザーを作成

先ほどのS3のバケットを操作するためのIAMユーザーを作成し「アクセスキーID」と「シークレットアクセスキー」をメモします。

できるだけIAMユーザーの権限の範囲は狭めた方が安全です。詳細は過去記事を参照ください。 blog.katsubemakito.net

GitHub側の設定

リポジトリの準備

GitHubでいつもと同じ様にリポジトリを作成しローカルにcloneします。もしくはすでにあるリポジトリでもかまいません。

IAM情報を保存

AWS側で作成したIAM情報を保存します。

リポジトリ内のメニュー「Settings」から、左メニューの「Secrets」→「Actions」とたどります。右上にある「New repository secret」ボタンをクリックすると入力画面が表示されます。

Nameに「AWS_ACCESS_KEY_ID」、ValueにAWSで生成されたアクセスキーIDをそのままコピペし「Add secret」ボタンをクリックします。シークレットアクセスキーの方も同様に繰り返します(Nameは「AWS_SECRET_ACCESS_KEY」)

Nameで指定する文字列は、後述するYAML上から呼び出すときの文字列と同一であれば何でもかまいません。

リポジトリにYAMLを登録

GitHub Actionsで実行したい内容を、リポジトリ直下に.github/workflowsという名前でディレクトリを作成し、この下にYAMLファイルを置くだけで設定が終わります。これ以外の設定は不要です。めっちゃ簡単ですねw

ここでは以下のYAMLをdeploy-s3.ymlというファイル名で.github/workflowsの下に保存しました。

 📁 リポジトリ
  └ 📁 .github
    └ 📁 workflows
      └ 📒 deploy-s3.yml

ファイル名は何でもかまいません。またworkflowsの下には複数のYAMLを置いても大丈夫です。

name: Upload to S3
#-------------------------#
# トリガー
#-------------------------#
on:
  #-- mainブランチにpushされたら起動する --#
  push:
      branches:
        - main

#-------------------------#
# 実際の処理
#-------------------------#
jobs:
  build:
    #-- 仮想マシンのOSを指定(ここではUbuntuの最新版) --#
    runs-on: ubuntu-latest
    steps:
      #-- Gitリポジトリの内容を取得 --#
      - name: Checkout
        uses: actions/checkout@v2

      - name: Deploy to S3
        #-- GitHub上に登録した変数を持ってくる --#
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        #-- 仮想マシン上でコマンドを実行 --#
        run:
          aws s3 sync --delete --region ap-northeast-1 ./files/ s3://actionstest/

実際に動かしてみる

S3へ送信するファイルを準備

今回は.githubと同じ階層に「files」というフォルダを作成、その中にS3へ送信するファイルを保存します。内容やファイル名は何でもかまいません。

 📁 リポジトリ
 ├ 📁 .github
 │ └ 📁 workflows
 │   └ 📒 deploy-s3.yml
 └ 📁 files
   └ 📒 hello.txt

GitHubへ送信する

ではこれらのファイルをリポジトリへ登録しGitHubへpushします。念の為に現在のブランチがmainであることを確認。

$ git branch
* main

先ほど準備したファイルをcommit後いつもどおりpushします。特別な作業や操作は一切不要です。

$ git add .
$ git commit -m 'add files'
$ git push

ここでは普通にcommitしていますが、mainブランチへmerge後にpushしても、GitHub上でプルリクをmergeしても同様にActionsが動いてくれます。要はYAML上で指定したブランチに変化があれば良いのです。

GitHub上でActionsの実行ログを確認する

GitHubのリポジトリへ移動し「Actions」タブをクリックすると、Actionsが実行されたかどうかが分かります。正常に最後まで終了していれば緑色のアイコンが、途中でエラーが発生し終了してしまった場合は赤いアイコンが表示されます。

各実行結果をクリックすると詳細なログが表示されますので、どこでコケたのか確認し必要があればYAMLを修正し再度pushします。

AWS S3を確認

AWSのマネジメントコンソールを確認し、「files」ディレクトリ内のファイルのみが表示されていれば成功です。念の為に中身も確認してみてください。

AWSのCLIコマンドを利用してS3へ送信しているのですが、うっかりミスで転送してはならないファイルや無駄なファイルを送信してしまう場合があります。コマンドのオプションはくれぐれも気を付けてください(最初に実行した際にやらかしましたw)

最終的にWebサイトとして公開する場合でも、転送が意図通りに行われているか確認できるまでは公開設定は行わない方が安全ですね。

参考ページ