こんにちは。よっしーです(^^)
今日は、Workload Identity を使用してTerraformからGCPに接続する方法について解説しています。
背景
Workload Identity を使用してTerraformからGCPに接続する方法について調査する機会がありましたので、その時の内容を備忘として記事に残しました。
Workload Identity を使用してTerraformからGCPに接続する理由
Workload Identityを使用してTerraformからGCPに接続する理由は、セキュリティ、管理性、そして運用効率の向上にあります。主な利点は以下の通りです:
- セキュリティの強化:
- 静的な長期的認証情報(サービスアカウントキー)を使用せず、短期的な一時認証情報を利用するため、セキュリティリスクが大幅に低減されます。
- キーの漏洩や不正使用のリスクが軽減されます。
- 認証情報の管理簡素化:
- サービスアカウントキーの作成、配布、ローテーション、取り消しなどの複雑な管理プロセスが不要になります。
- 認証情報の有効期限管理が自動化されます。
- 細かなアクセス制御:
- 特定のTerraformワークスペースやプロジェクトに対して、個別の権限設定が可能になります。
- 必要最小限の権限付与(最小権限の原則)を実現しやすくなります。
- 監査とコンプライアンス:
- アクセスログがより詳細かつ正確になり、誰がいつどのリソースにアクセスしたかを追跡しやすくなります。
- コンプライアンス要件への対応が容易になります。
- CI/CDパイプラインとの統合:
- 自動化されたデプロイメントプロセスにおいて、よりセキュアな認証メカニズムを提供します。
- 環境ごとに異なる認証設定を容易に管理できます。
- マルチクラウド環境のサポート:
- 異なるクラウドプロバイダー間で一貫したアイデンティティ管理が可能になります。
- ハイブリッドクラウド環境での運用が容易になります。
- 動的な環境への対応:
- コンテナ化されたアプリケーションや短命なコンピューティングリソースに適した認証メカニズムを提供します。
- 運用効率の向上:
- 認証プロセスが自動化され、人的エラーのリスクが軽減されます。
- インフラストラクチャのプロビジョニングと管理が効率化されます。
- ベストプラクティスの順守:
- クラウドプロバイダーが推奨するセキュリティベストプラクティスに沿った運用が可能になります。
- 柔軟性と拡張性:
- 組織の成長やニーズの変化に合わせて、認証とアクセス制御を柔軟に調整できます。
これらの理由により、Workload Identityの使用は、特に大規模なインフラストラクチャ管理や自動化されたデプロイメントプロセスを持つ組織にとって、非常に有益なアプローチとなります。セキュリティを強化しながら、運用の効率性も向上させることが期待できます。
手順
terraform cloud で workspaceを作成します。
作成したworkspaceに下記の変数を設定します。
TFC_GCP_PROVIDER_AUTH : true
TFC_GCP_RUN_SERVICE_ACCOUNT_EMAIL : sa-poc-terrafrom@poc-terraform-20240715.iam.gserviceaccount.com
TFC_GCP_WORKLOAD_PROVIDER_NAME : projects/`プロジェクト番号`/locations/global/workloadIdentityPools/poc-terraform-pool/providers/poc-terraform-20240715
設定画面は下記のようになります。
下記のコマンドを実行します。
gcloud services enable iamcredentials.googleapis.com \
--project="poc-terraform-20240715"
gcloud services enable compute.googleapis.com \
--project="poc-terraform-20240715"
gcloud iam service-accounts add-iam-policy-binding sa-poc-terrafrom@poc-terraform-20240715.iam.gserviceaccount.com \
--role=roles/iam.workloadIdentityUser \
--member="principalSet://iam.googleapis.com/projects/`プロジェクト番号`/locations/global/workloadIdentityPools/poc-terraform-pool/*"
下記の main.tfファイルを用意します。
terraform {
cloud {
organization = "組織名"
workspaces {
name = "poc-gcp-20240715"
}
}
}
resource "google_compute_instance" "default" {
project = "poc-terraform-20240715"
name = "poc-instance"
machine_type = "e2-medium"
zone = "asia-northeast1-a"
boot_disk {
initialize_params {
image = "debian-cloud/debian-11"
labels = {
my_label = "value"
}
}
}
network_interface {
network = "default"
access_config {
// Ephemeral public IP
}
}
}
下記のコマンドを実行します。
terraform apply
下記のような出力になれば成功です。
解説
gcloudコマンド
これらのコマンドは Google Cloud Platform (GCP) の設定に関するものです。順番に解説していきます。
gcloud services enable iamcredentials.googleapis.com --project="poc-terraform-20240715"
このコマンドは、指定されたプロジェクト(poc-terraform-20240715)で IAM Credentials API を有効にします。IAM Credentials API は、サービスアカウントの認証情報を管理するために使用されます。gcloud services enable compute.googleapis.com --project="poc-terraform-20240715"
このコマンドは、同じプロジェクトで Compute Engine API を有効にします。Compute Engine API は、GCP の仮想マシンインスタンスを管理するために必要です。gcloud iam service-accounts add-iam-policy-binding sa-poc-terrafrom@poc-terraform-20240715.iam.gserviceaccount.com --role=roles/iam.workloadIdentityUser --member="principalSet://iam.googleapis.com/projects/プロジェクト番号/locations/global/workloadIdentityPools/poc-terraform-pool/*"
このコマンドは、指定されたサービスアカウント(sa-poc-terrafrom@poc-terraform-20240715.iam.gserviceaccount.com)に IAM ポリシーバインディングを追加します。具体的には:
roles/iam.workloadIdentityUser
ロールを付与します。- このロールは、Workload Identity プールの特定のプリンシパルセットに関連付けられます。
- Workload Identity は、GCP 外部のアイデンティティ(例:GitHub Actions)がGCPリソースにアクセスすることを可能にする機能です。
プロジェクト番号
の部分は、実際のGCPプロジェクト番号に置き換える必要があります。
これらのコマンドは、Terraform を使用してGCPリソースを管理するための準備段階として実行しています。API を有効にし、適切な権限を設定することで、Terraform が安全にGCPリソースを操作できるようになります。
main.tf
このTerraformコードを解説します:
terraform {
cloud {
organization = "組織名"
workspaces {
name = "poc-gcp-20240715"
}
}
}
resource "google_compute_instance" "default" {
project = "poc-terraform-20240715"
name = "poc-instance"
machine_type = "e2-medium"
zone = "asia-northeast1-a"
boot_disk {
initialize_params {
image = "debian-cloud/debian-11"
labels = {
my_label = "value"
}
}
}
network_interface {
network = "default"
access_config {
// Ephemeral public IP
}
}
}
- Terraform Cloud 設定:
terraform
ブロックでTerraform Cloudの設定を定義しています。organization
に組織名を指定しています。workspaces
で “poc-gcp-20240715” という名前のワークスペースを使用することを指定しています。
- Google Compute Engine インスタンスの定義:
google_compute_instance
リソースを使用してGCEインスタンスを定義しています。project
: インスタンスを作成するGCPプロジェクトIDを指定(”poc-terraform-20240715″)。name
: インスタンスの名前を “poc-instance” と設定。machine_type
: インスタンスのマシンタイプを “e2-medium” に設定。zone
: インスタンスを作成するゾーンを “asia-northeast1-a”(東京リージョン)に指定。
- ブートディスクの設定:
boot_disk
ブロックでインスタンスのブートディスクを設定。image
: Debian 11のイメージを使用。labels
: ディスクにラベルを追加(”my_label” = “value”)。
- ネットワーク設定:
network_interface
ブロックでネットワーク設定を定義。network
: デフォルトネットワークを使用。access_config
: 空のブロックを指定することで、エフェメラル(一時的な)パブリックIPアドレスを割り当て。
このコードを実行すると、指定されたGCPプロジェクト内に、Debian 11を実行するe2-mediumインスタンスが東京リージョンに作成されます。インスタンスにはパブリックIPアドレスが割り当てられ、デフォルトネットワークに接続されます。
おわりに
今日は、 Workload Identity を使用してTerraformからGCPに接続する方法について解説しました。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント