1. 概要
この記事では、以下の内容を解説します。
providerブロックとrequired_providersの役割と書き方- バージョン制約演算子(
~>/>=/!=)の意味と使い分け .terraform.lock.hcl(ロックファイル)の役割- プロバイダーエイリアス(複数リージョン・複数アカウント)
- よくある失敗パターンと対処法
Terraformで「AWSのリソースを作る」ためには、AWSと通信するためのプロバイダーが必要です。required_providersでどのプロバイダーを使うかを宣言し、providerブロックで認証情報やリージョンなどの設定を行います。
2. required_providersとは
terraformブロック内のrequired_providersで、使用するプロバイダーとそのバージョン制約を宣言します。
terraform {
required_version = ">= 1.9"
required_providers {
aws = {
source = "hashicorp/aws" # プロバイダーの提供元(namespace/type)
version = "~> 5.0" # バージョン制約
}
}
}
terraform initを実行すると、required_providersに書いたプロバイダーが.terraform/ディレクトリにダウンロードされます。
3. providerブロックの設定
providerブロックでプロバイダーの設定(リージョン・認証情報など)を記述します。
provider "aws" {
region = "ap-northeast-1" # 東京リージョン
}
AWSの認証情報の渡し方
providerブロックにアクセスキーをハードコードするのはセキュリティリスクがあるため禁止です。以下の方法を使います。
# ✅ 方法1: 環境変数(CI環境で推奨)
export AWS_ACCESS_KEY_ID="AKIAIOSFODNN7EXAMPLE"
export AWS_SECRET_ACCESS_KEY="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
export AWS_DEFAULT_REGION="ap-northeast-1"
# ✅ 方法2: AWSプロファイル(ローカル開発で推奨)
export AWS_PROFILE="myprofile"
# ✅ 方法3: IAMロール(EC2/ECS/Lambda上で推奨。キー不要)
# インスタンスプロファイルに適切な権限を付与するだけ
# ❌ ハードコードは絶対禁止
provider "aws" {
access_key = "AKIAIOSFODNN7EXAMPLE" # 危険!Gitに漏れる
secret_key = "wJalrXUtn..." # 危険!
region = "ap-northeast-1"
}
4. バージョン制約の演算子
required_providersとrequired_versionで使えるバージョン制約演算子の一覧です。
| 演算子 | 意味 | 例 | 許可範囲 |
|---|---|---|---|
~> | 悲観的制約(右端のみ更新可) | ~> 5.0 | 5.0以上6.0未満 |
~> | 悲観的制約(マイナーまで固定) | ~> 5.50 | 5.50以上5.51未満 |
>= | 以上 | >= 5.0 | 5.0以上すべて |
<= | 以下 | <= 5.0 | 5.0以下すべて |
!= | 除外 | != 5.10.0 | 5.10.0以外 |
= | 完全一致 | = 5.50.0 | 5.50.0のみ |
推奨: ~>(悲観的制約)を使う
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0" # ✅ パッチ・マイナーの自動更新を許容しつつ、メジャーバージョンアップは防ぐ
}
}
💡
~> 5.0と~> 5.50の違い: –~> 5.0→ 5.x系ならどのバージョンでも可(5.1, 5.50, 5.99など) –~> 5.50→ 5.50.x系のみ(5.50.0, 5.50.1など。5.51はNG)
5. .terraform.lock.hcl(ロックファイル)
terraform initを実行すると.terraform.lock.hclが作成・更新されます。このファイルはプロバイダーの実際にダウンロードしたバージョンを固定します。
# .terraform.lock.hcl(自動生成。直接編集しない)
provider "registry.terraform.io/hashicorp/aws" {
version = "5.50.0"
constraints = "~> 5.0"
hashes = [
"h1:abc123...", # チェックサム(改ざん検知)
]
}
.terraform.lock.hclはGitにコミットしてください。 これにより、チーム全員が同じバージョンのプロバイダーを使えます。
# バージョンを最新に更新したいとき
terraform init -upgrade # lock.hcl を更新して最新バージョンをダウンロード
6. プロバイダーエイリアス(複数リージョン・複数アカウント)
aliasを使うと、同一プロバイダーを異なる設定で複数定義できます。たとえば東京リージョンとバージニア北部リージョンを同一のTerraformコードで管理する場合に使います。
provider "aws" {
region = "ap-northeast-1" # デフォルト
}
provider "aws" {
alias = "us_east"
region = "us-east-1"
}
resource "aws_s3_bucket" "us_bucket" {
provider = aws.us_east # alias名で指定
bucket = "my-us-east-bucket"
}
複数アカウント(assume_role)への応用・モジュールへのプロバイダー渡しなど、エイリアスの詳細な使い方は専用記事を参照してください。
→ provider エイリアス — 複数リージョン・複数アカウントの設定
7. よくある失敗パターン
terraform initでプロバイダーが見つからない
│ Error: Failed to query available provider packages
│
│ Could not retrieve the list of available versions for provider
│ hashicorp/aws: the previously-selected version constraint "~> 5.0" is
│ no longer applicable.
解決方法:
# ロックファイルをリセットしてinit
rm .terraform.lock.hcl
terraform init
# または upgrade フラグで更新
terraform init -upgrade
バージョン制約の競合
│ Error: Failed to query available provider packages
│
│ locked provider registry.terraform.io/hashicorp/aws 4.67.0 does not
│ match configured version constraint ~> 5.0
原因: ロックファイルのバージョンとrequired_providersの制約が合わない(メジャーバージョンアップ後など)。
解決方法:
terraform init -upgrade # ロックファイルを更新
8. 関連記事
- terraform init / plan / apply / destroyの使い方 —
terraform initでのプロバイダー初期化 - backendの設定方法 —
terraformブロックのbackend設定 - Terraformよくあるエラー集 — initエラーの解決策一覧
- resourceブロック — 基本構文と使い方
- provider エイリアス — 複数プロバイダー設定
- バージョン制約式 — ~> / >= / != の使い方
9. まとめ
required_providersでプロバイダーのsourceとversion制約を宣言するproviderブロックでリージョンや認証設定を記述(アクセスキーのハードコードは禁止)- バージョン制約は
~> 5.0(悲観的制約)が推奨。メジャーバージョンアップを防ぎつつパッチは自動更新 .terraform.lock.hclはGitにコミットしてチームのプロバイダーバージョンを統一する- 複数リージョン・複数アカウントは
aliasを使って複数のproviderブロックを定義する
動作確認バージョン: Terraform >= 1.9 / AWS Provider ~> 5.0 対象リージョン: ap-northeast-1(東京) 公式ドキュメント: https://developer.hashicorp.com/terraform/language/providers