BLOG

ブログ

TerraformとGitHub Actions(CI/CD)を用いたGitHub repositoryの管理

初めに

記事の概要

今回は、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

手順

  1. 以下のコマンドを実行しterraformをインストールします。
    • brew install terraform
    • これでtfファイルを実行できる環境が整いました。
  2. エディターなどで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ファイルの主要な内容は以下になります。

  1. GitHubにリポジトリを作成するためのリソースを提供してくれるmineiros-io/repository/GitHubというモジュールを使用することを宣言している。
  2. リポジトリ名は”example-repository”となる。

②TerraformのCI/CDをGitHub Actionsで構築

次に、先ほど作成したtfファイルのCI/CDをGitHub Actionsで構築します。

設計図でいうと以下の部分になります。

GitHub Actionsとは

GitHub Actionsとは、GitHubが提供する継続的インテグレーション(CI)および継続的デプロイ(CD)のためのサービスです。GitHub上で管理されているリポジトリ内に、自動化されたワークフローを定義することができ、コードの変更やイベントに応じて自動的にビルドやテスト、デプロイなどのアクションを実行することができます。GitHub Actionsは、ビルドとテスト、パッケージング、デプロイ、通知などのアクションを提供し、さまざまなプログラミング言語やフレームワークに対応しています。

手順

  1. 先ほど作成したtfファイルを格納しているフォルダへ移動し、以下のコマンドを実行します。
    • mkdir -p .Github/workflows/ touch .Github/workflows/deploy.yml
    • これがきちんと実行されると”deploy.yml”ファイルが作成されるはずです。
  2. 手順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ファイルの内容は以下になります。

  1. mainブランチへのpushをトリガーにする
  2. Ubuntuの最新ver.の環境で実行する
  3. terraform fmfでコードの整形を行う
  4. terraform initで初期化を行う
  5. terraform validateで構文エラーがでないか検証する
  6. terraform planで実行計画を生成する
  7. Start Deploymentでデプロイメントプロセスを開始する
  8. terraform applyで実行計画に従って内容を実行する
  9. 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を導入することで、開発プロセスをより効率的に進めることができ、今後の開発に役立てることができます。是非、実践してみてください。

参考リンク

SinkCapitalではデータに関する支援を行っています

弊社はスペシャリスト人材が多く在籍するデータ組織です。 データ分析や分析基盤の設計などでお困りの方がいらっしゃれば、 まずは無料で、こちらから各分野のスペシャリストに直接相談出来ます。