📝

Google Cloud のマネージド Terraform、 Infrastructure Manager 登場!

2023/08/23に公開

こんにちは。クラウドエースの阿部です。
今回はひっそりと一般提供されていた Infrastructure Manager について紹介したいと思います。

Infrastructure Manager とは

Infrastructure Manager (以降、Infra Manager と表記) は、 Google Cloud におけるリソースのデプロイや管理を IaC で自動化するためのマネージドサービスです。
内部では Terraform と Cloud Build を使用してリソースの管理を行っています。

https://cloud.google.com/infrastructure-manager/docs/overview

Infra Manager の特徴

特徴としては以下の通りです。

  • GitHub 等と連携した CD (継続的デリバリ) の構築を簡単に実装できます。Cloud Build で同じ事をやる場合は、 cloudbuild.yaml で CI/CD パイプライン設定が必要です。また、ローカルのコードを使った実行も可能です。
  • デフォルトで Terraform 実行ログを残します。実行ログは自動的に PROJECT_NUMBER-LOCATION-blueprint-config という名前のGCSバケットが作成され、ログが保存されます。
  • IaC コード(Infra Manager では Blueprint と呼ぶ)をリビジョン管理できます。

一方で、以下のような制約があります。

  • 有効な Terraform Root モジュールが必要です。テンプレート等、プリプロセスや事前のコード生成が必要なIaCコードはサポートしていません。
  • Terraform バージョン 1.2.3 で実行可能なコードが必要です。
  • Backend ブロックはサポートしていません。
  • Provisioner はサポートしていません。

上記以外に、筆者が触ってみて気になった点は以下の通りです。

  • Terraform state の保存先は利用者から見えない場所になっています。Cloud Build の実行ログを参照すると、自動的に http backend 設定を生成して、 state を保存しているようです。
  • 現時点では GitHub のプライベートリポジトリを読み込めないようです。
  • terraform plan のようなサブコマンドがないため、Infra Manager だけで実行前確認するのは難しそうです。

実行可能なロケーション(リージョン)

Infra Manager は8月22日時点で以下3リージョンで実行可能です。

  • 台湾 (asia-east1)
  • ベルギー (europe-west1)
  • アイオワ (us-central1)

https://cloud.google.com/infrastructure-manager/docs/locations

料金体系

Infra Manager そのものは課金されませんが、間接的に使用している Cloud Build と Cloud Storage の料金がかかります。
詳細は下記ページを参照してください。

https://cloud.google.com/infrastructure-manager/pricing

実行方法について

Infra Manager を実行する手順は以下の通りです。基本的には、公式ドキュメントのクイックスタートに従っています。
前提として、 gcloud コマンドにプロジェクトID設定が必要です。
未設定の場合、下記のコマンドで設定してください。

gcloud config set project PROJECT_ID

Infra Manager API の有効化

下記のコマンドで有効化します。

gcloud services enable config.googleapis.com

サービスアカウント作成、IAMロール付与

Infra Manager 実行用のサービスアカウントを作成します。

gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

次に、Cloud Infrastructure Manager Agent (roles/config.agent) ロールを付与します。

gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" --role=roles/config.agent

最後に、実際にリソース管理するために必要なロールを付与します。クイックスタートでは VPC ネットワークの作成を行うため、ここでは Compute ネットワーク管理者(roles/compute.networkAdmin)を付与しています。

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
    --role=roles/compute.networkAdmin

デプロイする

クイックスタートでは、 terraform-google-modules の VPC ネットワークモジュールを Root 構成としてデプロイします。
このモジュールは必須の引数(variable)として project_idnetwork_name の2つを必要とします。
下記のコマンドでデプロイします。

gcloud alpha infra-manager deployments apply quickstart-deployment \
    --location=us-central1 \
    --service-account="projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" \
    --git-source-repo=https://github.com/terraform-google-modules/terraform-google-network \
    --git-source-directory=modules/vpc \
    --git-source-ref=master \
    --input-values=project_id=ca-abe-test,network_name=quickstart-vpc

ポイントとしては、必須引数の内容を --input-values で渡しているところです。
また、クイックスタートでは、デプロイ名を FQID 形式(projects/PROJECT_ID/locations/LOCATION/deployments/DEPLOY_NAME) と指定していますが、前述のコマンドのように引数で --location オプションを指定すれば、デプロイ名単体を指定するだけでもコマンドは通ります。
ただし、サービスアカウントは、FQID 形式で指定する必要がありました。

上記コマンドが成功すると、 quickstart-vpc という名前のVPC ネットワークリソースが作成されたことを確認できました。

クリーンアップ

下記のコマンドを実行することで、デプロイしたリソースは削除されます。

gcloud alpha infra-manager deployments delete quickstart-deployment --location us-central1

こちらも、クイックスタートのコマンドラインでは FQID 形式で指定していますが、上記のように --location オプションを併用することでデプロイ名単体を指定することも可能です。

その他の注意事項

Manage the Terraform state file にある手順で、見えない場所にある Terraform state ファイルを取得することが可能でした。ただ、こちらの手順で gcloud alpha infra-manager deployments unlock を実行したところ、以下のようなエラーが発生して、アンロックできない問題を検出しました。

ERROR: (gcloud.alpha.infra-manager.deployments.unlock) INVALID_ARGUMENT: Invalid JSON payload received. Unknown name "disableValidateAndUpdate": Cannot find field.
- '@type': type.googleapis.com/google.rpc.BadRequest
  fieldViolations:
  - description: 'Invalid JSON payload received. Unknown name "disableValidateAndUpdate":
      Cannot find field.'

確認すると、検証で使用した gcloud CLI (version 443.0.0)で当該APIを呼び出す際に、 disableValidateAndUpdate という余計な属性を付与していることが原因であるようです。そのため、ドキュメントにある手順を試される場合は、コマンドラインではなく直接 REST API を呼び出す等してアンロックする必要があります。

筆者は以下の API ドキュメントの「Try this method」でLock IDを入力してデプロイメントのロックを解除しました。

https://cloud.google.com/infrastructure-manager/docs/reference/rest/v1/projects.locations.deployments/unlock

デプロイメントがロックされたままだと、 gcloud alpha infra-manager deployments delete が実行できなくなるため、要注意です。

この問題は下記の Issue Tracker で報告しましたので、もし早く修正して欲しいと思う方は、 +1 ボタンを押してください。

https://issuetracker.google.com/issues/296914123

まとめ

Infra Manager は 8/21 に一般提供(GA)になっており、出たばかりのマネージドサービスです。
ただ、弊社としてはこれまで実施してきたプライベートGitHubリポジトリにあるTerraformコードをCI/CDで利用するといった基本的な開発フローが使用できないため、業務運用で使って行くにはまだこれからといった感じがします。
ただ、今後このサービスに、Terraform Cloudのような付加機能や、開発を支援するGoogle Cloudならではの機能が追加されていくと、本格的に業務に投入できるのではないかと可能性を感じます。
これからもウォッチして行きたいなと思いました。

Discussion