GitHub Actions⇔AWS らくらく連携手順書♪

閲覧ありがとうございます。
本記事では、一回繋いでしまえば超絶便利なGitHub ActionsとAWSの連携方法を共有します。
今回は、GitHub ActionsとAWSを、IAM IDプロバイダ・STSを用いて連携します。

## AWS側の設定
【 用意するもの 】
* GitHub ActionsがAWS環境にアクセスするためのIAMロール
* GitHub Actionsからのアクセスに対し一時的な認証情報を渡すためのIDプロバイダ

### ① IAMロールの作成
###### 1.　任意のIAMポリシーをアタッチしたIAMロールを作成
私はAWS Nuke(*1)をAWS環境に対し実行したかったため、AdministratorAccess権限を持つIAMロールを作成しました。

(*1) AWS Nuke：AWS環境内のリソースを一括削除することができるオープンソースのツール。(後日NukeとGitHub Actionsを用いた不要リソースの自動定期削除について記事を投稿予定です)

![スクリーンショット 2025-04-09 224224.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3867349/f56b2ad8-52ea-44f5-b492-bb472a4e847a.png)

###### 2.　IAMロールの信頼ポリシーを設定
信頼ポリシー内で、ワークフローファイル(=GitHub Actionsでスクリプトを実行するファイル)からの認証用URL経由のアクセス時にassume roleするよう許可します。

![スクリーンショット 2025-04-09 230243.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3867349/2453a1eb-501b-4edc-9334-7740e381cfb0.png)

<details><summary>IAMポリシー(コピペ用)</summary>

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::[アカウントID]:oidc-provider/token.actions.githubusercontent.com"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringLike": {
                    "token.actions.githubusercontent.com:sub": "repo:[Organizations名 or 個人アカウント名]/[リポジトリ名]:*"
                }
            }
        }
    ]
}
```
</details>

:::note warn
注意点
* 赤くマークした箇所：個人のGitHub内リポジトリを使用する際は個人のGitHubアカウント名を、企業などのOrganizations配下のリポジトリを使用する際はOrganizations名を記入してください
* 青でマークした箇所：使用するリポジトリ名を記入してください
:::


### ② IAM IDプロバイダーの作成

###### 1.　IAMコンソール画面で「IDプロバイダ」を選択

![スクリーンショット 2025-04-09 224711.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3867349/af873bb4-5bac-49ea-b868-83a90d830b6e.png)

###### 2.　「IDプロバイダを追加」ボタンをクリック

![スクリーンショット 2025-04-09 225038.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3867349/62116153-6d65-4e0c-911f-674083c3fd4e.png)

###### 3.　IDプロバイダの詳細を設定

* プロバイダのタイプ：OpenID Connect
* プロバイダのURL：https://token.actions.githubusercontent.com
* 対象者：sts.amazonaws.com

上記を設定し、「プロバイダを追加」ボタンを押下


![スクリーンショット 2025-04-09 225426.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3867349/df92f168-52de-4f7d-9960-de517e512e46.png)

AWS側の設定はこれで終了です！

## GitHub Actions側の設定
### ①実行用IAMロールのARNをSecretsに設定
※variablesやベタ打ちでも大丈夫ですがセキュリティ面に不安があるためSecretsに保存するのがおすすめです。

###### 1.　GitHubにアクセスし、Settingsタブに移動

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3867349/b19fa202-b0cc-43f7-aa84-b7d840076636.png)

###### 2.　「Security」内「Secrets and variables」の「Actions」を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3867349/cb515d6a-4a1f-4bec-b5d0-c3e1027e0332.png)

###### 3.　Repository secretsの「New repository secret」ボタンを押下

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3867349/5cdc926e-9554-40cb-9503-c313fd5d4b70.png)

###### 4.　「Name」に任意のSecret変数名、「Secret」に作成したIAMロールのARNを記載し、「Add secret」ボタンを押下

![スクリーンショット 2025-04-09 232113.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3867349/c4bf0458-db60-448b-b58f-c77c9a74a929.png)

###### 5.　Actionsタブに移動し、「New workflow」ボタンを押下

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3867349/0c2b5524-c749-4b67-a12a-b9d4cfcf740a.png)

###### 6.　Simple workflowの「Configure」ボタンを押下すると、新しいワークフロー作成画面へ遷移する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3867349/5517f35c-fe52-4b7e-9d36-12be8112e056.png)

###### 7.　ワークフローファイルの中身には以下を設定
ファイル名には「任意のファイル名.yaml」を設定してください。

```yaml:github-actions-to-aws.yaml
name: github-actions-to-aws  # 任意のワークフロー名(処理名)
on: push  # on:push = ファイルがプッシュ(更新)されるごとに処理を動かす

jobs:
  run-container: # job名は任意。ワークフローを起動させるための設定
    name: run  # 任意の関数名
    runs-on: [Organaizationsで指定されているセルフホステッドランナー]  # 個人のアカウントの場合は「ubuntu-latest」などを設定
    permissions:
      id-token: write
      contents: write
    steps:
      - name: Checkout  # 関数名は任意
        uses: actions/checkout@v3
        
      - name: Configure AWS credentials  # 関数名は任意。AWS環境にアクセスする
        uses: aws-actions/configure-aws-credentials@v2
        with:
          role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME_TEST }}  # 先ほど作成したSecretsを指定
          aws-region: ap-northeast-1  # Assume roleを行うリージョンを指定

      - name: CLI-install  # 関数名は任意。CLIのインストールを行う
        run: |
          curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
          unzip awscliv2.zip
          sudo ./aws/install  

      - name: [任意の関数名]
        run: |
          [任意の処理]
        # 例：bash ami-get.sh
          
```

最後の行 [任意の処理] の中に任意のスクリプトを入力することでAWS環境に対し任意のスクリプトを実行することができます。

また、2行目のon: pushを以下のように変更すると、任意の日次で定期実行や1回きりの実行ができるようになります。(cron形式で指定)
```
on:
  schedule:
    - cron: '0 6 * * 4'
```

-----------------------

本記事はここまでとなります。
閲覧いただき、ありがとうございました！