GitHub ActionsとIaCデプロイ

GitHub ActionsによるIaC（Infrastructure as Code）のデプロイ方法を実装したため、今まで利用していたデプロイ方法と比較してみました。

# 従来パターン（手動デプロイ）

昔ながらの温かみのあるデプロイ方法です。

### デプロイ構成

GitHubにあるIaCのソースコードをCloud9に手動でクローンしてデプロイする方法。

![deploy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817908/b5c3fde6-7cfd-442c-8f3e-ca99490d0cc6.png)

### メリデメ

- メリット
環境構築や学習コストが不要。

- デメリット
作業する度に手作業が発生するため、継続的に工数が発生する。

# 従来パターン（CodePipelineデプロイ）

AWS CodePipelineを利用してデプロイする方法です。

### デプロイ構成

特定ブランチへのpushをトリガーとして、CodePipeline（CodeBuild）でクローン・差分確認・デプロイする方法。
![codepipeline.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817908/7fd299f6-20a8-7a9c-8a5d-bb0529d960f8.png)

### メリデメ

- メリット
自動でデプロイされるため手作業が発生しない。

- デメリット
自動デプロイの環境構築に時間がかかる。

# 新規パターン（GitHub Actionsデプロイ）

GitHub Actionsを利用してデプロイする方法です。

### デプロイ構成

pull requestやpushをトリガーとして、Actionsで差分確認・デプロイする方法。

![actions.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817908/9dfee162-72a4-2306-063b-3e25ca55c572.png)

### メリデメ

- メリット
自動でデプロイされるため手作業が発生しない。
デプロイ環境が容易に作成できる。

- デメリット
使いすぎると追加料金が発生する。
＜補足＞GitHub Enterprise Cloudの無料枠は月あたり50,000分（2024/06/19時点）

# GitHub Actionsコード

利用したIaCはTerraformとAWS CDKとなります。
ここではTerraformを例として記載してます。

### コード内容

- pull request

```
name: plan

on:
  pull_request:
    branches:
      - main

env:
  AWS_ROLE : ${{ secrets.ROLE_READONLY }}
  AWS_REGION : 'ap-northeast-1'

permissions:
  id-token: write
  contents: read
  pull-requests: write

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout Repository
        uses: actions/checkout@v4

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: ${{ env.AWS_ROLE }}
          aws-region: ${{ env.AWS_REGION }}

      - name: Install Terraform
        uses: hashicorp/setup-terraform@v3
        with:
          terraform_version: latest

      - name: Terraform Init
        id: init
        run: terraform init

      - name: Terraform Format
        run: terraform fmt -check

      - name: Setup TFLint
        run: curl https://raw.githubusercontent.com/terraform-linters/tflint/master/install_linux.sh | bash

      - name: Init TFLint
        run: tflint --init

      - name: Run TFLint
        run: tflint

      - name: Terraform Plan
        id: plan
        run: terraform plan -no-color
        continue-on-error: true

      - name: Post Comments
        uses: actions/github-script@v7
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          script: |
            const output = `#### Terraform Initialization \`${{ steps.init.outcome }}\`
            #### Terraform Plan \`${{ steps.plan.outcome }}\`
            
            <details><summary>Show Plan</summary>

            \`\`\`\n
            ${{ steps.plan.outputs.stdout }}
            \`\`\`

            </details>
            
            *Pusher: @${{ github.actor }}, Action: \`${{ github.event_name }}\`, Workflow: \`${{ github.workflow }}\`*`;
            await github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: output
            })
```

- push
```
name: apply

on:
  push:
    branches:
      - main

env:
  AWS_ROLE : ${{ secrets.ROLE_ADMIN }}
  AWS_REGION : 'ap-northeast-1'

permissions:
  id-token: write
  contents: read

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout Repository
        uses: actions/checkout@v4

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: ${{ env.AWS_ROLE }}
          aws-region: ${{ env.AWS_REGION }}

      - name: Install Terraform
        uses: hashicorp/setup-terraform@v3
        with:
          terraform_version: latest

      - name: Terraform Init
        run: terraform init

      - name: Terraform Apply
        run: terraform apply -auto-approve
```

# 所感

初めてGitHub Actionsを利用しましたが、CodePipelineと比べるとデプロイ環境の構築工数が圧倒的に少なかったです。
また、GitHubのみで完結できるためデプロイの管理が容易になりました。
ただ現時点のActions利用実績は月1,300分程度なため問題ないですが、今後も利用が増えていくことを考えるとGitHub Actionsにself-hosted runnerの導入を検討する必要がありそうです...。

# 参考

- https://dev.classmethod.jp/articles/terraform-cloud-plan-result-githubactions/