provider alias — 複数リージョン・複数アカウントの構成

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. 関連記事


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