1. 概要
providerブロックのaliasとは- 複数リージョン・複数AWSアカウントへの対応
configuration_aliasesでモジュールに複数プロバイダを渡す- 実際のユースケース
provider aliasを使うと、同じプロバイダを複数の設定で使い分けられます。代表的な例が「東京リージョンと大阪リージョンに同時にリソースを作る」や「本番アカウントとステージングアカウントを1つのTerraformで管理する」です。
2. 複数リージョンの例
terraform {
required_version = ">= 1.9"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
# デフォルトプロバイダ(東京リージョン)
provider "aws" {
region = "ap-northeast-1"
}
# エイリアスプロバイダ(大阪リージョン)
provider "aws" {
alias = "osaka"
region = "ap-northeast-3"
}
variable "environment" {
description = "環境名"
type = string
default = "dev"
}
# 東京リージョンのS3バケット(デフォルトプロバイダ)
resource "aws_s3_bucket" "primary" {
bucket = "${var.environment}-tfpedia-primary"
tags = {
Name = "${var.environment}-primary"
Environment = var.environment
ManagedBy = "terraform"
}
}
# 大阪リージョンのS3バケット(エイリアスプロバイダ)
resource "aws_s3_bucket" "replica" {
provider = aws.osaka # ← エイリアスを指定
bucket = "${var.environment}-tfpedia-replica"
tags = {
Name = "${var.environment}-replica"
Environment = var.environment
ManagedBy = "terraform"
}
}
3. 複数AWSアカウントの例
# メインアカウント(デフォルト)
provider "aws" {
region = "ap-northeast-1"
}
# サブアカウント(assume_roleでスイッチロール)
provider "aws" {
alias = "sub_account"
region = "ap-northeast-1"
assume_role {
role_arn = "arn:aws:iam::123456789012:role/TerraformRole"
}
}
# メインアカウントにVPCを作成
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
tags = {
Name = "${var.environment}-main"
Environment = var.environment
ManagedBy = "terraform"
}
}
# サブアカウントにVPCを作成
resource "aws_vpc" "sub" {
provider = aws.sub_account
cidr_block = "10.1.0.0/16"
tags = {
Name = "${var.environment}-sub"
Environment = var.environment
ManagedBy = "terraform"
}
}
4. モジュールへの複数プロバイダの渡し方
モジュールに複数プロバイダを渡すときは、モジュール側でconfiguration_aliasesを宣言する必要があります。
# modules/multi-region/main.tf(モジュール側)
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
configuration_aliases = [aws.primary, aws.secondary]
}
}
}
variable "environment" {
description = "環境名"
type = string
default = "dev"
}
# 東京リージョン(aws.primary)でSNSトピックを作成
resource "aws_sns_topic" "primary" {
provider = aws.primary
name = "${var.environment}-alerts-primary"
tags = {
Name = "${var.environment}-alerts-primary"
Environment = var.environment
ManagedBy = "terraform"
}
}
# 大阪リージョン(aws.secondary)でSNSトピックを作成
resource "aws_sns_topic" "secondary" {
provider = aws.secondary
name = "${var.environment}-alerts-secondary"
tags = {
Name = "${var.environment}-alerts-secondary"
Environment = var.environment
ManagedBy = "terraform"
}
}
# root main.tf(呼び出し側)
module "multi_region" {
source = "./modules/multi-region"
environment = var.environment
providers = {
aws.primary = aws # デフォルトプロバイダをprimaryに渡す
aws.secondary = aws.osaka # エイリアスプロバイダをsecondaryに渡す
}
}
5. よくある使いどころ
| ユースケース | 設定 |
|---|---|
| DR(災害復旧)の多リージョン構成 | 東京 + 大阪の2リージョン |
| CloudFront + ACM の組み合わせ | ACMはus-east-1必須のため別プロバイダ |
| マルチアカウント管理 | assume_roleで複数アカウントを管理 |
6. 関連記事
- provider ブロックの基本 — provider設定の基礎
- module の呼び出し方 — providers引数の渡し方
- 環境分離のパターン比較 — アカウント分離vs workspace分離
- resourceブロック — 基本構文と使い方
- variable(入力変数)— 定義・型・バリデーション
- for_each — map/setでリソースを動的に作成
7. まとめ
aliasで同じプロバイダを複数の設定で使い分ける(複数リージョン・複数アカウント)- リソースで
provider = aws.osakaのように指定してエイリアスプロバイダを使う - モジュールには
providers = { aws.primary = aws, aws.secondary = aws.osaka }で渡す - モジュール側で
configuration_aliases = [aws.primary, aws.secondary]を宣言する必要がある - CloudFront+ACMの組み合わせ(us-east-1限定)でも必須の知識
動作確認バージョン: Terraform >= 1.9 公式ドキュメント: https://developer.hashicorp.com/terraform/language/providers/configuration#alias-multiple-provider-configurations