エンジニアの皆さん、こんにちは。インフラの深淵を覗き込み、Terraformと数多の修羅場をくぐり抜けてきた先輩として、今日は皆さんが必ず直面する「Providerの迷宮」について話をしましょう。
Terraformを触り始めると、最初にぶつかる壁が「Providerの管理」です。特に、東京(ap-northeast-1)とオレゴン(us-west-2)を同時に扱うようなマルチリージョン構成に挑んだ時、多くの初心者が「暗黙的なデフォルトプロバイダの罠」に足を取られ、深夜までログを追いかける羽目になります。
今日は、その泥沼から永遠に卒業するための「プロバイダ設計の極意」を授けます。
—
1. なぜ「Providerの管理」が重要なのか?
Terraformにおいて、Providerとは「AWSやGCPといったクラウドのAPIを叩くための翻訳機」です。
初心者が陥りがちなのは、ルートモジュールに無造作に書かれた `provider “aws” {}` を使い回すこと。これだと、リソースが増えた時に「どのリージョンのリソースなのか」がコード上から曖昧になり、意図せぬリージョンに本番リソースを作成してしまうという悲劇が起こります。
これを防ぐのが `alias`(エイリアス) です。
—
2. 環境構築:まずはここから
まずはTerraformがインストールされている前提で、以下のディレクトリ構成を作成してください。
.
├── main.tf # プロバイダ定義
├── vpc.tf # リソース定義
└── modules/
└── network/ # 再利用可能なモジュール
main.tf:プロバイダを「名前付き」で定義する
デフォルトのプロバイダは使わず、すべて名前をつけます。これが事故を防ぐ第一歩です。
東京リージョンを「tokyo」として定義
provider “aws” {
alias = “tokyo”
region = “ap-northeast-1”
}
オレゴンリージョンを「oregon」として定義
provider “aws” {
alias = “oregon”
region = “us-west-2”
}
—
3. モジュールへの安全な受け渡し(ここが極意)
モジュールにプロバイダを渡す際、初心者は忘れがちですが、モジュール側でも `required_providers` を宣言しておくのが鉄則です。これにより、意図しないProviderバージョンによる破壊的変更から身を守れます。
modules/network/provider.tf
terraform {
required_providers {
aws = {
source = “hashicorp/aws”
version = “~> 5.0” # バージョンを固定し、予期せぬ仕様変更を遮断する
}
}
}
main.tf からモジュールを呼び出す
ここが一番重要です。`providers` 引数で、どのaliasをどのモジュールで使うか明示的に紐付けます。
module “vpc_tokyo” {
source = “./modules/network”
# このモジュール内では「tokyo」のプロバイダを使う
providers = {
aws = aws.tokyo
}
}
module “vpc_oregon” {
source = “./modules/network”
# このモジュール内では「oregon」のプロバイダを使う
providers = {
aws = aws.oregon
}
}
—
4. Hello World的な動作確認:精度を高める
単に `apply` するのではなく、以下のコマンドで「どのプロバイダが使われているか」を常に確認する癖をつけてください。
1. 初期化: `terraform init`
2. プラン確認: `terraform plan`
実行結果の中に `provider[“registry.terraform.io/hashicorp/aws”].tokyo` のように表示されていれば完璧です。もしここが `default` になっていたら、それは「プロバイダの受け渡し」に失敗している証拠です。即座に見直しましょう。
—
先輩からのアドバイス:なぜこれをやるのか
この設計の美しさは、「リソースの所在がコードから一意に特定できること」にあります。
将来、AWSのProvider仕様が変更されたり、特定のリージョンだけ権限の異なるIAMロールを使いたいとなったとき、この設計なら `main.tf` の定義を書き換えるだけで、システム全体を安全に移行できます。
- 冪等性(べきとうせい): 何度実行しても同じ状態になる。
- 明示的であること: 魔法のような隠れた挙動を排除する。
この二つは、インフラエンジニアの「命」です。
Terraformは単なる設定ツールではなく、「クラウドの望ましい状態を定義する言語」です。この設計をマスターすれば、皆さんのインフラはより堅牢に、そして何より、皆さんの夜の眠りはより深いものになるはずです。
さあ、恐れずにコードを書き始めましょう。もし迷ったら、またここに戻ってきてください。いつでも待っていますよ。