はじめに
IaCやるならコードはGitリポジトリで管理したいなあと思って以下ハンズオンにtry
- devとprod環境のみ作成
- devまたはprod環境のブランチにpushしたらCloud Buildが走る
- GCP側の操作はCloud Shellで行う
1. APIを有効にする
GCPのCloud BuildとCompute EngineのAPIを有効化する。
2. GitHubのサンプルリポジトリをフォークする
リポジトリを見てみると、environmentsフォルダ配下にサブフォルダ(devとprod)がある。
フォルダでワークロードを分離していて、極力類似した構成にするのがよいけど、サブフォルダごとに設定変更をすることも可能。
3. 保存場所をCloud Storageバケットにする
バケットを作る。デプロイ履歴を残すためにオブジェクトのバージョニングを有効にする。
バージョニングを有効にするとストレージコストはその分増える
terraform.tfvars ファイルと backend.tf ファイルのパスを書き換える(プレースホルダになっているところにプロジェクトIDを入れる)
4. Cloud Buildサービスアカウントに権限付与する
サービスアカウントはアプリケーションや仮想マシンに権限をつけるGoogleアカウント。
APIを呼び出すときはサービスアカウントを使用する。
Terraformスクリプトを実行できるようにするにはプロジェクトへのアクセス権限が必要。
5. Cloud BuildをGitHubリポジトリに接続
最初All repositoriesを選択してインストールしてしまったけど、GCPコンソールのCloud Build APIのダッシュボードから何も見えず...ハンズオンの説明だとリポジトリを選択しろとあったのでやり直し。リポジトリを選択したら接続できた。
6. 開発環境ブランチでファイアウォール設定を変更する
なんかビルド失敗した。マージ可能な状態ではあるけど、とりあえず次の手順をやってみる
7. ブランチにルールを設定する
devとprodブランチでステータスチェックに成功しないとマージできないようにルール追加。
先ほどのpull requestに戻ってみると確かにマージできなくなっている。
エラーログ見たらbucket doesn't existで言ってて、
3. の手順でterraform.tfvars ファイルと backend.tf ファイル内でバケットのパスをちゃんと書き換えられていなかった(プロジェクトIDが入るべきところがプレースホルダのままになっていた)ので、今回はもうGitHubから手動で書き換えた。→無事ビルドできた。
8. devに変更をマージ
ハンズオンの指示通りにGitHub操作
9. devブランチをprodブランチにマージ
同上
10. デプロイしたWebサーバにアクセス
ビルドログにIPが出るので、ブラウザからアクセスする。無事アクセスできた。
11. リソース削除
適宜お片付け
おわりに
GitHubのセットアップしたり途中ビルドが上手くいかず結構時間かかった印象。4~5hくらいかかったかな。
Storageのパスがなんかうまく書き換わってなかったのは、Cloud ShellからGit pushしようとしたときのGitの認証でパスワード認証しようとしたからっぽい。
Shellのコンソールでも"Support for password authentication was removed on August 13, 2021."って怒られてたので、アクセストークンも取得して認証試したら通った。
(今回はGitHub側でGUIで操作しちゃったけど……)