Terraformで最も使われるのがAWS Provider。試験でも実務でも、認証の優先順位やassume_role、aliasでのリージョン分割などは確実に押さえたいポイントです。
本稿はHashiCorp公式ドキュメントの挙動に沿いながら、Associateレベルで頻出の論点を最小限のコードと具体例でまとめます。
Terraformではrequired_providersでAWS Providerを明示し、プロジェクト単位でバージョンを固定します。メジャーアップグレードは破壊的変更が入る可能性があるため、~>演算子で安全に追従するのが定石です。
regionはprovider引数、環境変数(AWS_REGION / AWS_DEFAULT_REGION)、共有設定ファイル(~/.aws/config)の順で解決されます。明示的にproviderで指定するとブレません。default_tagsはv5系で安定しており、全リソースに共通タグを付ける運用に有効です(リソース側のtagsが同じキーを持つ場合はリソース側が優先)。
最小構成(バージョン固定と共通タグ)
terraform {
required_version = ">= 1.5.0"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
region = "ap-northeast-1"
default_tags {
tags = {
Project = "nicheelab"
Environment = "dev"
}
}
}AWS ProviderはAWS SDKのデフォルトクレデンシャルチェーンに従って資格情報を解決します。複数の方法を同時に設定した場合、明示的なprovider設定が最優先で、その後に環境変数、共有プロファイル、実行環境ロール(EC2/ECS)の順で評価されます。Web Identity(OIDC)環境変数がある場合は環境変数として優先的に使われます。
試験では「どれが使われるか」の優先順位問題が頻出です。特に、providerにprofileを指定していても、CIで環境変数がセットされていると環境変数が優先される点に注意してください。
| 方法 | 宣言/設定 | 優先度(高→低) | 典型ユースケースと注意 |
|---|---|---|---|
| 明示的な静的クレデンシャル | provider aws { access_key/secret_key/token } | 1 | テスト用途のみ推奨。コードへ秘密情報を残さないこと |
| 環境変数(静的/セッション) | AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY / AWS_SESSION_TOKEN | 2 | CI/CDで一般的。profile指定より優先される |
| 環境変数(Web Identity/OIDC) | AWS_ROLE_ARN / AWS_WEB_IDENTITY_TOKEN_FILE | 2 | EKSのServiceAccount等。assume_roleブロック不要 |
| 共有プロファイル | provider aws { profile = "xxx" } + ~/.aws/{config,credentials} | 3 | 開発者ローカル/SSO運用。credential_processやsource_profileも解決 |
| 実行環境ロール | EC2 Instance Profile / ECS Task Role | 4 | 他が無い場合に自動で使用。最小権限設計を徹底 |
環境変数とプロファイルの例
# 環境変数で認証(推奨: CI/CD)
# export AWS_ACCESS_KEY_ID=AKIA...
# export AWS_SECRET_ACCESS_KEY=...
# export AWS_REGION=ap-northeast-1
provider "aws" {}
# 共有プロファイルで認証(ローカル/SSO)
provider "aws" {
profile = "sandbox"
region = "ap-northeast-1"
}マルチアカウント構成では、ソース資格情報(profileや環境変数)からターゲットアカウントのロールをassume_roleで引き受けるのが定石です。external_idやsession_nameは監査・連携先要件に合わせて設定します。
assume_roleはprovider内のブロックで指定します。チェインが深くなるほどトラブルシュートが難しくなるため、1ホップを基本にし、権限委譲ポリシー(信頼ポリシー)と必要権限の最小化を明確にしておきます。
assume_roleの典型フロー(クロスアカウント)
providerでのassume_role設定
provider "aws" {
profile = "platform" # source資格情報(共有プロファイル)
region = "ap-northeast-1"
assume_role {
role_arn = "arn:aws:iam::222222222222:role/TerraformRole"
session_name = "tf-apply"
external_id = "nicheelab-ci"
duration = "3600s"
}
}
# 以降のリソースは上記ロール経由で作成されるAWSは多くのサービスがリージョン単位です。Terraformではproviderにaliasを付け、リージョンやアカウントごとに明示的に分けると計画の可読性と安全性が上がります。リソースごとにproviderを指定して誤作成を防ぎます。
IAMやRoute53(一部)はグローバル扱いで、リージョン指定の影響を受けにくいリソースもあります。計画と適用の差分に惑わされないよう、ドキュメントで対象リージョン/パーティションを確認しておきましょう。
リージョン別のalias利用例
provider "aws" {
alias = "tokyo"
region = "ap-northeast-1"
profile = "prod"
}
provider "aws" {
alias = "virginia"
region = "us-east-1"
profile = "prod"
}
resource "aws_s3_bucket" "logs_tokyo" {
provider = aws.tokyo
bucket = "nicheelab-logs-apne1"
}
resource "aws_s3_bucket" "logs_virginia" {
provider = aws.virginia
bucket = "nicheelab-logs-use1"
}aws_caller_identityやaws_partitionはアカウントIDやパーティション(aws / aws-cn / aws-us-gov)を動的に取得でき、環境差を埋めるのに有効です。EKSやS3のARNを環境非依存に記述できます。
aws_iam_policy_documentはローカルでJSONポリシーを組み立てるためのデータソースで、API呼び出しを伴いません。差分が明確になり、手書きJSONのミスを防げます。
データソースでIAMポリシーを生成
data "aws_caller_identity" "current" {}
data "aws_partition" "current" {}
data "aws_iam_policy_document" "s3_readonly" {
statement {
actions = ["s3:GetObject", "s3:ListBucket"]
resources = [
"arn:${data.aws_partition.current.partition}:s3:::nicheelab-data",
"arn:${data.aws_partition.current.partition}:s3:::nicheelab-data/*"
]
}
}
resource "aws_iam_policy" "s3_readonly" {
name = "S3ReadOnly"
policy = data.aws_iam_policy_document.s3_readonly.json
}資格情報はコードに書かず、環境変数や共有プロファイル、assume_roleで扱います。Stateはアカウント/リージョンの境界で分離し、aliasで明示的に切り替えます。
依存の再現性を高めるため、Providerのバージョン固定と.terraform.lock.hclの管理は必須です。アップグレードは計画的に行い、破壊的変更ノートを確認してからterraform init -upgradeを実行しましょう。
プロバイダのバージョン固定とロック運用
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.50"
}
}
}
# 初回: terraform init
# アップグレード時: terraform init -upgrade
# .terraform.lock.hcl はVCSで管理するAssociate
問題 1
CI環境でAWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEYが設定されている一方、Terraformのprovider "aws"にはprofile = "sandbox"が指定されています。terraform apply時にどの資格情報が使われますか?
正解: A
AWS Providerは明示的設定 > 環境変数 > 共有プロファイル > 実行環境ロールの順で解決します。今回はproviderに静的クレデンシャルの明示が無く、環境変数が共有プロファイルより優先されるため、環境変数が使用されます。
default_tagsとリソースtagsが競合した場合、どちらが優先されますか?個別リソースだけdefault_tagsを外せますか?
同一キーがある場合はリソース側のtagsが優先されます。特定リソースだけdefault_tagsを“外す”明示的なスイッチはありません。どうしても除外したい場合は、例外用の別provider(別alias)を用意してdefault_tagsを持たない設定に分けるのが確実です。
AWS SSOをTerraformで使うには?
AWS CLI v2でプロファイルにSSO設定(~/.aws/config)を行い、aws sso loginで認証済みにします。Terraform側はprovider aws { profile = "your-sso-profile" }とするだけで、共有設定からSSO資格情報が解決されます。
regionの決定順序は?provider.regionとAWS_REGIONが両方あるときは?
regionはprovider引数 > 環境変数(AWS_REGION/AWS_DEFAULT_REGION) > 共有設定ファイルの順に解決されます。両方ある場合はprovider.regionが優先されます。
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を用いた既存リソース参照の基本、選択基準、評価順序、...