2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

GithubActionsにAWS IAMロールを使ったS3への静的コンテンツのデプロイする

Posted at

概要

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ユーザのアクセスキーとシークレットを渡さないようにしたものです。

main.yml
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.
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?