Terraform

Terraform Provider 認証パターン実践ガイド: 環境変数・プロファイル・OIDC

2026-04-19
NicheeLab編集部

Terraform の認証は Provider ごとに実装され、優先順位や対応変数も異なります。試験では「どのパターンがどの場面に適合するか」「安全に自動化する設計を選べるか」が問われます。

ここでは AWS/Azure/GCP を軸に、環境変数・共有プロファイル・OIDC(フェデレーション)の3系統を比較し、CI/CD とローカルの両方で安定運用する指針をまとめます。

プロバイダ認証の原則と優先順位

Terraform のコアは認証を持ちません。各 Provider が認証の探索順序(優先順位)を実装します。多くの公式 Provider では、明示設定 > 環境変数 > 共有プロファイル/CLI 認証 > インスタンス/メタデータといった順で探索されますが、正確な順序や対応キーは Provider ごとに異なります。

試験対策の基本は「明示的な provider ブロック設定が最優先」「環境変数は CI/CD と相性が良い」「ローカル開発では共有プロファイル/CLI が楽」「本番の自動化は OIDC/フェデレーションで短期資格を使う」の4点を押さえることです。優先順位の細部は各 Provider の公式ドキュメントを確認してください。

  • 明示設定が最優先(例: provider ブロックに client_id/role_arn 等)
  • 環境変数は非対話・コンテナで有効(CI/CD 向き)
  • 共有プロファイル/CLI はローカル開発で便利(例: ~/.aws/credentials, gcloud ADC, az login)
  • メタデータ/IMDS は実行環境がクラウドの場合のフォールバック
  • 優先順位は Provider ごとに異なるため設計前に確認する

最小構成(既存の認証連鎖に委ねる)

terraform {
  required_providers {
    aws = { source = "hashicorp/aws" }
  }
}

provider "aws" {
  # credentials/profile/env/IMDS いずれかで解決
  region = var.region
}

環境変数パターン(ローカルとCIの両対応)

環境変数は非対話環境に最適で、CI/CD との親和性が高い方法です。AWS ならアクセスキーや一時トークン、Azure なら ARM_* 変数、GCP なら ADC(GOOGLE_APPLICATION_CREDENTIALS=外部アカウントJSON含む)を使います。長期キーの直置きは避け、可能なら短期資格(セッション/トークン)を使います。

Terraform 側の provider ブロックは最小に保ち、環境変数で埋めるのが定石です。環境変数が不備だと初期化時に認証エラーとなるため、CI ではマスク・権限スコープ・期限を合わせて管理します。

  • AWS: AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN, AWS_REGION
  • AzureRM: ARM_CLIENT_ID, ARM_CLIENT_SECRET, ARM_TENANT_ID, ARM_SUBSCRIPTION_ID
  • GCP: GOOGLE_APPLICATION_CREDENTIALS(JSONパス。外部アカウントJSONでWIFにも対応)
  • 長期キーは避け、短期・ローテーションを前提にする

環境変数の例(macOS/Linux)と最小 provider

# AWS(短期セッション例)
export AWS_ACCESS_KEY_ID=AKIA...
export AWS_SECRET_ACCESS_KEY=...
export AWS_SESSION_TOKEN=...
export AWS_REGION=ap-northeast-1

# Azure
export ARM_CLIENT_ID=00000000-....
export ARM_TENANT_ID=11111111-....
export ARM_SUBSCRIPTION_ID=22222222-....
export ARM_CLIENT_SECRET=...   # 可能ならOIDCへ移行

# GCP(ADC)
export GOOGLE_APPLICATION_CREDENTIALS=$HOME/.config/gcloud/application_default_credentials.json
# もしくは外部アカウントJSON(WIF)へのパス

# Terraform 側は最小
provider "aws" { region = "ap-northeast-1" }
provider "azurerm" { features {} }
provider "google" { project = var.project region = var.region }

共有プロファイル/CLI パターン(ローカル最適・学習しやすい)

ローカル開発では共有プロファイルや CLI ログインが実用的です。AWS は ~/.aws/credentials と ~/.aws/config の profile、Azure は az login(デバイスコード/ブラウザ)からのトークン、GCP は gcloud auth application-default login による ADC が定番です。

CI へはそのまま持ち込まず、CI では別途 OIDC/短期資格へ切り替えるのが安全です。試験でも「ローカル=プロファイル、CI=OIDC」の切り分けを選べるかが頻出です。

  • AWS: provider "aws" { profile = "dev" } で共有クレデンシャル参照
  • GCP: ADC は優先的に参照される(GOOGLE_APPLICATION_CREDENTIALS > gcloud ADC > メタデータ)
  • Azure: az login 済みの場合、Managed Identity/CLI 認証がフォールバックになることがある

