👏

Terraformで実現するマルチアカウント・マルチクラウド環境の柔軟なリソース配置

に公開

はじめに

インフラを構築・運用していると、複数のクラウドやアカウントにまたがる構成に直面することってありますよね。たとえば、AWSとGoogle Cloudを組み合わせて使いたいとか、別々のアカウントにリソースを分けて管理したいといったケースです。

そんな構成をIaCを管理する場合 Terraform がおすすめです。
宣言的なコードを書くだけで、異なるクラウドや複数アカウントにまたがるインフラも一貫して管理できます。

この記事では、Terraformの「プロバイダ設定」を活用して、マルチクラウド・マルチアカウント構成をスマートに構築・運用する方法を紹介します。

Terraformのプロバイダ設定

Terraformで異なるアカウントやクラウドプロバイダを利用するためには、プロバイダ設定を行います。プロバイダ設定は、Terraformがどのクラウドサービスに対してリソースを作成・管理するかを定義します。

以下に、AWSとGoogle Cloudを利用したプロバイダ設定のサンプルコードを示します。この設定によって、複数のAWSアカウントや、異なるクラウド(Google Cloud)間でリソースを管理できるようになります。

パターン①:AWSアカウント内でリージョンを分けて使う場合

同じアカウント内で、リージョンごとにリソースを分けて管理したいときの例です。エイリアスを使って、どのリソースがどのリージョンかを明示できます。

pattern1.tf
# us-west-2 リージョン
provider "aws" {
  region = "us-west-2"
}

# us-east-1 リージョン
provider "aws" {
  alias  = "virginia"
  region = "us-east-1"
}

# S3バケット(us-west-2)
resource "aws_s3_bucket" "main" {
  bucket = "my-app-bucket"
}

# ACM証明書(us-east-1 / CloudFront用など)
resource "aws_acm_certificate" "cert" {
  provider = aws.virginia
  domain_name = "example.com"
  validation_method = "DNS"
}

パターン②:AWSの複数アカウントを使い分ける場合

異なるアカウントにあるリソース(たとえば、DNSとアプリリソース)をまとめて管理するケースです。alias と profile を併用してアカウントを切り替えます。

pattern2.tf
# DNS管理用アカウント
provider "aws" {
  alias   = "account_route53"
  region  = "us-east-1"
  profile = "route53"
}

# アプリ用アカウント
provider "aws" {
  alias   = "account_resource"
  region  = "us-east-1"
  profile = "resource"
}

# Route53レコード(DNSアカウント側)
resource "aws_route53_record" "example" {
  provider = aws.account_route53
  zone_id  = "Z123456ABCDEFG"
  name     = "app.example.com"
  type     = "A"
  ttl      = 300
  records  = ["203.0.113.10"]
}

# EC2インスタンス(アプリアカウント側)
resource "aws_instance" "web" {
  provider = aws.account_resource
  ami           = "ami-0abcdef1234567890"
  instance_type = "t3.micro"
}
~/.aws/credentials
[route53]
aws_access_key_id = xxxxxxxxxxxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

[resource]
aws_access_key_id = xxxxxxxxxxxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

パターン③:AWSとGoogle Cloudのマルチクラウド構成

AWSとGoogle Cloudのリソースを組み合わせて使いたい場合の設定例です。

pattern3.tf
# AWSプロバイダ
provider "aws" {
  region = "us-west-2"
}

# GCPプロバイダ
provider "google" {
  credentials = file("/home/user/credentials.json")
  project     = "your-project-id"
  region      = "us-central1"
}

# AWS S3バケット
resource "aws_s3_bucket" "aws_bucket" {
  bucket = "my-crosscloud-bucket"
}

# GCP Cloud Storageバケット
resource "google_storage_bucket" "gcp_bucket" {
  name     = "my-crosscloud-bucket-gcp"
  location = "US"
}

プロバイダ設定の解説

AWSのプロバイダ設定

AWSリソースをTerraformで管理するには、provider "aws" を使います。
基本的にはリージョンを指定するだけでOKですが、複数アカウントや複数リージョンを扱う場合は、以下のような追加設定が必要です。

  • alias:複数のAWSプロバイダ設定を使い分けるためのラベルです。たとえば、アカウントごとや用途ごとに明確に区別できます。

  • profile:~/.aws/credentials に定義されたCLIプロファイルを使って、異なる認証情報を指定できます。

これにより、1つのTerraform構成ファイルで、複数のAWSアカウントやリージョンをまたいだ管理が可能になります。

Google Cloudのプロバイダ設定

Google Cloudのリソースを扱うには、provider "google" を使います。
こちらは以下の項目を設定するだけで使えます。

  • credentials:Google Cloudのサービスアカウントキー(JSONファイル)のパスを指定します。

  • project:操作対象となるGoogle CloudプロジェクトID。

  • region:リソースを作成するリージョン。

まとめ

全リソースをIaCで管理しようとした場合、ひとつのアカウント、リージョンで収まる例は少ないかと思います。また、一部リソースのみ別のパブリッククラウドにある例も増えてきている肌感があります。

例えばAWSのCloudFormationを使用している場合はリソースの一元管理ができなかったり複雑になったりします。
これから1からIaCを構築する場合は本記事の観点も参考に選定していただければと思います。

We're Hiring!

DELTAではチームの一員になっていただける仲間を募集中です!
下記フォームよりお気軽にご連絡ください!

https://docs.google.com/forms/d/e/1FAIpQLSfQuWNU1il5lq2rVdICM0tSK_jTsjqwc52LYEwUxBq7_ImtrQ/viewform

DELTAテックブログ

Discussion