providerブロックとrequired_providers — プロバイダーの設定完全ガイド

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_providersrequired_versionで使えるバージョン制約演算子の一覧です。

演算子意味許可範囲
~>悲観的制約(右端のみ更新可)~> 5.05.0以上6.0未満
~>悲観的制約(マイナーまで固定)~> 5.505.50以上5.51未満
>=以上>= 5.05.0以上すべて
<=以下<= 5.05.0以下すべて
!=除外!= 5.10.05.10.0以外
=完全一致= 5.50.05.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. 関連記事


9. まとめ

  • required_providersでプロバイダーのsourceversion制約を宣言する
  • 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