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

# 概要
GithubActionsでAWSへのデプロイのワークフローを作成する場合はAWSでIAMユーザを作成し、IAMユーザのアクセスキーとシークレットをGithubに渡すことが一般的かと思います。
今回GithubActionsを用いてJavascriptファイルをS3にデプロイするワークフローを作成する時に、IAM Roles Anywhereという機能を使い、IAMユーザのアクセスキーとシークレットではなく、IAMロールをGithubActionsに渡して利用できることを知ったので、その実施した記録としてまとめておきます。
### IAM Roles Anywhereについて
https://aws.amazon.com/jp/blogs/news/extend-aws-iam-roles-to-workloads-outside-of-aws-with-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.
```