l12a

白ウサギを追え

Terraform + Cloud build + GitOps で Infrastructure as code に挑戦する

wikipediaより。

Infrastructure as Code(IaC) はコンピューティング・インフラ(プロセス、ベアメタルサーバー、仮想サーバーなど)の構成管理・機械処理可能な定義ファイルの設定・プロビジョニングを自動化するプロセスである。

以下の公式チュートリアルをなぞって Infrastructure as code に挑戦しました。

Managing infrastructure as code with Terraform, Cloud Build, and GitOps

チュートリアルではGit リポジトリ上にコードで管理された設定に基づいて、VPC / Firewall / HTTP サーバー をセットアップする流れを体験できます。

終了すると GCP 上でコンテンツ (html) をホスティングし、また Git リポジトリ上のブランチへのマージをトリガとしたインフラ設定変更をデプロイできるようになります。

チュートリアルは Cloud Shell と Github 上で全て行うので、Web ブラウザ単体完了できます。

流れは以下の通りです。

  1. 前提条件の準備
  2. チュートリアル用のリポジトリをフォーク
  3. CloudStorage バケットの作成と Terraform への設定
  4. Cloud Build サービスアカウントへの権限付与
  5. Cloud Build と Github リポジトリの接続
  6. コードベース上で環境構成を変更
  7. dev / prod 環境へデプロイ
  8. プロジェクト削除

やっていきましょう

前提条件の準備

https://cloud.google.com/solutions/managing-infrastructure-as-code#before-you-begin

Gcloud console を使ってプロジェクトを作成します。
このチュートリアルを実施していくにあたって新規プロジェクトを作った方が、最後にまとめて消すことができるのでオススメです。

プロジェクトを作成した後、GCP の API の有効化や、Git の設定変更は Cloud Shell で行います。

f:id:lnly:20200930133416p:plain
Gcloud console 画面で使用できる Cloud Shell

チュートリアル用のリポジトリをフォーク

https://cloud.google.com/solutions/managing-infrastructure-as-code#setting_up_your_github_repository

このチュートリアルを実施するためのリポジトリがあり、Terraform の設定ファイルがほぼ完成した状態で用意されていますので、自身のアカウントにフォークします。

github.com

enviroments には開発環境 (dev) と本番環境 (prod) 用の各設定が入っており、 modules にはそれぞれの環境用の設定から読み込むために共通化された設定が入っています。

各設定は HCL(HashiCorp Configuration Language) で記述され、拡張子は .tf です。

cloudbuild.yaml には Cloud Build が実行するビルド内容が書かれています。
ビルド内容はブランチによって変わるようになっており、
dev/prod ブランチでは

terraform init
terraform plan
terraform apply

が実行され、それ以外のブランチでは

terraform init
terraform plan

が実行されます。

実際に環境に変更を反映する terraform applydev/prod ブランチでのみ行われるということです。

CloudStorage バケットの作成と Terraform への設定

https://cloud.google.com/solutions/managing-infrastructure-as-code#configuring_terraform_to_store_state_in_a_cloud_storage_bucket

Terraform が管理するリソースの状態 (tfstate) をリモート上で管理するために Cloudstorage バケットを作成します。

先の設定ファイルに対し、実際のリソースの状態を表すのが tfstate です。
通常はローカルに保存されますがチーム開発を進めるためにリモートで管理されることが多いです。

作成できたらコードベースに移って設定ファイルを変更(プロジェクトIDを実際のものに変更)します。

f:id:lnly:20200930134123p:plain
tfstate を Cloud Storage バケットで管理するための修正(抜粋)

Cloud Build サービスアカウントへの権限付与

https://cloud.google.com/solutions/managing-infrastructure-as-code#granting_permissions_to_your_cloud_build_service_account

Cloud Build サービスアカウントはユーザのアカウントに代わってビルドを実行するアカウントで、プロジェクトに紐づいています。
サービスアカウントがビルドを実行するために必要な権限を付与します。

Cloud Build と Github リポジトリの接続

https://cloud.google.com/solutions/managing-infrastructure-as-code#directly_connecting_cloud_build_to_your_github_repository

f:id:lnly:20200930134935p:plain
Cloud Build Github app

Cloud Build GitHub app を使って Cloud Builid と Github リポジトリを接続します。
これが終わると、GitHub リポジトリ上のブランチへコードがマージされることをトリガとして Cloud Build が実行されるようになります。

コードベース上で環境構成を変更

https://cloud.google.com/solutions/managing-infrastructure-as-code#changing_your_environment_configuration_in_a_new_feature_branch

チュートリアルのためにあらかじめ用意された typo を修正します。
前項までの設定が正しくできていると、Github 上でコードを修正して PR を作成した時点で Cloud Build が実行されます。

f:id:lnly:20200930135021p:plain
PR 作成により実行された Cloud Build

新しいブランチが作成されている状態ですので、この時実行されるのは terraform plan までです。

Cloud Build が実行されることを確認できたら、Github リポジトリの設定を Cloud Build がパスすることを PR マージの条件にするように変更します。

f:id:lnly:20200930135104p:plain
GitHub リポジトリのマージに制約をつけた状態

dev / prod 環境へデプロイ

先ほど作成した PR をマージすると Cloud Build が実行され、今度は terraform apply まで行われます。

f:id:lnly:20200930135145p:plain
Cloud Build 実行中

Gcloud Console 上から Cloud Build のログを参照し、公開された外部 IP アドレスにブラウザでアクセスするとコンテンツの配布が行われていることが確認できます。

f:id:lnly:20200930135214p:plain
実行完了後のログから外部 IP を取得

f:id:lnly:20200930135251p:plain
dev 環境へのデプロイと、ブラウザアクセスができたところ。

prod 環境への配布は同様に dev ブランチから PR を作成して行います。

プロジェクト削除

全てのチュートリアルが終わったら、課金されることを防ぐためにプロジェクトを削除して終わります。

f:id:lnly:20200930135340p:plain
チュートリアルプロジェクトを削除して終了

お疲れ様でした。