クロスアカウントVPCピアリングを CloudFormation でやってみた

2022.04.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、森田です。

この記事では、VPCピアリングをクロスアカウントで行う方法を図を使ってまとめてみました。

VPC ピアリング

通常 Amazon VPC では、その内部のみでしか通信を行うことができません。

他の Amazon VPC と通信する方法としていつかの方法がありますが、その1つにVPC ピアリングがあります。(詳しくは以下をご参照ください)

VPC ピアリング接続は、プライベート IPv4 アドレスまたは IPv6 アドレスを使用して 2 つの VPC 間でトラフィックをルーティングすることを可能にするネットワーク接続です。どちらの VPC のインスタンスも、同じネットワーク内に存在しているかのように、相互に通信できます。VPC ピアリング接続は、お客様の VPC 間や、他の AWS アカウントの VPC との間に作成できます。VPC は複数の異なるリージョンに存在できます (これはリージョン間 VPC ピアリング接続とも呼ばれます)。

引用 : https://docs.aws.amazon.com/ja_jp/vpc/latest/peering/what-is-vpc-peering.html

 

別AWSアカウントへ1、 2つのVPCピアリング程度であれば、AWSコンソールから行っても良いですが、
3つ以上VPCピアリングとなると、それぞれの接続で承諾を行う必要があり、非常に面倒となります。

このようなケースでは、CloudFormationを使用することで楽にVPCピアリングを行うことができます。

CloudFormationを使用したVPCピアリング

まず、VPCピアリングの操作を許可するロールの作成を行います。

操作は別のアカウントに対して許可させるために、クロスアカウントアクセスロールを作成します。

入力パラメータでは、別のAWSアカウントIDを指定します。

accept-iam.yml

AWSTemplateFormatVersion: "2010-09-09"
Description: VPC Peering Inviter

Parameters:
  AccountId:
    Type: String
    Description: Peering Account
  

Resources:
  VPCPeeringRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: VPCPeeringRole
      AssumeRolePolicyDocument:
        Statement:
          - Effect: Allow
            Action: sts:AssumeRole
            Principal:
              AWS: !Ref AccountId
      Policies:
        - PolicyName: 'AcceptVpcPeering'
          PolicyDocument:
            Statement:
              - Effect: Allow
                Action: 'ec2:AcceptVpcPeeringConnection'
                Resource: '*'

Outputs:
  RoleARN:
    Value: !GetAtt 
      - VPCPeeringRole
      - Arn

作成したロールのARNと接続を許可するVPC ID、アカウントIDを別アカウントからCFnを実行させる際に必要となります。

続いて、先ほどロールを作成したアカウントと別のアカウントで、VPCピアリングのリクエストと承諾の両方を行います。

下記のCFnの入力パラメータとして、接続先のアカウントID、VPC ID、ロールのARNを指定し、実行します。

requester.yml

AWSTemplateFormatVersion: "2010-09-09"
Description: VPC Peering Inviter

Parameters:
  MyVPCId:
    Type: String
    Description: My VPC ID
  RemoteVPCId:
    Type: String
    Description: VPC ID to Connect
  AccountId:
    Type: String
    Description: Peering Account
  PeerRoleArn:
    Type: String
    Description: Peering IAM ARN

Resources: 
  VPCPeer: 
    Type: AWS::EC2::VPCPeeringConnection
    Properties: 
      VpcId: !Ref MyVPCId
      PeerVpcId: !Ref RemoteVPCId
      PeerOwnerId: !Ref AccountId
      PeerRoleArn: !Ref PeerRoleArn

CFnが正常に実行されると、VPCピアリングが正常に確立されていることが確認できます。

最後に

今回のように、別のアカウントより複数のVPCをピアリングする際には、CloudFormationを使用すると非常に便利です。

一方で、もっとVPCが増える場合は、ネットワークが複雑になり、管理が大変になるので Transit Gateway を利用した方が良いです。

参考