AWS プロファイルと GCP ADC の例

# ~/.aws/credentials
[dev]
aws_access_key_id=AKIA...
aws_secret_access_key=...

# ~/.aws/config
[profile dev]
region=ap-northeast-1

# Terraform 側
provider "aws" {
  profile = "dev"
  region  = "ap-northeast-1"
}

# GCP(ADC)作成コマンド(ローカル開発)
# gcloud auth application-default login
# → provider "google" は ADC を自動検出

OIDC/フェデレーション(CI/CD本命・長期秘密ゼロ)

CI/CD からの安全な認証は OIDC/フェデレーションが基本です。長期シークレットを持たず、ワークフロー実行時に OIDC トークンを発行し、クラウド側で信頼関係を設定して一時的な権限に昇格します。AWS は sts:AssumeRoleWithWebIdentity、Azure は Entra ID の Federated Identity Credentials、GCP は Workload Identity Federation(external_account JSON)を用います。

Terraform の provider ブロックは最小でよく、多くの場合は環境変数とクラウド側のロール/ID 設定で完結します。トラストポリシーの条件(audience、issuer、sub)不一致やトークン有効期限切れが典型的な失敗要因です。

  • AWS: AWS_ROLE_ARN と AWS_WEB_IDENTITY_TOKEN_FILE(または SDK 自動検出)
  • Azure: Entra ID に Federated Identity を作成し、クライアントID/テナントIDとOIDCトークンで認証
  • GCP: external_account JSON を GOOGLE_APPLICATION_CREDENTIALS で指す(または ADC チェイン)
  • OIDC は最小権限ロール+条件付きトラストが前提

CI からの OIDC フロー(概念)

 [CI/CD Job]
      |
      | 1. 要求 (aud, sub, repo 情報)
      v
 [OIDC Provider] ---- 2. OIDC トークン発行 ---->
      |
      | 3. トークン提示 (Assume / Exchange)
      v
 [Cloud STS/Identity] -- 4. 一時資格発行 --> [Provider SDK]
      |
      v
 [Terraform Apply]

AWS(GitHub Actions OIDC)の最小例

# GitHub Actions の主要部分(概念例)。実運用では公式アクションを推奨。
# permissions: id-token: write が必要

# env はジョブ内でセット(トークンはファイルパスで提供される)
# AWS_ROLE_ARN=arn:aws:iam::123456789012:role/gha-oidc-role
# AWS_WEB_IDENTITY_TOKEN_FILE=/path/to/gha/oidc-token
# AWS_REGION=ap-northeast-1

provider "aws" {
  region = "ap-northeast-1"  # 認証は環境変数で完結
}

CI/CD 設計の実践的な選択基準

セキュリティ(長期秘密の無置換)、権限の最小化、短期資格の自動ローテーション、失敗時の再実行容易性の観点で OIDC/フェデレーションが第一候補です。例外は、対象クラウドや実行環境が OIDC に未対応な場合で、そのときのみ短期キーの環境変数を暫定利用します。

Terraform Cloud/Enterprise を使う場合も、変数は VCS/ワークスペース側で環境変数として安全に注入し、機密は Sensitive フラグを付けます。

  • 原則: CI は OIDC、ローカルは プロファイル/CLI、緊急時のみ短期キー
  • エラー解析は Provider の DEBUG ログ(TF_LOG=DEBUG)でトレース
  • リージョン/プロジェクト/テナントIDの取り違えが定番の初歩ミス
パターンセキュリティ有効期限/回転ローカル適合
環境変数(長期キー)低(漏洩リスク・ローテ弱)固定(人手ローテ)可(簡単)
共有プロファイル/CLI中(端末管理依存)中(CLIリフレッシュ)高(扱いやすい)
OIDC/フェデレーション高(長期秘密ゼロ)短期(自動発行)中(ローカル再現は工夫要)

Terraform Cloud での代表的な環境変数(例)

# ワークスペース変数として設定(Sensitive 指定)
# AWS OIDC の例(実際はVCS側/実行環境が注入)
AWS_ROLE_ARN=arn:aws:iam::123456789012:role/tfc-oidc-role
AWS_WEB_IDENTITY_TOKEN_FILE=/workspace/oidc/token
AWS_REGION=ap-northeast-1

試験対策の要点とトラブルシュート

頻出ポイントは、認証探索順序の理解、環境変数名の正確さ、ローカルとCIの設計切り替え、OIDC の信頼条件(issuer, audience, subject)の一致、そして短期資格の更新です。選択式では「長期シークレットを保存する」選択肢は基本的に誤りです。

