はじめに
2025年4月に KAG へ入社して、ソフトウェアエンジニアとして働いている Yuma です。
今回は、Terraform Cloud(現在は正式には HCP Terraform という名称で、IBM グループの製品として提供されています)を紹介します。
IaC ツールとして OSS の Terraform を利用している方は多いと思いますが、前の会社では Terraform Cloud を利用していて馴染みがあったので、今回アドベントカレンダーのネタに悩んだこともあり、紹介してみようかと思い立ちました。
と言いつつ、前職でもちょろっと検証用途に使っていただけなので、今回はあくまで使ってみた!の記事で、運用プラクティスなどは触れていない(というか説明できない)ので、ご承知おき下さい。
この記事で書くこと
- Terraform Cloud と GitHub リポジトリの連携
※ GHE (GitHub Enterprise) ではなく、個人用の GitHub アカウントを利用します - Terraform Cloud と AWS の連携
- Terraform Cloud と Google Cloud の連携
この記事で書かないこと
- Terraform 自体の紹介(構文含む)
- Terraform Cloud の機能や活用方法の詳細
本当は Terraform Cloud にどういう機能があるのか、CI/CD パイプラインでの活用方法なども探求したかったのですが調べきれておらず、冒頭に述べた通り、今回はあくまで AWS と Google Cloud のリソースを作成してみた!の記事になります。
Terraform Cloud について
すごく大まかな概要となりますが、
- SaaS 型で提供されている Terraform 実行 & 運用環境
- セキュアな変数管理やアクセス制御など、中央集権型の管理が可能
といったことが特徴になるかなと思います。どちらかというと個人利用というよりは複数人や企業利用のユースケース向けの機能が充実しているのかなと思います。
詳細は他参考サイトに任せる形とします。
料金も気になるところだと思いますが、2023年に無料プランの変更があり、500個のリソース管理までは無料で利用できます。今年の3月末の段階ですが、アカウント作成時にクレジットカードの登録も不要でした。
ただし、Hashicorp社がIBMグループ傘下に入ったりと2023年から状況が変わっています。直近の12/17に掲載された公式ブログ(下記の2つ目)では依然として500個のリソース管理までは無料であることが記載されていますが、今後はクレジットカードの登録など求められる可能性があります。あくまで執筆時点の情報であることをご了承ください。
※無料枠以外の料金はこちらに詳細が記載されています。
Terraform Cloud と GitHub リポジトリを連携する
以下の Qiita 記事を参考に設定しました。
事前に、Organizationsは作成しておく必要がありますのでご注意ください(Personalを選択して、名前とメールアドレスの入力だけで作成できます)。
-
(Terraform コンソール)「Create a Workspace」をクリックして、Version Control Workflowを選択
-
(Terraform コンソール)GitHub → GitHub.com (Custom)を選択
※ GitHub.com と GitHub.com (Custom) の選択肢の違いがよくわからなかったのですが、参考記事に倣って Custom の方を選びました。違いについてご存知の方いらっしゃればコメント等で教えていただけると幸いです。

-
(GitHub コンソール)Profileアイコンを押下して、「Settings」→左のサイドメニューから「Developer settings」を選択
-
サイドメニューから「OAuth Apps」を選択して、「New OAuth app」を押下
-
(GitHub コンソール)2で GitHub.com (Custom) を選択後、Terraform コンソールに表示されている「Application name」, 「Homepage URL」, 「Authorization callback URL」を入力して、「Register application」を押下

-
(GitHub コンソール)その後、作成した OAuth App の設定画面で「Generate a new client secret」を押下してクライアントシークレットを作成
-
(Terraform コンソール)2で GitHub.com (Custom) を選択後、Terraform コンソールの下方に表示されている、「Name」, 「Client ID」, 「Client Secret」を入力して「Connect and continue」を押下

-
別画面で認証を求められるので、「Authorize ~~~」を押下
-
(Terraform コンソール)Advanced Settingsはすべてデフォルトのままとして、「Skip and finish」をクリック
-
(Terraformコンソール)今回の作業リポジトリを選択して、Workspace名を入力し「Create」を押下
下記のような画面が表示されれば成功です!
Terraform Cloud を利用して AWS 環境に S3 バケットを作ってみる
これまでに、GitHub リポジトリと Terraform Cloud の Workspace を連携させることができました。
後は、GitHub リポジトリ内の Terraform 用の作業フォルダへの push をトリガーに AWS リソースが作成されるように設定する必要があります。
Terraform Cloud と AWS の連携には AWS のアクセスキーを Workspace の環境変数に登録する必要があると思い込んでいたのですが、今回調べたところ OIDC (OpenID Connect) と IAMロールを使って連携できることがわかりました。セキュリティとしても後者が推奨されると思いますので、下記のWebサイトを参考に設定を行います。
-
Workspaceに対して、ローカルの作業ディレクトリを指定
認証とは無関係ですが、Terraform と関係ないファイルを push するたびにも Terraform を実行するのは無駄なので、Terraform 用の作業フォルダを別に切って(今回は「aws」とします)、そのフォルダ配下の push 時のみに Terraform が動くように設定します。
※Workspace → Settings → General Settingsの「Terraform Working Directory」で設定します。
また、auto-apply の設定もチェックすると、plan → apply まで自動で動きます。チェックしなければ、plan の内容を確認し、手動で confirm した後に apply が動くようになります。

