LoginSignup
0
0

GitHub ActionsとIaCデプロイ

Last updated at Posted at 2024-06-19

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

従来パターン(手動デプロイ)

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

デプロイ構成

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

deploy.png

メリデメ

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

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

従来パターン(CodePipelineデプロイ)

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

デプロイ構成

特定ブランチへのpushをトリガーとして、CodePipeline(CodeBuild)でクローン・差分確認・デプロイする方法。
codepipeline.png

メリデメ

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

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

新規パターン(GitHub Actionsデプロイ)

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

デプロイ構成

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

actions.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の導入を検討する必要がありそうです...。

参考

0
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
0
0