クロスアカウントのVPCピアリングをCloudFormationで作成してみる

AWS 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を入力します。

01-requester-peering

作成はすぐに終わります。リクエスタ側に対するクロスアカウント用のIAM Roleが作成されています。

02-crossrole

「10.1.0.0/16」のVPCも作成されています。

03-reqvpc

リクエスター側でやること

次にリクエスター側でCloudFormaionを使って環境を作ります。パラメーターはそれぞれ下記のように指定します。

  • PeerRoleArn
    • 先程作成したアクセプター側のIAM RoleのARNを指定します。
  • PeerVPCAccountId
    • アクセプター側のAWSアカウントIDを指定します。
  • PeerVPCId
    • 先程作成したアクセプター側のVPC IDを指定します。

04-requestercfn

これでStackの作成が無事終了すると、VPCピアリングの接続が出来ています。

05-pcx

リクエスター側に「10.2.0.0/16」のVPCも出来ていますね。

06-requestervpc

プロパティ

これだけでは少し物足りないので、もう少し調べてみます。
今回のアップデートでは「VPCPeeringConnection」に2つのプロパティが追加されています。

プロバティ 意味
PeerVpcId 以前からあるプロパティ。アクセプター側のVPC ID
Tags 以前からあるプロパティ。リソースに対するタグ
VpcId 以前からあるプロパティ。リクエスター側のVPC ID
PeerOwnerId 新規追加。アクセプター側のAWSアカウントID
PeerRoleArn 新規追加。アクセプター側のピアリング用ロールのARN

最後に

VPCピアリングの設定自体は、手作業で行っても大したボリュームにはなりませんが、アクセプター、リクエスターのそれぞれでCloudFormation対応できるので、VPCピアリングをコード化できるようになりました。
機会があれば、是非ご利用下さい。

以上です。

AWS Cloud Roadshow 2017 福岡