実務の初動は、まず provider を最小構成で動かし、DEBUG ログでどのクレデンシャルが選ばれているかを確認することです。次に CI へ移行し、OIDC で同等の挙動になるようクラウド側ロールとトラストを整えます。

  • TF_LOG=DEBUG で SDK の認証探索を確認
  • AWS は sts:AssumeRoleWithWebIdentity のポリシー条件を点検
  • Azure は Entra ID の Federated Identity Credentials を適合するスコープで作成
  • GCP は external_account JSON の audience/subject_token_type を再確認
  • ExpiredToken, AccessDenied, configuration not found は入口の手がかり

AWS 共有プロファイル + AssumeRole(ローカルから昇格)の例

provider "aws" {
  profile = "dev"
  region  = "ap-northeast-1"
  assume_role {
    role_arn     = "arn:aws:iam::123456789012:role/admin"
    session_name = "tf-local-dev"
  }
}

問題で確認

Associate / Pro

問題 1

GitHub Actions から AWS に対して Terraform を実行します。長期アクセスキーは使わず、実行ごとに一時的な認証で最小権限を付与したい。最も適切な構成はどれか?

  1. OIDC を用いて GitHub から sts:AssumeRoleWithWebIdentity を実行し、AWS_ROLE_ARN と AWS_WEB_IDENTITY_TOKEN_FILE を環境変数で渡す
  2. リポジトリの Secrets に AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY を保存し、全ジョブで使い回す
  3. 自開発の認証サーバーから独自トークンを発行し、Terraform に渡す
  4. ローカルで az login 済みの端末から手動で apply する

正解: A

CI/CD で長期秘密を持たずに最小権限の一時資格を得るには OIDC/フェデレーションが推奨です。AWS では AssumeRoleWithWebIdentity を用い、ロール ARN と OIDC トークンファイルを環境変数で指定します。長期キーの保管や手動運用は不適切です。

よくある質問

AzureRM で OIDC を使う場合、どの情報が必要ですか?

Entra ID に Federated Identity Credentials を設定し、ワークロードのクライアントID(アプリ登録)、テナントID、サブスクリプションIDを用意します。CI 側から OIDC トークンを渡し、Provider は環境変数(例: ARM_CLIENT_ID, ARM_TENANT_ID, ARM_SUBSCRIPTION_ID と OIDC トークン)で認証します。詳細は使用中の Provider バージョンのドキュメントに従ってください。

GCP で OIDC(Workload Identity Federation)を Terraform で使うには?

external_account 形式の認証情報 JSON を作成し、そのパスを GOOGLE_APPLICATION_CREDENTIALS に指定します。Terraform の Google Provider は ADC チェインでこの外部アカウントを検出し、必要に応じてサービスアカウントに権限を委任します。

優先順位が原因の認証ミスはどう切り分けますか?

TF_LOG=DEBUG を有効化して実行し、どのクレデンシャルソース(明示設定、環境変数、プロファイル、メタデータ)が選ばれたかを確認します。並行して、環境変数の取り違え(リージョン/プロジェクト/テナントID)、有効期限切れ、トラスト条件の不一致を逐次潰すのが有効です。

この記事で学んだ内容を問題で確認しましょう

16,000問以上の問題で実力チェック

無料で問題を解いてみる
この記事の著者

NicheeLab編集部

データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。


関連記事
Terraform

Terraform HCL 構文の基礎:Block / Attribute / Expression を正しく使い分ける

Terraform Associate で頻出の HCL 構文を、ブロック・属性・式の3視点で整理。実務で迷いがちな書き...

Terraform

Terraform Authoring & Ops Pro: 上位資格の範囲と対策

上位レベルを想定したTerraformの設計・運用ドメインを整理し、実務で通用する対策を提示。モジュール設計、ステート運...

Terraform

Terraform Providers の基本: プラグイン型アーキテクチャを正しく使いこなす

Associate レベルで押さえるべき Provider の基礎、インストール、バージョニング、認証、エイリアス運用を...

Terraform

Terraform Resourceブロック徹底ガイド: 最小単位のリソース定義

Associateレベルで押さえるべきResourceブロックの構造、依存関係、メタ引数、ライフサイクル制御を実務目線で...

Terraform

Terraform Data Source徹底理解:既存リソースの参照で壊さず足す

Terraform Associate向けに、Data Sourceを用いた既存リソース参照の基本、選択基準、評価順序、...

Terraformの記事一覧 (101件)
© 2026 NicheeLab All rights reserved.