はじめに
Terraform の Multiple Provider Configurations は
「同一プロバイダー上で複数の設定を指定できる機能」です。
alias
を付けることで実現できます。
以下に示す 公式ドキュメント の例では、 AWSプロバイダーにおいて
「us-east-1 リージョンの設定(デフォルト)」 と
「us-west-2リージョンの設定( aws.west
)」 の2設定を作っています。
# The default provider configuration; resources that begin with `aws_` will use
# it as the default, and it can be referenced as `aws`.
provider "aws" {
region = "us-east-1"
}
# Additional provider configuration for west coast region; resources can
# reference this as `aws.west`.
provider "aws" {
alias = "west"
region = "us-west-2"
}
今回は、この機能を使った「 AWSのクロスアカウント環境構築 」例を紹介します。 アーキテクチャによっては、複数アカウントで「設定の行き来」が発生するものがあります。 そういったケースで、 Multiple Provider Configurations は役に立ちます。 便利です。
事前準備
今回は下図のような構築を試してみます。
- AWSアカウント(
111111111111
) の IAMユーザー認証情報を使ってterraform
コマンドを実行 - AWSアカウント(
222222222222
) の IAMロールへスイッチして、リソース構築できるようにする - 同様に、AWSアカウント(
333333333333
) の IAMロールへスイッチして、リソース構築できるようにする
IAMユーザーの準備部分は割愛します。
リソース構築用の IAMロールを事前に作成しておきます。 今回のケースだと、以下のような CloudFormationテンプレートから作成できます。
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
Principals:
Type: CommaDelimitedList
Default: "arn:aws:iam::111111111111:user/cm-kawahara.masahiro"
Resources:
Role:
Type: AWS::IAM::Role
Properties:
RoleName: "terraform-infra-deploy-role"
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
AWS: !Ref Principals
Action:
- sts:AssumeRole
Description: "This role is used for infra deploy via Terraform"
ManagedPolicyArns:
- "arn:aws:iam::aws:policy/AdministratorAccess"
プロバイダー設定
以下のような provider.tf
を作成します。
provider.tf
provider "aws" {
alias = "account2222"
region = "ap-northeast-1"
assume_role {
role_arn = "arn:aws:iam::222222222222:role/terraform-infra-deploy-role"
session_name = "terraform"
}
}
provider "aws" {
alias = "account3333"
region = "ap-northeast-1"
assume_role {
role_arn = "arn:aws:iam::333333333333:role/terraform-infra-deploy-role"
session_name = "terraform"
}
}
それぞれのAWSプロバイダーに alias
( account2222
、 account3333
) を付与しています。
role_arn
にスイッチロール先のARNを記載します。
これで最低限のクロスアカウント環境構築の準備は完了です。
リソースを作成する際には provider
値を指定します。
クロスアカウントの環境構築例
(例その1) AWS Transit Gatewayのクロスアカウント環境
Transit Gateway(TGW)のクロスアカウント環境を考えます。 他アカウントのVPC上にアタッチメントを作成して ネットワークを構成するには、以下の手順を踏む必要があります。
- TGWを作成して Resource Access Manager(RAM)で他アカウントに共有する
- 共有先アカウントにて VPCアタッチメントを作成する
- 「VPCアタッチメントのリクエスト」を承諾する (自動承諾の場合は不要)
これを Multiple Provider Configurations で構成する場合は以下のようなコードになります。 (リソースの設定値は適当です)
resource aws_vpc account3333 {
provider = aws.account3333
cidr_block = "10.33.0.0/16"
}
resource aws_subnet account3333 {
provider = aws.account3333
vpc_id = aws_vpc.account3333.id
cidr_block = "10.33.0.0/24"
}
##### 1. TGWを作成して Resource Access Manager(RAM)で他アカウントに共有する
# Transit Gateway
resource aws_ec2_transit_gateway this {
provider = aws.account2222
auto_accept_shared_attachments = "enable"
default_route_table_association = "disable"
default_route_table_propagation = "enable"
}
# Resouece Access Manager
resource aws_ram_resource_share this {
provider = aws.account2222
name = "tgw-share"
allow_external_principals = false
}
resource aws_ram_resource_association this {
provider = aws.account2222
resource_arn = aws_ec2_transit_gateway.this.arn
resource_share_arn = aws_ram_resource_share.this.arn
}
resource aws_ram_principal_association this {
provider = aws.account2222
principal = arn:aws:organizations::999999999999:ou/o-example/ou-example
resource_share_arn = aws_ram_resource_share.this.arn
}
##### 2. 共有先アカウントにて VPCアタッチメントを作成する
# TGW/VPC Attachment
resource aws_ec2_transit_gateway_vpc_attachment account3333 {
provider = aws.account3333
depends_on = [ aws_ram_principal_association.this ]
transit_gateway_id = aws_ec2_transit_gateway.this.id
vpc_id = aws_vpc.account3333.id
subnet_ids = [ aws_subnet.account3333.id ]
transit_gateway_default_route_table_propagation = true
transit_gateway_default_route_table_association = false
}
##### 3. 「VPCアタッチメントのリクエスト」を承諾する (自動承諾の場合は不要)
# TGW/VPC Attachment Accepter
resource aws_ec2_transit_gateway_vpc_attachment_accepter account3333 {
provider = aws.account2222
transit_gateway_attachment_id = aws_ec2_transit_gateway_vpc_attachment.account3333.id
}
(例その2) Route53プライベートホストゾーンのクロスアカウント関連付け
Route53プライベートホストゾーンを他アカウントに関連付けるためには、 以下の手順を踏む必要があります。
- プライベートホストゾーン(PHZ)の作成
- 共有アカウントに対して、PHZの「関連付け承認」を作成する
- 共有アカウントにて PHZの「関連付け」を作成する
これを Multiple Provider Configurations で構成する場合は以下のようなコードになります。 (リソースの設定値は適当です)
resource aws_vpc account2222 {
provider = aws.account2222
cidr_block = "10.22.0.0/16"
}
resource aws_vpc account3333 {
provider = aws.account3333
cidr_block = "10.33.0.0/16"
}
##### 1. プライベートホストゾーン(PHZ)の作成
# Route53 Alias Record
resource aws_route53_zone this {
provider = aws.account2222
name = "example.com"
vpc {
vpc_id = aws_vpc.account2222.id
}
}
##### 2. 共有アカウントに対して、PHZの「関連付け承認」を作成する
resource aws_route53_vpc_association_authorization account3333 {
provider = aws.account2222
zone_id = aws_route53_zone.this.zone_id
vpc_id = aws_vpc.account3333.id
}
##### 3. 共有アカウントにて PHZの「関連付け」を作成する
resource aws_route53_zone_association account3333 {
provider = aws.account3333
vpc_id = aws_route53_vpc_association_authorization.account3333.vpc_id
zone_id = aws_route53_vpc_association_authorization.account3333.zone_id
}
おわりに
Terraformの Multiple Provider Configurationsの活用例でした。 AWSマルチアカウントの環境構築で複数アカウントまたいだアーキテクチャを構築する際は、 この機能は便利です。おすすめです。