クロスアカウントのVPCピアリングをCloudFormationで作成してみる
こんにちわ。大阪の市田です。 先日、CloudFormationのアップデートがあり、新たにクロスアカウントのVPCピアリング作成がサポートされました。
下記でウォークスルーが公開されていますので、今回はこちらの内容を元に試してみたいと思います。
Walkthrough: Peer with an Amazon VPC in Another AWS Account
手順
事前にピアリングをリクエストするリクエスターと、リクエストを受けるアクセプターのAWSアカウントを用意しておきましょう。 ウォークスルーではCloudFormationのサンプルが記載されています。その内容は以下の通りです。
1つ目のCloudFormationをアクセプター側で実行すると、下記のリソースが作成されます。
- 10.1.0.0/16のVPC
- クロスアカウント用のIAMロール
テンプレートではアクセプター側のIAM Roleに「ec2:AcceptVpcPeeringConnection」の許可が入っているのが分かります。 下記はウォークスルーのページに記載されているサンプルのテンプレートです。
{ "AWSTemplateFormatVersion": "2010-09-09", "Description": "Create a VPC and an assumable role for cross account VPC peering.", "Parameters": { "PeerRequesterAccountId": { "Type": "String" } }, "Resources": { "vpc": { "Type": "AWS::EC2::VPC", "Properties": { "CidrBlock": "10.1.0.0/16", "EnableDnsSupport": false, "EnableDnsHostnames": false, "InstanceTenancy": "default" } }, "peerRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Statement": [ { "Principal": { "AWS": { "Ref": "PeerRequesterAccountId" } }, "Action": [ "sts:AssumeRole" ], "Effect": "Allow" } ] }, "Path": "/", "Policies": [ { "PolicyName": "root", "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ec2:AcceptVpcPeeringConnection", "Resource": "*" } ] } } ] } } }, "Outputs": { "VPCId": { "Value": { "Ref": "vpc" } }, "RoleARN": { "Value": { "Fn::GetAtt": [ "peerRole", "Arn" ] } } } }
2つ目のCloudFormationでは、リクエスター側で下記のリソースが作成されます
- 10.2.0.0/16のVPC
- アクセプター側へのVPCピアリングリクエストとその承認
こちらも先程のページにあるサンプルテンプレートです。
{ "AWSTemplateFormatVersion": "2010-09-09", "Description": "Create a VPC and a VPC Peering connection using the PeerRole to accept.", "Parameters": { "PeerVPCAccountId": { "Type": "String" }, "PeerVPCId": { "Type": "String" }, "PeerRoleArn": { "Type": "String" } }, "Resources": { "vpc": { "Type": "AWS::EC2::VPC", "Properties": { "CidrBlock": "10.2.0.0/16", "EnableDnsSupport": false, "EnableDnsHostnames": false, "InstanceTenancy": "default" } }, "vpcPeeringConnection": { "Type": "AWS::EC2::VPCPeeringConnection", "Properties": { "VpcId": { "Ref": "vpc" }, "PeerVpcId": { "Ref": "PeerVPCId" }, "PeerOwnerId": { "Ref": "PeerVPCAccountId" }, "PeerRoleArn": { "Ref": "PeerRoleArn" } } } }, "Outputs": { "VPCId": { "Value": { "Ref": "vpc" } }, "VPCPeeringConnectionId": { "Value": { "Ref": "vpcPeeringConnection" } } } }
やってみた
それでは早速やってみます。
アクセプター側でやること
まず、アクセプター側のCloudFormationを実行します。パラメータの「PeerRequesterAccountId」 はリクエスト側のAWSアカウントIDを入力します。
作成はすぐに終わります。リクエスタ側に対するクロスアカウント用のIAM Roleが作成されています。
「10.1.0.0/16」のVPCも作成されています。
リクエスター側でやること
次にリクエスター側でCloudFormaionを使って環境を作ります。パラメーターはそれぞれ下記のように指定します。
- PeerRoleArn
- 先程作成したアクセプター側のIAM RoleのARNを指定します。
- PeerVPCAccountId
- アクセプター側のAWSアカウントIDを指定します。
- PeerVPCId
- 先程作成したアクセプター側のVPC IDを指定します。
これでStackの作成が無事終了すると、VPCピアリングの接続が出来ています。
リクエスター側に「10.2.0.0/16」のVPCも出来ていますね。
プロパティ
これだけでは少し物足りないので、もう少し調べてみます。 今回のアップデートでは「VPCPeeringConnection」に2つのプロパティが追加されています。
プロバティ | 意味 |
---|---|
PeerVpcId | 以前からあるプロパティ。アクセプター側のVPC ID |
Tags | 以前からあるプロパティ。リソースに対するタグ |
VpcId | 以前からあるプロパティ。リクエスター側のVPC ID |
PeerOwnerId | 新規追加。アクセプター側のAWSアカウントID |
PeerRoleArn | 新規追加。アクセプター側のピアリング用ロールのARN |
最後に
VPCピアリングの設定自体は、手作業で行っても大したボリュームにはなりませんが、アクセプター、リクエスターのそれぞれでCloudFormation対応できるので、VPCピアリングをコード化できるようになりました。 機会があれば、是非ご利用下さい。
以上です。