Provider は Terraform の外部サービス連携を担うプラグインで、計画・適用の各段階で API と対話します。Associate では宣言、インストール、バージョン管理、エイリアス、認証の基本を正確に押さえることが重要です。
本稿では、Terraform Core と Provider の分離という設計背景から、実務で外さない設定パターンと試験で問われやすい要点をまとめます。
Provider は Terraform Core から独立したプラグインで、各クラウドやSaaSの API へ接続し、resource と data source を実装します。リソースの作成・更新・削除や、読み取り専用のデータ取得を Provider が引き受け、Terraform Core は計画生成と状態管理に専念します。
Provider は source アドレスで一意に識別されます。例: registry.terraform.io/hashicorp/aws。required_providers でソースとバージョン制約を宣言し、terraform init により解決・取得されます。
Terraform Core は実行時に Provider プラグインを外部プロセスとして起動し、安定化されたプラグインプロトコル越しにやり取りします。Core は計画と状態の差分を計算し、Provider は個々のリソース操作を API に対して実行します。
この分離により、Provider ごとに独立して開発・配布・アップグレードが可能で、障害が一方に波及しにくく、機能追加の展開も容易になります。ネットワークアクセスは Provider 側で行われるため、Core は外部 API 認証情報を直接保持しません。
Terraform Core と Provider プラグインの関係
プロジェクトの terraform ブロックで required_providers を宣言し、source と version 制約を指定します。terraform init は Registry から Provider を解決し、署名とチェックサムを検証した上でローカルにインストールします。.terraform.lock.hcl は解決済みバージョンとチェックサムを固定し、チーム間での再現性を担保します。
アップグレードは version 制約を見直し、terraform init -upgrade を実行します。オフラインやミラー利用は CLI 設定ファイルの provider_installation で制御可能です。試験では、.terraform ディレクトリはコミットしないが .terraform.lock.hcl はコミットする、という基本がよく問われます。
典型的な required_providers と Provider 設定
terraform {
required_version = ">= 1.5.0"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
azurerm = {
source = "hashicorp/azurerm"
version = ">= 3.0, < 4.0"
}
}
}
provider "aws" {
region = var.aws_region
}
provider "azurerm" {
features {}
}
variable "aws_region" {
type = string
default = "us-east-1"
description = "AWS region"
}Provider への認証情報は、一般に provider ブロックの明示的な引数、環境変数、共有認証ファイル、SDK のデフォルト探索順などが組み合わさって決まります。優先順位は Provider 実装に依存しますが、原則として provider ブロックで指定した値が最優先で、未指定の場合に環境変数や共有ファイルが用いられる形が一般的です。
機密情報は VCS に残さないことが基本です。変数の sensitive フラグや環境変数、Terraform Cloud/Enterprise の変数ストア等を活用し、平文での埋め込みは避けます。
変数を使って認証情報を明示しない例(AWS)
variable "aws_profile" {
type = string
default = null
description = "AWS named profile (optional)"
}
provider "aws" {
region = var.aws_region
profile = var.aws_profile # 未指定なら SDK のデフォルト探索に委ねる
}
# 実行時に AWS_PROFILE を設定するか、var.aws_profile に値を渡す
# 例: AWS_PROFILE=dev terraform apply同一種類の Provider を複数設定する場合は alias を使います。resource 側で provider = aws.east のように明示すると、そのリソースは該当の設定で作成されます。未指定の場合、同種類のデフォルト設定が使われます。
モジュールは Provider 設定を内包しません。呼び出し元が providers マップでモジュール内の Provider 参照に具体的な設定を割り当てます。これにより、同一モジュールを異なるアカウントやリージョンへ安全にデプロイできます。
エイリアスとモジュールへの Provider 受け渡し
provider "aws" {
region = "us-west-2"
}
provider "aws" {
alias = "east"
region = "us-east-1"
}
resource "aws_s3_bucket" "west" {
bucket = "nlab-west-bucket"
provider = aws
}
resource "aws_s3_bucket" "east" {
bucket = "nlab-east-bucket"
provider = aws.east
}
module "network" {
source = "./modules/vpc"
# モジュール内は aws Provider を参照している前提
providers = {
aws = aws.east
}
}
# modules/vpc 側の宣言例(抜粋)
# terraform {
# required_providers {
# aws = {
# source = "hashicorp/aws"
# }
# }
# }
# resource "aws_vpc" "this" { ... }バージョン更新は version 制約の見直しと terraform init -upgrade で行い、.terraform.lock.hcl の差分を確認します。terraform providers コマンドで現在の依存関係を可視化できます。署名・チェックサム検証は init 時に自動で実施されます。
不一致や適用失敗時は、計画出力でどの Provider/リソースが失敗しているかを特定し、環境変数や認証設定の漏れを確認します。必要に応じて TF_LOG を活用し、Provider 側ドキュメントの認証チェーンを参照します。既存リソースの Provider を切り替える場合、多くは再作成や import が必要で、単純な provider の差し替えでは対応できません。
| 項目 | Provider | Provisioner | Module |
|---|---|---|---|
| 主な役割 | 外部APIとの対話とリソース実装 | 作成後の補助的スクリプト実行 | 構成の再利用・カプセル化 |
| ライフサイクル | 計画・適用の中核で毎回関与 | 一時的。将来的利用は最小化推奨 | 参照時に展開され Core が解釈 |
| 再利用単位 | プラグイン単位で全ワークスペースに影響 | 各リソースで個別 | 呼び出し元ごとに柔軟に構成 |
| 更新手順 | version 制約と init -upgrade、lock 更新 | コード変更のみ | source/version 見直しと init |
| 試験での注意 | required_providers と lock の理解が必須 | 乱用しない。外部CMツール優先 | providers マップでの割当を理解 |
よく使う確認コマンド
# 依存している Provider とバージョン
terraform providers
# Provider のアップグレード
terraform init -upgrade
# 詳細ログ(一時的に)
TF_LOG=TRACE terraform plan
Associate
問題 1
同一種類の Provider を複数リージョンで使い分けたい。正しい実装として最も適切なのはどれか。
正解: A
同一種類の Provider を複数使うには alias を宣言し、resource 側の provider メタ引数で明示的に選択します。count/for_each での動的切替は不可。モジュールは Provider 設定を内包せず、呼び出し元の providers マップが必要。.terraform の配布は推奨されません。
.terraform.lock.hcl はコミットすべきですか?
はい。lock ファイルは解決済み Provider のバージョンとチェックサムを固定し、環境間の再現性を担保します。.terraform ディレクトリはコミットしません。
既存リソースの Provider を別アカウントや別リージョンに切り替えられますか?
多くの場合、単純な切替はできません。新しい Provider 設定下でリソースを再作成するか、既存実体を import し、必要に応じて state mv でアドレス調整が必要です。計画で置換有無を必ず確認してください。
オフライン環境や社内ミラーで Provider を取得するには?
CLI 設定ファイルで provider_installation を用い、filesystem_mirror や network_mirror を指定します。レジストリの署名・チェックサム検証は維持され、terraform init でミラーから取得できます。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Terraform HCL 構文の基礎:Block / Attribute / Expression を正しく使い分ける
Terraform Associate で頻出の HCL 構文を、ブロック・属性・式の3視点で整理。実務で迷いがちな書き...
Terraform Authoring & Ops Pro: 上位資格の範囲と対策
上位レベルを想定したTerraformの設計・運用ドメインを整理し、実務で通用する対策を提示。モジュール設計、ステート運...
Terraform Providers の基本: プラグイン型アーキテクチャを正しく使いこなす
Associate レベルで押さえるべき Provider の基礎、インストール、バージョニング、認証、エイリアス運用を...
Terraform Resourceブロック徹底ガイド: 最小単位のリソース定義
Associateレベルで押さえるべきResourceブロックの構造、依存関係、メタ引数、ライフサイクル制御を実務目線で...
Terraform Data Source徹底理解:既存リソースの参照で壊さず足す
Terraform Associate向けに、Data Sourceを用いた既存リソース参照の基本、選択基準、評価順序、...