概要
GithubActionsでAWSへのデプロイのワークフローを作成する場合はAWSでIAMユーザを作成し、IAMユーザのアクセスキーとシークレットをGithubに渡すことが一般的かと思います。
今回GithubActionsを用いてJavascriptファイルをS3にデプロイするワークフローを作成する時に、IAM Roles Anywhereという機能を使い、IAMユーザのアクセスキーとシークレットではなく、IAMロールをGithubActionsに渡して利用できることを知ったので、その実施した記録としてまとめておきます。
IAM Roles Anywhereについて
参考にしたサイト
以下のサイトのワークフローを基に作成しているため事前に示しておきます
GithubActionsでS3にデプロイするワークフロー
https://qiita.com/mkin/items/0da29583f4fa70275dbd
GithubActionsでIAMロールを使うワークフロー
https://dev.classmethod.jp/articles/github-actions-aws-sts-credentials-iamrole/
今回作成したワークフロー
AWSでの設定など
AWSでIAMロールを作成する手順やGithubにAWSのクレデンシャルを登録する手順は上記の参考にしたサイトで紹介されている手順と変わらないためそちらを参照してください
ディレクトリ構成
今回のワークフローを実行するリポジトリのディレクトリ構成です
client/
├ dist/
│ ├ foobar.js
│ └ その他
├ src/
│ └ foobar.ts
├ package.json
└ その他
その他/
ワークフロー
今回作成したワークフローは上記の参照したサイトで紹介されているJavascriptをS3へのデプロイするワークフローにIAM Roles Anywhereを用いてIAMユーザのアクセスキーとシークレットを渡さないようにしたものです。
name: deploy-js
on:
push:
branches: [ master ]
paths:
- "client/src/**"
env:
AWS_ROLE_ARN: ${{ secrets.AWS_ROLE_ARN }}
AWS_REGION: ${{ secrets.AWS_REGION }}
DISTRIBUTION: ${{ secrets.DISTRIBUTION }}
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [18]
steps:
- uses: actions/checkout@v3
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
- name: build
working-directory: ./client
run:
npm install
npm run build
- name: Upload build result
uses: actions/upload-artifact@v1
with:
name: build
path: client/dist/
deploy:
needs: build
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
steps:
- name: Download build result
uses: actions/download-artifact@v2
with:
name: build
path: client/dist/
- name: Configure AWS credentials from IAM Role
uses: aws-actions/configure-aws-credentials@v1
with:
role-to-assume: ${{ env.AWS_ROLE_ARN }}
aws-region: ${{ env.AWS_REGION }}
role-session-name: GitHubActionsSession
- name: Publish to AWS S3
uses: opspresso/action-s3-sync@master
env:
AWS_REGION: ${{ env.AWS_REGION }}
FROM_PATH: "client/dist/"
DEST_PATH: "s3://test1"
- name: Clear cache in CloudFront
uses: chetan/invalidate-cloudfront-action@v2
env:
DISTRIBUTION: ${{ env.DISTRIBUTION }}
PATHS: "/*"
AWS_REGION: ${{ env.AWS_REGION }}
基にしたワークフローから変更している箇所の説明します
on:
push:
branches: [ master ]
paths:
- "client/src/**"
ワークフローの実行タイミングの設定を私の環境に合わせて変更しています。
私の環境では/client配下でjsを管理しているため、jsファイルの変更がマージされた時のみワークフローが稼働するようにしています。
- name: build
working-directory: ./client
run:
npm install
npm run build
先ほどの説明と同様にjsがあるディレクトリがclientなのでコマンド実行するディレクトリの指定をしています
- name: Clear cache in CloudFront
uses: chetan/invalidate-cloudfront-action@v2
env:
DISTRIBUTION: ${{ env.DISTRIBUTION }}
PATHS: "/*"
AWS_REGION: ${{ env.AWS_REGION }}
chetan/invalidate-cloudfront-action@v2
のバージョンを1.2から2にあげています。
1.2では以下のようなエラーが出て処理が失敗していました。
詳しい原因は分かりませんでしが、バージョンをあげたことで動いたのでよしとしてます。
Run chetan/invalidate-cloudfront-action@v1.2
An error occurred (InvalidClientTokenId) when calling the CreateInvalidation operation: The security token included in the request is invalid.