初めに
記事の概要
今回は、TerraformのCI/CDをGitHub Actionsを利用して構築する方法についてご紹介します。Terraformを使ってGitHubのリポジトリを作成し、GitHub Actionsを使ってCI/CDを自動化する方法を実際の手順とともに解説します。この記事を読むことで、TerraformとGitHub Actionsを使った開発の流れを学習することができます.最終的には、以下の画像のように、GitHub上で管理されるリポジトリを作成することができます。
設計図
今回の内容の設計図は以下の図のようになります。
利点
GitHub Actionsを使うことで、手動でのデプロイの手間が省けるだけでなく、コードの変更やテストによって自動的にデプロイが行われるため、より迅速かつ信頼性の高いデプロイが実現できます。また、別途サーバーの準備をせずにCI/CD環境を構築できます。
①Terraformでリポジトリの作成をコード化
初めにTerraformでリポジトリの作成をコード化していきます。
設計図でいうと以下の部分になります。
Terraformとは
TerraformはHashiCorp社が開発している、インフラストラクチャの構成管理ツールです。このツールは、インフラストラクチャのリソースをコードとして宣言的に定義し、その状態になるようにリソースを作成・操作してくれます。Terraformは、AWS、GCP、Azureなど、ほとんどすべてのタイプのインフラストラクチャを、Terraformのリソースとして表現することができます。そして、これらのプロバイダーのAPIを利用して、リソースを管理し、インフラストラクチャの構成管理を実現します。
では、実際に使ってみましょう。
開発環境は以下のようになっています。
- mac:13.2.1
- terraform : 1.4.3
- Homebrew : 4.0.9
手順
- 以下のコマンドを実行しterraformをインストールします。
brew install terraform
- これでtfファイルを実行できる環境が整いました。
- エディターなどでtfファイルを作成し、以下の内容を書き込みます。
# exmple-repositoryという名前のレポジトリを作成 <em>
module "repository" {
source = "mineiros-io/repository/GitHub"
version = "~> 0.18.0"
name = "example-repository"
license_template = "apache-2.0"
gitignore_template = "Terraform"
}
このtfファイルの主要な内容は以下になります。
- GitHubにリポジトリを作成するためのリソースを提供してくれるmineiros-io/repository/GitHubというモジュールを使用することを宣言している。
- リポジトリ名は”example-repository”となる。
②TerraformのCI/CDをGitHub Actionsで構築
次に、先ほど作成したtfファイルのCI/CDをGitHub Actionsで構築します。
設計図でいうと以下の部分になります。
GitHub Actionsとは
GitHub Actionsとは、GitHubが提供する継続的インテグレーション(CI)および継続的デプロイ(CD)のためのサービスです。GitHub上で管理されているリポジトリ内に、自動化されたワークフローを定義することができ、コードの変更やイベントに応じて自動的にビルドやテスト、デプロイなどのアクションを実行することができます。GitHub Actionsは、ビルドとテスト、パッケージング、デプロイ、通知などのアクションを提供し、さまざまなプログラミング言語やフレームワークに対応しています。
手順
- 先ほど作成したtfファイルを格納しているフォルダへ移動し、以下のコマンドを実行します。
mkdir -p .Github/workflows/ touch .Github/workflows/deploy.yml
- これがきちんと実行されると”deploy.yml”ファイルが作成されるはずです。
- 手順1で作成された”deploy.yml”ファイルに以下の内容を書き込みます。
name: terraform plan
on:
push:
branches:
- main
env:
tf_version: '1.4.2'
tf_work_dir: '.'
GitHub_TF_TOKEN: ${{ secrets.TF_TOKEN}}
jobs:
plan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: terraform fmt
uses: hashicorp/terraform-GitHub-actions@master
with:
tf_actions_version: ${{ env.tf_version }}
tf_actions_subcommand: fmt
tf_actions_working_dir: ${{ env.tf_work_dir }}
- name: terraform init
uses: hashicorp/terraform-GitHub-actions@master
with:
tf_actions_version: ${{ env.tf_version }}
tf_actions_subcommand: init
tf_actions_working_dir: ${{ env.tf_work_dir }}
- name: terraform validate
uses: hashicorp/terraform-GitHub-actions@master
with:
tf_actions_version: ${{ env.tf_version }}
tf_actions_subcommand: validate
tf_actions_working_dir: ${{ env.tf_work_dir }}
- name: terraform plan
uses: hashicorp/terraform-GitHub-actions@master
with:
tf_actions_version: ${{ env.tf_version }}
tf_actions_subcommand: plan
tf_actions_working_dir: ${{ env.tf_work_dir }}
- name: Start Deployment
uses: bobheadxi/deployments@master
id: deployment
with:
step: start
TF_TOKEN: ${{ secrets.TF_TOKEN}}
env: production
- name: terraform apply
uses: hashicorp/terraform-GitHub-actions@master
with:
tf_actions_version: ${{ env.tf_version }}
tf_actions_subcommand: apply
tf_actions_working_dir: ${{ env.tf_work_dir }}
# Deploymentを終了する
- name: Finish Deployment
uses: bobheadxi/deployments@master
with:
step: finish
TF_TOKEN: ${{ secrets.TF_TOKEN}}
status: ${{ job.status }}
deployment_id: ${{ steps.deployment.outputs.deployment_id }}
このymlファイルの内容は以下になります。
- mainブランチへのpushをトリガーにする
- Ubuntuの最新ver.の環境で実行する
- terraform fmfでコードの整形を行う
- terraform initで初期化を行う
- terraform validateで構文エラーがでないか検証する
- terraform planで実行計画を生成する
- Start Deploymentでデプロイメントプロセスを開始する
- terraform applyで実行計画に従って内容を実行する
- Finish Deploymentでデプロイメントを終了する
では、リモートリポジトリを作成し、ローカルのコンテンツ(tfファイルとymlファイル)をmainブランチへpushしてみましょう。GitHub Actionsは、mainブランチへのpushをトリガーに起動されるため、この作業が完了したら自動的にGitHub Actionsが開始されます。
GitHubのActionsタブを開くと以下のようになります。
ビルドが成功すると以下になります。 ※ここでエラーが出た方は、ymlファイルの1~8のどの段階でエラー出たか確認してみてください
実際にレポジトリを確認してみると,”example-repository”が作成されたことが確認できました。
最後に
今回は、GitHub Actionsを利用してTerraformのCI/CDを構築する方法についてご紹介しました。この記事のようにGitHub Actionsによって自動化されたCI/CDを導入することで、開発プロセスをより効率的に進めることができ、今後の開発に役立てることができます。是非、実践してみてください。