-
OpenID Connect の IDプロバイダを作成
AWS の IAM のコンソール画面から IDプロバイダの設定を行います。

-
Terraform 用の IAMロールの作成
2でIDプロバイダの作成に成功すると、コンソール画面の上部に緑色の帯で「ロールの割り当て」が出てくるので、そちらをクリックして下記のように設定します。



ここで作成したものが、今後 Terraform が AWS リソースを作成・編集するために利用する IAMロールとなります。今後、Terraform で行いたい操作に対して、適切な許可ポリシーを追加する必要があります。 -
S3バケットの作成するための許可を追加し、ロール名を入力
今回はまずはS3バケットの作成を行いたいので、「AmazonS3FullAccess」の許可を追加します。検証用なのでFullAccessをつけますが、余裕があれば最小権限に絞って許可ポリシーをつけるようにしましょう。最後にロール名を入力して、これまでの入力内容を確認するとIAMロールを割り当てることができます。 -
Terraform Cloudのコンソールから必要な環境変数を設定
これで、AWS と Terraform Cloud の連携は完了です。
aws フォルダ配下に main.tf と s3.tf を下記のように作成して push してみましょう。
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 6.0"
}
}
}
provider "aws" {
region = "ap-northeast-1"
}
resource "aws_s3_bucket" "terraform_test" {
bucket = "qiita-advent-calendar-terraform-test-2025"
}
GitHub リポジトリに push すると Terraform が実行され、AWSコンソールからも S3バケットが作成されます!
※本来は自動で terraform plan が実行されるはずなのですが、初回は Workspace 作成後のコンソール画面から「start new plan」を押下して Run を実行する必要がありました。2回目以降はpushをトリガーに実行されたのですが、理由は不明です。。
Terraform Cloud を利用して Google Cloud 環境に Cloud Storage のバケットを作ってみる
続けて、Google Cloud プロジェクトとも連携して、Terraform Cloud 経由で Cloud Storage バケットを作成してみたいと思います。
今回は以下の公式ブログのシナリオ2を参考に設定しました。
-
Terraform Cloud の Workspace は、Google Cloud 用に別途作成しておきます。また、作業ディレクトリも「google_cloud」として指定しておきます
-
Google CloudのIAMと管理コンソールから、Workload Identity 連携を選択
-
プロバイダの属性マッピングと属性条件を指定する

※属性条件ですが、参考サイト通りに設定するとこの後の Terraform 実行がエラーとなってしまったため、今回は「assertion.sub.size() > 0」と指定しました。本来はより厳しい条件を設定すべきだと思うので、時間を見つけて調査したいと思います。 -
サービスアカウントを作成する
※この時点では「権限」や「アクセス権を持つプリンシパル」の設定はスキップしています -
「アクセス権を持つプリンシパル」タブからアクセス許可を追加する

プリンシパルの指定ですが、参考サイト通り「principal://iam.googleapis.com/projects//locations/global/workloadIdentityPools//attribute.terraform_workspace_id/」と設定するとエラーとなり設定できなかったため、先頭のプリンシパルの指定を"principalSet"としたところ、うまく設定することができました。
ロールは参考サイト通り「Workload Identity ユーザー」を指定します。 -
Terraform Cloudのコンソールから必要な環境変数を設定
- TFC_GCP_PROVIDER_AUTH : true
- TFC_GCP_RUN_SERVICE_ACCOUNT_EMAIL: Terraform Cloud が Google Cloud の認証に使用するサービス アカウントのメールアドレス
- TFC_GCP_WORKLOAD_PROVIDER_NAME: Workload Identity プロバイダの正規名
※Workload Identity プロバイダの正規名は以下の形式で、Workload Identity プロバイダの編集画面から確認できます:projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/POOL_NAME/providers/PROVIDER_NAME
これで、Google Cloud と Terraform Cloud の連携は完了です。
AWSの時と同様に google_cloud フォルダ配下に main.tf と storage.tf を下記のように作成して push してみましょう。
terraform {
required_providers {
google = {
source = "hashicorp/google"
version = "~> 7.0"
}
}
}
provider "google" {
project = "<YOUR_GOOGLE_CLOUD_PROJECT_ID>"
}
resource "google_storage_bucket" "static" {
name = "qiita-advent-calendar-terraform-test-2025"
location = "ASIA1"
storage_class = "STANDARD"
uniform_bucket_level_access = true
}
GitHub リポジトリに push すると Terraform が実行され、Google Cloud コンソールにも Cloud Storage バケットが作成されます!

※AWS の連携設定と同様、初回は Workspace 作成後のコンソール画面から「start new plan」を押下して Run を実行する必要がありました。。
まとめと資格試験について
今回は、Terraform Cloud を使って、AWS と Google Cloud 環境にリソースを作成する手順を紹介しました。
私個人の次のステップとして、Terraform の資格「HashiCorp Certified: Terraform Associate (004) 」の取得を目指そうと思います。
※2026/1/8より、既存の003から004に置き換わるそうです。
英語限定なので難しそうですが、ここで宣言をすることで自分に発破をかけてなんとか合格したいと思います!







