GitHub ActionsによるIaC(Infrastructure as Code)のデプロイ方法を実装したため、今まで利用していたデプロイ方法と比較してみました。
従来パターン(手動デプロイ)
昔ながらの温かみのあるデプロイ方法です。
デプロイ構成
GitHubにあるIaCのソースコードをCloud9に手動でクローンしてデプロイする方法。
メリデメ
-
メリット
環境構築や学習コストが不要。 -
デメリット
作業する度に手作業が発生するため、継続的に工数が発生する。
従来パターン(CodePipelineデプロイ)
AWS CodePipelineを利用してデプロイする方法です。
デプロイ構成
特定ブランチへのpushをトリガーとして、CodePipeline(CodeBuild)でクローン・差分確認・デプロイする方法。
メリデメ
-
メリット
自動でデプロイされるため手作業が発生しない。 -
デメリット
自動デプロイの環境構築に時間がかかる。
新規パターン(GitHub Actionsデプロイ)
GitHub Actionsを利用してデプロイする方法です。
デプロイ構成
pull requestやpushをトリガーとして、Actionsで差分確認・デプロイする方法。
メリデメ
-
メリット
自動でデプロイされるため手作業が発生しない。
デプロイ環境が容易に作成できる。 -
デメリット
使いすぎると追加料金が発生する。
<補足>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の導入を検討する必要がありそうです...。