Transit Gatewayのクロスアカウント共有は、「A社が建設したバスターミナルを、B社にも使わせてあげる」仕組みとそっくりです。
| 🚌 バスターミナルの世界 | ☁️ AWSの世界 | ポイント |
|---|---|---|
| 🏢 バスターミナル | Transit Gateway (TGW) | ネットワークの中央ハブ |
| 💼 ターミナル所有者(A社) | TGW所有者アカウント | 全権限を持つ管理者 |
| 👥 乗り入れ許可された会社(B社) | 共有先アカウント | 限定的な利用権限のみ |
| 📋 利用許可契約書 | AWS RAM | 共有の仲介サービス |
| 🚌 バスの乗り入れ | VPCアタッチメント作成 | 共有先が実行できる操作 |
| 🕑 運行ダイヤ(時刻表) | ルートテーブル | 所有者のみが管理可能 |
| 🔎 乗降客数モニター | モニタリング・ログ | 共有先は参照のみ |
| 🚫 ターミナルの取り壊し | TGWの削除 | 所有者のみが実行可能 |
# Step 1: TGW所有者(アカウントA)でRAMリソース共有を作成 aws ram create-resource-share \ --name "TGW-CrossAccount-Share" \ --resource-arns "arn:aws:ec2:ap-northeast-1:111111111111:transit-gateway/tgw-0abc123" \ --principals "222222222222" \ --tags key=Environment,value=Production # Step 2: 共有先(アカウントB)で招待を承認 aws ram accept-resource-share-invitation \ --resource-share-invitation-arn "arn:aws:ram:ap-northeast-1:111111111111:resource-share-invitation/xxx" # Step 3: 共有先(アカウントB)でVPCアタッチメントを作成 aws ec2 create-transit-gateway-vpc-attachment \ --transit-gateway-id "tgw-0abc123" \ --vpc-id "vpc-0bbb222" \ --subnet-ids "subnet-0aaa111" "subnet-0bbb222" # Step 4: 所有者(アカウントA)でルートを追加 aws ec2 create-transit-gateway-route \ --destination-cidr-block "10.2.0.0/16" \ --transit-gateway-route-table-id "tgw-rtb-0abc123" \ --transit-gateway-attachment-id "tgw-attach-0bbb222"
# アカウントA側: RAM共有リソース定義 AWSTemplateFormatVersion: '2010-09-09' Resources: TGWResourceShare: Type: AWS::RAM::ResourceShare Properties: Name: "TGW-CrossAccount-Share" ResourceArns: - !Sub "arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:transit-gateway/${TGWId}" Principals: - "222222222222" AllowExternalPrincipals: true # アカウントB側: VPCアタッチメント VPCAttachment: Type: AWS::EC2::TransitGatewayVpcAttachment Properties: TransitGatewayId: "tgw-0abc123" VpcId: !Ref VpcB SubnetIds: - !Ref PrivateSubnet1 - !Ref PrivateSubnet2
# アカウントA側: RAM共有リソース resource "aws_ram_resource_share" "tgw_share" { name = "TGW-CrossAccount-Share" allow_external_principals = true } resource "aws_ram_resource_association" "tgw" { resource_arn = aws_ec2_transit_gateway.main.arn resource_share_arn = aws_ram_resource_share.tgw_share.arn } resource "aws_ram_principal_association" "account_b" { principal = "222222222222" resource_share_arn = aws_ram_resource_share.tgw_share.arn } # アカウントB側: 共有承認 + VPCアタッチメント resource "aws_ram_resource_share_accepter" "accept" { share_arn = "arn:aws:ram:ap-northeast-1:111111111111:resource-share/xxx" } resource "aws_ec2_transit_gateway_vpc_attachment" "vpc_b" { transit_gateway_id = "tgw-0abc123" vpc_id = aws_vpc.vpc_b.id subnet_ids = [aws_subnet.priv1.id, aws_subnet.priv2.id] depends_on = [aws_ram_resource_share_accepter.accept] }
Created by SSuzuki1063
AWS SAP Learning Resources