Transit Gateway の基礎的説明用環境テンプレートと通信不可問題の提供

最近、Transit Gateway について質問される場面が多々ありました。

Transit Gateway を利用すれば、複数の VPC間通信が可能になります。DirectConnect や VPN との通信も可能なため、オンプレミスと AWS 環境を接続するハイブリッドネットワーク構成でも利用されます。

説明する際には環境を見てもらった方が説明しやすい場面もあり、必要なときには Transit Gateway の実際の環境設定を見てもらいます。ただし、実際に設定するのは手間がかかるので、CloudFormation デプロイ可能な説明環境用テンプレートを準備しました。

この記事のターゲットは以下の方になります。

| 項 | 対象者 |
|:-----------|:-----------|
|1|他の人に Transit Gateway の基礎を説明したいので、説明するための環境をさくっと準備したい。|
|2|自分が Transit Gateway の基礎を理解したいので、確認できる環境をさくっと準備したい。|
|3|この環境で提供される通信不可問題（3問）を確認してみたい。|

3つ目の通信不可問題（3問）というのは実際に意識しておいたほうが良い設定箇所を3つピックアップして問題にしています。この対応を確認することで、Transit Gateway への理解が深まります。

この記事のターゲットに該当する方は、続きをお読みください。


## 1. 基礎的説明用テンプレート

### 1.1. 構成概要
基礎的説明用環境テンプレートの構成は以下の通りです。
Transit Gateway で3つの VPC が接続されている構成が作成されます。

<img width="800" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/4529cdaf-7a8f-4788-a57b-a2917ffa1a56.png">

特徴は以下の通りです。

| 項 | 特徴 |
|:-----------|:-----------|
|1|CloudFormation で利用することが前提のテンプレートです。|
|2|3つの VPC があり、その中に複数の EC2 が存在しています。|
|3|VPC は Transit Gateway を経由して接続されています。ただし、疎通が可能なのは VPC1 の EC2インスタンス「VPC1-AZ11-EC2」と VPC2 の EC2インスタンス「VPC2-AZ11-EC2」のみです。正常な設定の確認はその EC2間で実施できます。|
|4|それ以外の EC2インスタンス間が通信できない原因は「通信不可問題」として原因を確認することができます。|
|5|EC2 で許可されている通信は ICMP のみです。なお、各 EC2インスタンスのセキュリティグループとネットワークACL は適切に設定されており、「通信不可問題」の原因ではありません。
|6|EC2インスタンスは Linux です。OS には AWSマネジメントコンソール上から Systems Manager Session Manager を利用して接続します。|
|7|Transit Gateway のルートテーブルはデフォルトルートテーブルを使用していません。カスタムルートテーブルで個別に設定しています。また、ルートは静的ルートで設定されています。|


なお、「通信不可問題」に関しては、以下の通りです。基本的に VPC2 にある EC2インスタンス「VPC2-AZ11-EC2」から他の EC2インスタンスに Ping を実施して疎通確認を実施します。現状は、VPC1 の EC2インスタンス「VPC1-AZ11-EC2」としか疎通できない状況です。

<img width="800" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/e1e51e10-5c5e-42e6-a757-2790ed1a043d.png">

### 1.2. テンプレート
基礎的説明用環境テンプレートは以下の通りです。
<details><summary>テンプレート</summary>

```YAML:CloudFormation用 YAML
AWSTemplateFormatVersion: "2010-09-09"

Resources:

  # VPC1 (10.1.0.0/16)
  VPC1:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: "10.1.0.0/16"
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: VPC1

  # VPC2 (10.2.0.0/16)
  VPC2:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: "10.2.0.0/16"
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: VPC2

  # VPC3 (10.3.0.0/16)
  VPC3:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: "10.3.0.0/16"
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: VPC3

  # VPC1 のプライベートサブネット (EC2 用) AZ1-1
  VPC1AZ11SubnetEC2:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC1
      CidrBlock: "10.1.1.0/24"
      AvailabilityZone: !Select 
        - 0
        - !GetAZs ""
      Tags:
        - Key: Name
          Value: VPC1-AZ1-1-EC2-Subnet

  # VPC1 のプライベートサブネット (EC2 用) AZ1-2
  VPC1AZ12SubnetEC2:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC1
      CidrBlock: "10.1.11.0/24"
      AvailabilityZone: !Select 
        - 0
        - !GetAZs ""
      Tags:
        - Key: Name
          Value: VPC1-AZ1-2-EC2-Subnet

  # VPC1 のプライベートサブネット (EC2 用) AZ2-1
  VPC1AZ21SubnetEC2:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC1
      CidrBlock: "10.1.21.0/24"
      AvailabilityZone: !Select 
        - 1
        - !GetAZs ""
      Tags:
        - Key: Name
          Value: VPC1-AZ2-1-EC2-Subnet

  # VPC1 のプライベートサブネット (TransitGateway 用) AZ1-1
  VPC1AZ11SubnetTGW:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC1
      CidrBlock: "10.1.2.0/28"
      AvailabilityZone: !Select 
        - 0
        - !GetAZs ""
      Tags:
        - Key: Name
          Value: VPC1-AZ1-1-TGW-Subnet

  # VPC1 のプライベートサブネット (TransitGateway 用) AZ2-1
  VPC1AZ21SubnetTGW:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC1
      CidrBlock: "10.1.22.0/28"
      AvailabilityZone: !Select 
        - 1
        - !GetAZs ""
      Tags:
        - Key: Name
          Value: VPC1-AZ2-1-TGW-Subnet

  # VPC1 のプライベートサブネット (TransitGateway 用) の NACL
  VPC1TGWNACL:
    Type: AWS::EC2::NetworkAcl
    Properties:
      VpcId: !Ref VPC1
      Tags:
        - Key: Name
          Value: VPC1-TGW-Subnet-NACL

  VPC1TGWNACLInbound:
    Type: AWS::EC2::NetworkAclEntry
    Properties:
      NetworkAclId: !Ref VPC1TGWNACL
      RuleNumber: 100
      Protocol: -1
      RuleAction: allow
      Egress: false
      CidrBlock: 0.0.0.0/0

  VPC1TGWNACLOutbound:
    Type: AWS::EC2::NetworkAclEntry
    Properties:
      NetworkAclId: !Ref VPC1TGWNACL
      RuleNumber: 100
      Protocol: -1
      RuleAction: allow
      Egress: true
      CidrBlock: 0.0.0.0/0

  VPC1AZ11TGWNACLAssociation:
    Type: AWS::EC2::SubnetNetworkAclAssociation
    Properties:
      SubnetId: !Ref VPC1AZ11SubnetTGW
      NetworkAclId: !Ref VPC1TGWNACL

  VPC1AZ21TGWNACLAssociation:
    Type: AWS::EC2::SubnetNetworkAclAssociation
    Properties:
      SubnetId: !Ref VPC1AZ21SubnetTGW
      NetworkAclId: !Ref VPC1TGWNACL


  # VPC2 のプライベートサブネット (EC2 用) AZ1
  VPC2AZ11SubnetEC2:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC2
      CidrBlock: "10.2.1.0/24"
      AvailabilityZone: !Select 
        - 0
        - !GetAZs ""
      Tags:
        - Key: Name
          Value: VPC2-AZ1-1-EC2-Subnet

  # VPC2 のプライベートサブネット (TransitGateway 用) AZ1
  VPC2AZ11SubnetTGW:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC2
      CidrBlock: "10.2.2.0/28"
      AvailabilityZone: !Select 
        - 0
        - !GetAZs ""
      Tags:
        - Key: Name
          Value: VPC2-AZ1-1-TGW-Subnet

  # VPC2 のプライベートサブネット (TransitGateway 用) の NACL
  VPC2TGWNACL:
    Type: AWS::EC2::NetworkAcl
    Properties:
      VpcId: !Ref VPC2
      Tags:
        - Key: Name
          Value: VPC2-TGW-Subnet-NACL

  VPC2TGWNACLInbound:
    Type: AWS::EC2::NetworkAclEntry
    Properties:
      NetworkAclId: !Ref VPC2TGWNACL
      RuleNumber: 100
      Protocol: -1
      RuleAction: allow
      Egress: false
      CidrBlock: 0.0.0.0/0

  VPC2TGWNACLOutbound:
    Type: AWS::EC2::NetworkAclEntry
    Properties:
      NetworkAclId: !Ref VPC2TGWNACL
      RuleNumber: 100
      Protocol: -1
      RuleAction: allow
      Egress: true
      CidrBlock: 0.0.0.0/0

  VPC2AZ11TGWNACLAssociation:
    Type: AWS::EC2::SubnetNetworkAclAssociation
    Properties:
      SubnetId: !Ref VPC2AZ11SubnetTGW
      NetworkAclId: !Ref VPC2TGWNACL

  # VPC3 のプライベートサブネット (EC2 用) AZ1
  VPC3AZ11SubnetEC2:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC3
      CidrBlock: "10.3.1.0/24"
      AvailabilityZone: !Select 
        - 0
        - !GetAZs ""
      Tags:
        - Key: Name
          Value: VPC3-AZ1-1-EC2-Subnet

  # VPC3 のプライベートサブネット (TransitGateway 用) AZ1
  VPC3AZ11SubnetTGW:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC3
      CidrBlock: "10.3.2.0/28"
      AvailabilityZone: !Select 
        - 0
        - !GetAZs ""
      Tags:
        - Key: Name
          Value: VPC3-AZ1-1-TGW-Subnet

  # VPC3 のプライベートサブネット (TransitGateway 用) の NACL
  VPC3TGWNACL:
    Type: AWS::EC2::NetworkAcl
    Properties:
      VpcId: !Ref VPC3
      Tags:
        - Key: Name
          Value: VPC3-TGW-Subnet-NACL

  VPC3TGWNACLInbound:
    Type: AWS::EC2::NetworkAclEntry
    Properties:
      NetworkAclId: !Ref VPC3TGWNACL
      RuleNumber: 100
      Protocol: -1
      RuleAction: allow
      Egress: false
      CidrBlock: 0.0.0.0/0

  VPC3TGWNACLOutbound:
    Type: AWS::EC2::NetworkAclEntry
    Properties:
      NetworkAclId: !Ref VPC3TGWNACL
      RuleNumber: 100
      Protocol: -1
      RuleAction: allow
      Egress: true
      CidrBlock: 0.0.0.0/0

  VPC3AZ11TGWNACLAssociation:
    Type: AWS::EC2::SubnetNetworkAclAssociation
    Properties:
      SubnetId: !Ref VPC3AZ11SubnetTGW
      NetworkAclId: !Ref VPC3TGWNACL

  # Transit Gateway の作成
  TransitGateway:
    Type: AWS::EC2::TransitGateway
    Properties:
      AmazonSideAsn: 64512
      DefaultRouteTableAssociation: "disable"
      DefaultRouteTablePropagation: "disable"
      AutoAcceptSharedAttachments: "enable"
      Tags:
        - Key: Name
          Value: TransitGateway


  # VPC1 の Transit Gateway アタッチメント
  VPC1TGWAttachment:
    Type: AWS::EC2::TransitGatewayVpcAttachment
    Properties:
      TransitGatewayId: !Ref TransitGateway
      VpcId: !Ref VPC1
      SubnetIds: [!Ref VPC1AZ11SubnetTGW]
      Tags:
        - Key: Name
          Value: VPC1-Attachment

  # VPC2 の Transit Gateway アタッチメント
  VPC2TGWAttachment:
    Type: AWS::EC2::TransitGatewayVpcAttachment
    Properties:
      TransitGatewayId: !Ref TransitGateway
      VpcId: !Ref VPC2
      SubnetIds: [!Ref VPC2AZ11SubnetTGW]
      Tags:
        - Key: Name
          Value: VPC2-Attachment

  # VPC3 の Transit Gateway アタッチメント
  VPC3TGWAttachment:
    Type: AWS::EC2::TransitGatewayVpcAttachment
    Properties:
      TransitGatewayId: !Ref TransitGateway
      VpcId: !Ref VPC3
      SubnetIds: [!Ref VPC3AZ11SubnetTGW]
      Tags:
        - Key: Name
          Value: VPC3-Attachment

  # VPC1 の Transit Gateway ルートテーブル
  VPC1TGWRouteTable:
    Type: AWS::EC2::TransitGatewayRouteTable
    Properties:
      TransitGatewayId: !Ref TransitGateway
      Tags:
        - Key: Name
          Value: VPC1-TGWRouteTable

  # VPC1 の Transit Gateway ルートテーブルの関連付け
  VPC1TGWAssociation:
    Type: AWS::EC2::TransitGatewayRouteTableAssociation
    Properties:
      TransitGatewayRouteTableId: !Ref VPC1TGWRouteTable
      TransitGatewayAttachmentId: !Ref VPC1TGWAttachment

  # VPC1 Transit Gateway ルートテーブル 静的ルートの作成 (VPC1 → VPC2)
  VPC1TGWStaticRoute:
    Type: AWS::EC2::TransitGatewayRoute
    Properties:
      TransitGatewayRouteTableId: !Ref VPC1TGWRouteTable
      DestinationCidrBlock: "10.2.0.0/16"
      TransitGatewayAttachmentId: !Ref VPC2TGWAttachment

  # VPC2 の Transit Gateway ルートテーブル
  VPC2TGWRouteTable:
    Type: AWS::EC2::TransitGatewayRouteTable
    Properties:
      TransitGatewayId: !Ref TransitGateway
      Tags:
        - Key: Name
          Value: VPC2-TGWRouteTable

  # VPC2 の Transit Gateway ルートテーブルの関連付け
  VPC2TGWAssociation:
    Type: AWS::EC2::TransitGatewayRouteTableAssociation
    Properties:
      TransitGatewayRouteTableId: !Ref VPC2TGWRouteTable
      TransitGatewayAttachmentId: !Ref VPC2TGWAttachment

  # VPC2 の Transit Gateway ルートテーブル 静的ルートの作成 (VPC2 → VPC1)
  VPC2TGWStaticRoute:
    Type: AWS::EC2::TransitGatewayRoute
    Properties:
      TransitGatewayRouteTableId: !Ref VPC2TGWRouteTable
      DestinationCidrBlock: "10.1.0.0/16"
      TransitGatewayAttachmentId: !Ref VPC1TGWAttachment

  # VPC3 の Transit Gateway ルートテーブル
  VPC3TGWRouteTable:
    Type: AWS::EC2::TransitGatewayRouteTable
    Properties:
      TransitGatewayId: !Ref TransitGateway
      Tags:
        - Key: Name
          Value: VPC3-TGWRouteTable

  # VPC3 の Transit Gateway ルートテーブルの関連付け
  VPC3TGWAssociation:
    Type: AWS::EC2::TransitGatewayRouteTableAssociation
    Properties:
      TransitGatewayRouteTableId: !Ref VPC3TGWRouteTable
      TransitGatewayAttachmentId: !Ref VPC3TGWAttachment

  # VPC3 の Transit Gateway ルートテーブル 静的ルートの作成 ()
  # なし！


  # VPC1 の SSM VPC エンドポイント用セキュリティグループ
  VPC1SSMEndpointSG:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId: !Ref VPC1
      GroupDescription: "Allow HTTPS for SSM"
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 443
          ToPort: 443
          CidrIp: "0.0.0.0/0"
      Tags:
        - Key: Name
          Value: VPC1-SSM-Endpoint-SG

  # VPC1 の SSM 用の VPC エンドポイント
  VPC1VPCEndpointSSM:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      VpcId: !Ref VPC1
      ServiceName: !Sub "com.amazonaws.${AWS::Region}.ssm"
      VpcEndpointType: Interface
      SubnetIds:
        - !Ref VPC1AZ11SubnetEC2
      SecurityGroupIds:
        - !Ref VPC1SSMEndpointSG
      PrivateDnsEnabled: true
      Tags:
        - Key: Name
          Value: VPC1-VPCEndpointSSM

  VPC1VPCEndpointSSMMessages:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      VpcId: !Ref VPC1
      ServiceName: !Sub "com.amazonaws.${AWS::Region}.ssmmessages"
      VpcEndpointType: Interface
      SubnetIds:
        - !Ref VPC1AZ11SubnetEC2
      SecurityGroupIds:
        - !Ref VPC1SSMEndpointSG
      PrivateDnsEnabled: true
      Tags:
        - Key: Name
          Value: VPC1-VPCEndpointSSMMessages

  VPC1VPCEndpointEC2Messages:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      VpcId: !Ref VPC1
      ServiceName: !Sub "com.amazonaws.${AWS::Region}.ec2messages"
      VpcEndpointType: Interface
      SubnetIds:
        - !Ref VPC1AZ11SubnetEC2
      SecurityGroupIds:
        - !Ref VPC1SSMEndpointSG
      PrivateDnsEnabled: true
      Tags:
        - Key: Name
          Value: VPC1-VPCEndpointEC2Messages

  # VPC2 の SSM VPCエンドポイント用セキュリティグループ
  VPC2SSMEndpointSG:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId: !Ref VPC2
      GroupDescription: "Allow HTTPS for SSM"
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 443
          ToPort: 443
          CidrIp: "0.0.0.0/0"
      Tags:
        - Key: Name
          Value: VPC2-SSM-Endpoint-SG

  # VPC2 の SSM 用の VPCエンドポイント
  VPC2VPCEndpointSSM:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      VpcId: !Ref VPC2
      ServiceName: !Sub "com.amazonaws.${AWS::Region}.ssm"
      VpcEndpointType: Interface
      SubnetIds:
        - !Ref VPC2AZ11SubnetEC2
      SecurityGroupIds:
        - !Ref VPC2SSMEndpointSG
      PrivateDnsEnabled: true
      Tags:
        - Key: Name
          Value: VPC2-VPCEndpointSSM

  VPC2VPCEndpointSSMMessages:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      VpcId: !Ref VPC2
      ServiceName: !Sub "com.amazonaws.${AWS::Region}.ssmmessages"
      VpcEndpointType: Interface
      SubnetIds:
        - !Ref VPC2AZ11SubnetEC2
      SecurityGroupIds:
        - !Ref VPC2SSMEndpointSG
      PrivateDnsEnabled: true
      Tags:
        - Key: Name
          Value: VPC2-VPCEndpointSSM

  VPC2VPCEndpointEC2Messages:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      VpcId: !Ref VPC2
      ServiceName: !Sub "com.amazonaws.${AWS::Region}.ec2messages"
      VpcEndpointType: Interface
      SubnetIds:
        - !Ref VPC2AZ11SubnetEC2
      SecurityGroupIds:
        - !Ref VPC2SSMEndpointSG
      PrivateDnsEnabled: true
      Tags:
        - Key: Name
          Value: VPC2-VPCEndpointEC2Messages

  # VPC3 の SSM VPCエンドポイント用セキュリティグループ
  VPC3SSMEndpointSG:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId: !Ref VPC3
      GroupDescription: "Allow HTTPS for SSM"
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 443
          ToPort: 443
          CidrIp: "0.0.0.0/0"
      Tags:
        - Key: Name
          Value: VPC3-SSM-Endpoint-SG

  # VPC3 の SSM 用の VPC エンドポイント
  VPC3VPCEndpointSSM:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      VpcId: !Ref VPC3
      ServiceName: !Sub "com.amazonaws.${AWS::Region}.ssm"
      VpcEndpointType: Interface
      SubnetIds:
        - !Ref VPC3AZ11SubnetEC2
      SecurityGroupIds:
        - !Ref VPC3SSMEndpointSG
      PrivateDnsEnabled: true
      Tags:
        - Key: Name
          Value: VPC3-VPCEndpointSSM

  VPC3VPCEndpointSSMMessages:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      VpcId: !Ref VPC3
      ServiceName: !Sub "com.amazonaws.${AWS::Region}.ssmmessages"
      VpcEndpointType: Interface
      SubnetIds:
        - !Ref VPC3AZ11SubnetEC2
      SecurityGroupIds:
        - !Ref VPC3SSMEndpointSG
      PrivateDnsEnabled: true
      Tags:
        - Key: Name
          Value: VPC3-VPCEndpointSSM

  VPC3VPCEndpointEC2Messages:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      VpcId: !Ref VPC3
      ServiceName: !Sub "com.amazonaws.${AWS::Region}.ec2messages"
      VpcEndpointType: Interface
      SubnetIds:
        - !Ref VPC3AZ11SubnetEC2
      SecurityGroupIds:
        - !Ref VPC3SSMEndpointSG
      PrivateDnsEnabled: true
      Tags:
        - Key: Name
          Value: VPC3-VPCEndpointEC2Messages


  # IAM ロール (SSM アクセス許可)
  SSMIAMRoleVPC:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service: ec2.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
      Tags:
        - Key: Name
          Value: SSMIAMRoleVPC

  # IAM インスタンスプロファイル
  SSMInstanceProfileVPC:
    Type: AWS::IAM::InstanceProfile
    Properties:
      Roles:
        - !Ref SSMIAMRoleVPC

 # VPC1 の EC2用 の セキュリティグループ
  VPC1SecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: VPC1SecurityGroup
      VpcId: !Ref VPC1
      SecurityGroupIngress:
        - IpProtocol: icmp
          FromPort: -1
          ToPort: -1
          CidrIp: "0.0.0.0/0"
        #- IpProtocol: tcp
        #  FromPort: 443
        #  ToPort: 443
        #  CidrIp: "0.0.0.0/0"
      Tags:
        - Key: Name
          Value: VPC1-SecurityGroup

 # VPC1 の VPC1-AZ11-EC2-Instance 作成
  VPC1AZ11EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}"
      InstanceType: t3.micro
      SecurityGroupIds: [!Ref VPC1SecurityGroup]
      SubnetId: !Ref VPC1AZ11SubnetEC2
      IamInstanceProfile: !Ref SSMInstanceProfileVPC
      Tags:
        - Key: Name
          Value: VPC1-AZ11-EC2-Instance

 # VPC1 の VPC1-AZ12-EC2-Instance 作成
  VPC1AZ12EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}"
      InstanceType: t3.micro
      SecurityGroupIds: [!Ref VPC1SecurityGroup]
      SubnetId: !Ref VPC1AZ12SubnetEC2
      IamInstanceProfile: !Ref SSMInstanceProfileVPC
      Tags:
        - Key: Name
          Value: VPC1-AZ12-EC2-Instance

 # VPC1 の VPC1-AZ21-EC2-Instance 作成
  VPC1AZ21EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}"
      InstanceType: t3.micro
      SecurityGroupIds: [!Ref VPC1SecurityGroup]
      SubnetId: !Ref VPC1AZ21SubnetEC2
      IamInstanceProfile: !Ref SSMInstanceProfileVPC
      Tags:
        - Key: Name
          Value: VPC1-AZ21-EC2-Instance

 # VPC2 の EC2用 の セキュリティグループ
  VPC2SecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: VPC2SecurityGroup
      VpcId: !Ref VPC2
      SecurityGroupIngress:
        - IpProtocol: icmp
          FromPort: -1
          ToPort: -1
          CidrIp: "0.0.0.0/0"
        #- IpProtocol: tcp
        #  FromPort: 443
        #  ToPort: 443
        #  CidrIp: "0.0.0.0/0"
      Tags:
        - Key: Name
          Value: VPC2-SecurityGroup

 # VPC2 の VPC2-AZ11-EC2-Instance 作成
  VPC2AZ11EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}"
      InstanceType: t3.micro
      SecurityGroupIds: [!Ref VPC2SecurityGroup]
      SubnetId: !Ref VPC2AZ11SubnetEC2
      IamInstanceProfile: !Ref SSMInstanceProfileVPC
      Tags:
        - Key: Name
          Value: VPC2-AZ11-EC2-Instance


 # VPC3 の EC2用 の セキュリティグループ
  VPC3SecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: VPC3SecurityGroup
      VpcId: !Ref VPC3
      SecurityGroupIngress:
        - IpProtocol: icmp
          FromPort: -1
          ToPort: -1
          CidrIp: "0.0.0.0/0"
        #- IpProtocol: tcp
        #  FromPort: 443
        #  ToPort: 443
        #  CidrIp: "0.0.0.0/0"
      Tags:
        - Key: Name
          Value: VPC3-SecurityGroup

 # VPC3 の VPC3-AZ11-EC2-Instance 作成
  VPC3AZ11EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: "{{resolve:ssm:/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2}}"
      InstanceType: t3.micro
      SecurityGroupIds: [!Ref VPC3SecurityGroup]
      SubnetId: !Ref VPC3AZ11SubnetEC2
      IamInstanceProfile: !Ref SSMInstanceProfileVPC
      Tags:
        - Key: Name
          Value: VPC3-AZ11-EC2-Instance

  # VPC1 の カスタムルートテーブル(EC2)
  VPC1RouteTableEC2:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC1
      Tags:
        - Key: Name
          Value: VPC1-CustomRouteTable-EC2

  VPC1RouteTGW:
    Type: AWS::EC2::Route
    Properties:
      RouteTableId: !Ref VPC1RouteTableEC2
      DestinationCidrBlock: "0.0.0.0/0"
      TransitGatewayId: !Ref TransitGateway
    DependsOn: VPC1TGWAttachment

  # VPC1 の カスタムルートテーブルをサブネットに関連付け(EC2)
  VPC1AZ11RouteTableAssociationEC2:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref VPC1AZ11SubnetEC2
      RouteTableId: !Ref VPC1RouteTableEC2

  VPC1AZ21RouteTableAssociationEC2:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref VPC1AZ21SubnetEC2
      RouteTableId: !Ref VPC1RouteTableEC2


  # VPC1 の カスタムルートテーブル(TGW)
  VPC1RouteTableTGW:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC1
      Tags:
        - Key: Name
          Value: VPC1-CustomRouteTable-TGW


  # VPC1 の カスタムルートテーブルをサブネットに関連付け(TGW)
  VPC1RouteTableAssociationTGW:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref VPC1AZ11SubnetTGW
      RouteTableId: !Ref VPC1RouteTableTGW

  VPC1AZ21RouteTableAssociationTGW:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref VPC1AZ21SubnetTGW
      RouteTableId: !Ref VPC1RouteTableTGW


  # VPC1AZ12 の カスタムルートテーブル(EC2)
  VPC1AZ12RouteTableEC2:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC1
      Tags:
        - Key: Name
          Value: VPC1-AZ12-CustomRouteTable-EC2

  # VPC1AZ12 の カスタムルートテーブルをサブネットに関連付け(EC2)
  VPC1AZ12RouteTableAssociationEC2:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref VPC1AZ12SubnetEC2
      RouteTableId: !Ref VPC1AZ12RouteTableEC2

  # VPC2 の カスタムルートテーブル(EC2)
  VPC2RouteTableEC2:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC2
      Tags:
        - Key: Name
          Value: VPC2-CustomRouteTable-EC2

  VPC2RouteTGW:
    Type: AWS::EC2::Route
    Properties:
      RouteTableId: !Ref VPC2RouteTableEC2
      DestinationCidrBlock: "0.0.0.0/0"
      TransitGatewayId: !Ref TransitGateway
    DependsOn: VPC1TGWAttachment

  # VPC2 の カスタムルートテーブルをサブネットに関連付け(EC2)
  VPC2RouteTableAssociationEC2:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref VPC2AZ11SubnetEC2
      RouteTableId: !Ref VPC2RouteTableEC2


  # VPC2 の カスタムルートテーブル(TGW)
  VPC2RouteTableTGW:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC2
      Tags:
        - Key: Name
          Value: VPC2-CustomRouteTable-TGW

  # VPC2 の カスタムルートテーブルをサブネットに関連付け(TGW)
  VPC2RouteTableAssociationTGW:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref VPC2AZ11SubnetTGW
      RouteTableId: !Ref VPC2RouteTableTGW
      
  # VPC3 の カスタムルートテーブル(EC2)
  VPC3RouteTableEC2:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC3
      Tags:
        - Key: Name
          Value: VPC3-CustomRouteTable-EC2

  VPC3RouteTGW:
    Type: AWS::EC2::Route
    Properties:
      RouteTableId: !Ref VPC3RouteTableEC2
      DestinationCidrBlock: "0.0.0.0/0"
      TransitGatewayId: !Ref TransitGateway
    DependsOn: VPC3TGWAttachment

  # VPC3 の カスタムルートテーブルをサブネットに関連付け(EC2)
  VPC3RouteTableAssociationEC2:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref VPC3AZ11SubnetEC2
      RouteTableId: !Ref VPC3RouteTableEC2

  # VPC3 の カスタムルートテーブル(TGW)
  VPC3RouteTableTGW:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC3
      Tags:
        - Key: Name
          Value: VPC3-CustomRouteTable-TGW

  # VPC3 の カスタムルートテーブルをサブネットに関連付け(TGW)
  VPC3RouteTableAssociationTGW:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref VPC3AZ11SubnetTGW
      RouteTableId: !Ref VPC3RouteTableTGW


Outputs:
  VPC1CIDR:
    Description: "VPC1-CidrBlock"
    Value: !GetAtt VPC1.CidrBlock

  VPC1AZ11EC2InstancePrivateIP:
    Description: "VPC1-AZ1-1-EC2Instance-PrivateIp"
    Value: !GetAtt VPC1AZ11EC2Instance.PrivateIp

  VPC1AZ11EC2InstanceSessionManagerURL:
    Description: "VPC1-AZ1-1-EC2Instance-Session Manager URL"
    Value: !Sub "https://${AWS::Region}.console.aws.amazon.com/systems-manager/session-manager/${VPC1AZ11EC2Instance}?region=${AWS::Region}"

  VPC1AZ12EC2InstancePrivateIP:
    Description: "VPC1-AZ1-2-EC2Instance-PrivateIp"
    Value: !GetAtt VPC1AZ12EC2Instance.PrivateIp

  VPC1AZ12EC2InstanceSessionManagerURL:
    Description: "VPC1-AZ1-2-EC2Instance-Session Manager URL"
    Value: !Sub "https://${AWS::Region}.console.aws.amazon.com/systems-manager/session-manager/${VPC1AZ12EC2Instance}?region=${AWS::Region}"

  VPC1AZ21EC2InstancePrivateIP:
    Description: "VPC1-AZ2-1-EC2Instance-PrivateIp"
    Value: !GetAtt VPC1AZ21EC2Instance.PrivateIp

  VPC1AZ21EC2InstanceSessionManagerURL:
    Description: "VPC1-AZ2-1-EC2Instance-Session Manager URL"
    Value: !Sub "https://${AWS::Region}.console.aws.amazon.com/systems-manager/session-manager/${VPC1AZ21EC2Instance}?region=${AWS::Region}"

  # VPC2
  VPC2CIDR:
    Description: "VPC2-CidrBlock"
    Value: !GetAtt VPC2.CidrBlock

  VPC2AZ11EC2InstancePrivateIP:
    Description: "VPC2-AZ1-1-EC2Instance-PrivateIp"
    Value: !GetAtt VPC2AZ11EC2Instance.PrivateIp

  VPC2AZ11EC2InstanceSessionManagerURL:
    Description: "VPC2-AZ1-1-EC2Instance-Session Manager URL"
    Value: !Sub "https://${AWS::Region}.console.aws.amazon.com/systems-manager/session-manager/${VPC2AZ11EC2Instance}?region=${AWS::Region}"

  # VPC3
  VPC3CIDR:
    Description: "VPC3-CidrBlock"
    Value: !GetAtt VPC3.CidrBlock

  VPC3AZ11EC2InstancePrivateIP:
    Description: "VPC3-AZ1-1-EC2Instance-PrivateIp"
    Value: !GetAtt VPC3AZ11EC2Instance.PrivateIp

  VPC3AZ11EC2InstanceSessionManagerURL:
    Description: "VPC3-AZ1-1-EC2Instance-Session Manager URL"
    Value: !Sub "https://${AWS::Region}.console.aws.amazon.com/systems-manager/session-manager/${VPC3AZ11EC2Instance}?region=${AWS::Region}"
    
```
</details>

テンプレート利用時の注意点は以下となります。

| 項 | 特徴 |
|:-----------|:-----------|
|1|テンプレートを参考にして頂いても問題ありませんが、自己責任でご利用ください。|
|2|基本的に東京リージョンでご利用いただくことを推奨します。|
|3|Amazon VPC リソースのクォータ上限には注意して下さい。標準のリソース上限が5つですが、このテンプレートでは3つの VPC を作成します。最初から3つ以上の VPC が存在する場合、エラーになります。|
|4|Systems Manager と通信するためのインタフェース VPCエンドポイントと Transit Gatewayアタッチメントを複数作成している関係上、1時間当たり50円前後の利用料が発生します。もし、1か月起動したままにすると30,000円以上になります。確認したいときに作成して、確認が終わったらすぐに削除することをお勧めします。|

### 1.3. テンプレートによる環境起動方法
(１) テンプレートの内容をコピーしてファイルを作成して下さい。拡張子を .yaml とします。

(２) AWS のマネジメントコンソールで「CloudFormation」画面を開いてください。リソースを作成したいリージョンかどうかを必ず確認してください。

(３) 画面左側にあるナビゲーションペインから「スタック」を選択します。

(４)「スタックを作成」で「新しいリソースを使用（標準）」を選択します。
<img width="400" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/d483d8c1-be61-4179-a807-cfa9c4972ddf.png">

(５) テンプレートの設定で「テンプレートファイルのアップロード」を選択して、先ほど作成した yaml ファイルをアップロードします。「次へ」を選択します。
<img width="800" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/264a2614-6c8d-49b7-8a14-3d7fbd05e3e7.png">

(６) スタック名は好きな名前を付けてください。「次へ」を選択します。
<img width="800" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/c694480d-61dd-409c-8923-9611e22dbebd.png">

(７)「AWS CloudFormation によって IAM リソースが作成される場合があることを承認します。」にチェックを入れてください。「次へ」を選択します。
 <img width="800" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/c500b943-bafd-4947-91b4-290bfc53b831.png">

(８) 確認画面で一番下までスクロールしてください。「送信」を選択します。
 <img width="800" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/7c05a626-131c-45a2-a9a2-ee711de1c294.png">

(９) スタックの作成が開始してステータスが「CREATE_IN_PROGRESS」と表示されます。リソースの作成が完了するまで、しばらく待ちます。
 <img width="800" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/d98582f7-859e-4a01-a91f-ecc8f268bf5f.png">

(10) スタックの作成が完了するとステータスが「CREATE_IN_PROGRESS」と表示されます。これで環境を利用することができます。
 <img width="600" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/85086cc1-949b-4353-befb-b2b11bd4b69a.png">

### 1.4. 起動環境のEC2インスタンスへの接続方法
環境が作成された時点で5台の EC2インスタンスが起動している状態です。
起動後の EC2 には Systems Manager Session Manager を利用して接続できます。

(１) AWS のマネジメントコンソールで「CloudFormation」画面を開いてください。

(２) 画面左側にあるナビゲーションペインから「スタック」を選択します。

(３) 先ほどデプロイした「スタック名」を選択します。

(４) 「出力」タブを選択します。
 <img width="600" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/1a003574-f1c9-451e-95b6-d96041050bf7.png">

(５) 出力画面が表示されます。ここでは接続確認に必要な情報が表示されています。

 <img width="600" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/dde8896c-14ea-4f99-80d6-235641302b38.png">

表示される情報は以下の通りです。
| キー | 値 |
|:-----------|:-----------|
|VPC1CIDR|10.1.0.0/16|
|VPC1AZ11EC2InstancePrivateIP|VPC1のAZ11に起動したEC2のプライベートIPアドレス|
|VPC1AZ11EC2InstanceSessionManagerURL|VPC1のAZ11に起動したEC2の Session Manager 接続URL|
|VPC1AZ12EC2InstancePrivateIP|VPC1のAZ12に起動したEC2のプライベートIPアドレス|
|VPC1AZ12EC2InstanceSessionManagerURL|VPC1のAZ12に起動したEC2の Session Manager 接続URL|
|VPC1AZ21EC2InstancePrivateIP|VPC1のAZ21に起動したEC2のプライベートIPアドレス|
|VPC1AZ21EC2InstanceSessionManagerURL|VPC1のAZ21に起動したEC2の Session Manager 接続URL|
|VPC2CIDR|10.2.0.0/16|
|VPC2AZ11EC2InstancePrivateIP|VPC2のAZ11に起動したEC2のプライベートIPアドレス|
|VPC2AZ11EC2InstanceSessionManagerURL|VPC2のAZ11に起動したEC2の Session Manager 接続URL|
|VPC3CIDR|10.3.0.0/16|
|VPC3AZ11EC2InstancePrivateIP|VPC3のAZ11に起動したEC2のプライベートIPアドレス|
|VPC3AZ11EC2InstanceSessionManagerURL|VPC3のAZ11に起動したEC2の Session Manager 接続URL|

最初に説明した通り、現状 Ping が通るのは、VPC2 にある EC2インスタンス「VPC2-AZ11-EC2」から　VPC1 にある EC2インスタンス「VPC1-AZ11-EC2」のみです。

<img width="800" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/e1e51e10-5c5e-42e6-a757-2790ed1a043d.png">

それでは、EC2インスタンス「VPC2-AZ11-EC2」から EC2インスタンス「VPC1-AZ11-EC2」への Ping による疎通を確認してみます。

(６) EC2インスタンス「VPC2-AZ11-EC2」にアクセスします。
出力された中のキー「VPC2AZ11EC2InstanceSessionManagerURL」の値の URL を選択してください。
<img width="800" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/d303d5d7-b380-4dbe-b971-2e9f694c6a2a.png">

EC2インスタンス「VPC2-AZ11-EC2」にアクセスできます。
<img width="800" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/fb13faa4-aec2-4810-9997-b412e2858bc4.png">

(７) 出力画面でキー「VPC1AZ11EC2InstancePrivateIP」の値に記載された IPアドレスを確認します。これが、EC2インスタンス「VPC1-AZ1-1-EC2Instance」のプライベート IP アドレスになります。
<img width="800" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/b31a94cf-1c67-427a-88ba-9ec5397f445f.png">

(８) EC2インスタンス「VPC2-AZ11-EC2」から EC2インスタンス「VPC1-AZ11-EC2」に対して Ping を実行します。

```
ping -c 5 "VPC1-AZ11-EC2 のプライベートIP"
```
(９) 問題なく Ping が通ることを確認します。


### 1.5. 起動環境の 終了方法
確認が完了して、起動環境を終了したい場合は以下の手順を実施します。

(１) AWS のマネジメントコンソールで「CloudFormation」画面を開いてください。

(２) 画面左側にあるナビゲーションペインから「スタック」を選択します。

(３) 先ほどデプロイした「スタック名」を選択します。

(４) 「削除」を選択します。
 <img width="800" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/60bae0f2-6972-4bd6-9d91-4a127a007fca.png">

(５) 「削除」を選択します。
 <img width="400" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/3b2dd2d6-d5be-42ee-b9a5-52e5e7b0b6c3.png">

(６) スタックの削除が開始してステータスが「DELETE_IN_PROGRESS」と表示されます。リソースの削除が完了するまで、しばらく待ちます。
 <img width="400" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/a6808171-8999-4721-9b54-ed0d43e7bee5.png">

(７) スタックの削除が完了するとスタック一覧に対象のスタックが表示されなくなります。

:::note warn
補足
起動後にリソースを追加したり変更した場合、削除時にエラーとなる場合があります。その場合は、追加リソースを個別に削除して再度削除処理を実施してください。
:::

## 2. 基礎的説明用環境テンプレートによる Transit Gateway 通信不可問題

4つのEC2のうち1つが正常にアクセス可能な状況であり、残り3つは接続できない状況です。

### 2.1. 説明テンプレートによる Transit Gateway 通信不可問題の説明

現在、以下の通り Transit Gateway で接続された複数の VPC 環境が存在します。

VPC2 にある EC2インスタンス「VPC2-AZ11-EC2」にログインして、Ping を実行して疎通確認を実施してください。その結果、VPC1 にある EC2インスタンス「VPC1-AZ11-EC2」のみは応答がありますが、それ以外の 3つの　EC2インスタンスからは応答がありません。

<img width="800" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/e1e51e10-5c5e-42e6-a757-2790ed1a043d.png">

疎通できない 3つの EC2インスタンスには、疎通するために必要な設定が一部漏れています。CloudFormation で環境をデプロイされた方は、設定を確認して原因を特定してみてください。原因はすべて異なります。

### 2.2. EC2「VPC1-AZ12-EC2」への通信不可問題

VPC2 の EC2インスタンス「VPC2-AZ11-EC2」から EC2インスタンス「VPC1-AZ12-EC2」への Ping が通らない問題です。

<img width="800" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/e29da0de-21e5-4c53-8df6-ab7d3d606565.png">

#### 2.2.1.  問題点

<details><summary>問題点</summary>
疎通を確認すると、往路は問題なく、復路に問題があります。
VPC1の EC2インスタンス「VPC1-AZ12-EC2」から「Transit Gateway」への通信に問題があります。

<img width="800" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/0ed3d481-3db5-44df-bae2-167344d46ab0.png">

</details>

#### 2.2.2.  原因

<details><summary>原因</summary>
原因は、VPC1 側の EC2インスタンス「VPC1-AZ12-EC2」が存在するサブネットのルートテーブルの設定に不足があるためです。

<img width="800" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/0a98a211-29d4-4a34-99ae-f2acdf40dcc9.png">

 EC2インスタンス「VPC1-AZ12-EC2」が Transit Gateway 経由で通信するためには、サブネットのルートテーブル上にそのためのルートが必要です。現在、そのためのルートが設定されていません。

 一連の通信の流れを図式化すると以下のようになります。
 この経路上のどこかに問題があれば通信ができなくなるわけですが、今回は赤色になっている「VPC1-Subnet-EC2-RootTable」の設定に問題があります。

 ```mermaid
flowchart TD
classDef classerror fill:#ff5555
subgraph VPC2
    subgraph VPC2-AZ1
        subgraph VPC2-Subnet-EC2
            subgraph VPC2-EC2
                VPC2-EC2-instance-->|往路|VPC2-EC2-ENI;
                VPC2-EC2-ENI-->|往路|VPC2-EC2-SecurityGroup;

                VPC2-EC2-SecurityGroup-->|復路|VPC2-EC2-ENI;
                VPC2-EC2-ENI-->|復路|VPC2-EC2-instance;
            end
            VPC2-EC2-SecurityGroup-->|往路|VPC2-Subnet-EC2-NetworkACL;
            VPC2-Subnet-EC2-NetworkACL-->|往路|VPC2-Subnet-EC2-RootTable;

            VPC2-Subnet-EC2-NetworkACL-->|復路|VPC2-EC2-SecurityGroup;
        end
        subgraph VPC2-Subnet-TGW
            VPC2-Subnet-EC2-RootTable-->|往路|VPC2-Subnet-TGW-NetworkACL;
            VPC2-Subnet-TGW-NetworkACL-->|往路|VPC2-TGW-ENI;

            VPC2-TGW-ENI-->|復路|VPC2-Subnet-TGW-NetworkACL;
            VPC2-Subnet-TGW-NetworkACL-->|復路|VPC2-Subnet-TGW-RootTable;
            VPC2-Subnet-TGW-RootTable-->|復路|VPC2-Subnet-EC2-NetworkACL;
        end
    end
end

subgraph Transit Gateway
    VPC2-TGW-ENI-->|往路|TGW-VPC2-Attachment;
    TGW-VPC2-Attachment-->|往路|TGW-RootTable;
    TGW-RootTable-->|往路|TGW-VPC1-Attachment;
    
    TGW-VPC1-Attachment-->|復路|TGW-RootTable;
    TGW-RootTable-->|復路|TGW-VPC2-Attachment;
    TGW-VPC2-Attachment-->|復路|VPC2-TGW-ENI;
end

subgraph VPC1
    subgraph VPC1-AZ1
        subgraph VPC1-Subnet-TGW
            TGW-VPC1-Attachment-->|往路|VPC1-TGW-ENI;
            VPC1-TGW-ENI-->|往路|VPC1-Subnet-TGW-NetworkACL;
            VPC1-Subnet-TGW-NetworkACL-->|往路|VPC1-Subnet-TGW-RootTable;

            VPC1-Subnet-TGW-NetworkACL-->|復路|VPC1-TGW-ENI;
            VPC1-TGW-ENI-->|復路|TGW-VPC1-Attachment;
        end
        subgraph VPC1-Subnet-EC2
            VPC1-Subnet-TGW-RootTable-->|往路|VPC1-Subnet-EC2-NetworkACL;
            VPC1-Subnet-EC2-NetworkACL-->|往路|VPC1-EC2-SecurityGroup;
            VPC1-EC2-SecurityGroup-->|往路|VPC1-EC2-ENI;
        
            VPC1-Subnet-EC2-NetworkACL-->|復路|VPC1-Subnet-EC2-RootTable;
            VPC1-Subnet-EC2-RootTable:::classerror-->|復路|VPC1-Subnet-TGW-NetworkACL;
            VPC1-EC2-SecurityGroup-->|復路|VPC1-Subnet-EC2-NetworkACL;

            subgraph VPC1-EC2
                VPC1-EC2-ENI-->|往路|VPC1-EC2-instance;

                VPC1-EC2-instance-->|復路|VPC1-EC2-ENI;
                VPC1-EC2-ENI-->|復路|VPC1-EC2-SecurityGroup;
            end
        end
    end
end
```

:::note info
実際に想定通りの経路で通信できているのか確認するためのサービスとして VPC の機能の１つ「[Network Manager](https://aws.amazon.com/jp/products/networking/network-operations/)」があります。その中の「[Reachability Analyzer](https://docs.aws.amazon.com/vpc/latest/reachability/what-is-reachability-analyzer.html)」を利用すると、送信元と送信先の間の通信経路を可視化できます。万一、設定に問題があって疎通できない場合は、その問題解決に寄与します。

ただし、プロトコルとしては TCP と UDP を指定することができますが、ICMP は指定できません。もしこの環境の経路確認に利用される場合は、EC2インスタンスのセキュリティグループの設定で、TCP プトロコルの通信を許可するように設定変更してください。現状は ICMP のみを許可しています。

:::


</details>

#### 2.2.3.  対策

<details><summary>対策</summary>
以下のように Transit Gateway へのルートを設定することで、疎通が可能となります。

<img width="800" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/9d41f1fd-045c-45dc-b6c8-09fe3d6e1e1c.png">

</details>

<details><summary>具体的な対策手順</summary>

(１) AWS のマネジメントコンソールで「VPC」画面を開いてください。

(２)  画面左側にあるナビゲーションペインから「ルートテーブル」を選択する。

(３) 検索画面で「VPC1-AZ12-CustomRouteTable-EC2」と入力します。これが、EC2インスタンス「VPC1-AZ12-EC2」が存在するサブネットのルートテーブルです。
 
(４) 対象のルートテーブルの「ルートテーブルID」を選択します。以下のルート画面が表示されます。Transit Gateway へのルートがありません。
<img width="800" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/f4f1d9b1-d280-40c1-bdc3-8105afa59537.png">

(５) 「ルートを編集」を選択します。

(６) Transit Gateway へのルートを追加します。
　送信先「0.0.0.0/0」、ターゲット「Transit Gateway (VPC1-Attachment)」選択します。設定できたら「変更を保存」を選択します。
<img width="800" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/c96a82d8-2f00-4925-9176-7c082c90cbda.png">

(７) 以下の通りルートが追加されます。
<img width="800" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/2e6b4d1d-265f-4b2f-b40c-59095218794c.png">

(９) AWS Session Manager で EC2インスタンス「VPC2-AZ11-EC2」に接続します。

 EC2インスタンス「VPC2-AZ11-EC2」からEC2インスタンス「VPC1-AZ12-EC2」に対して Ping を実行します。

```
ping -c 5 "VPC1-AZ12-EC2 のプライベートIP"
```
(10) 問題なく Ping が通ることを確認します。

</details>


### 2.3. EC2「VPC1-AZ21-EC2」への通信不可問題

VPC2 の EC2インスタンス「VPC2-AZ11-EC2」から EC2インスタンス「VPC1-AZ21-EC2」への Ping が通らない問題です。

<img width="800" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/8a871f2a-54fd-4004-8c7f-74dadec53e28.png">

#### 2.3.1.  問題点

<details><summary>問題点</summary>
疎通を確認すると、往路は問題なく、復路に問題があります。
VPC1の EC2インスタンス「VPC1-AZ21-EC2」から「Transit Gateway」への通信に問題があります。そして、2.2.で問題だったサブネットのルートテーブルは問題なく設定されているので、それ以外の設定が原因です。

<img width="800" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/0ed3d481-3db5-44df-bae2-167344d46ab0.png">
</details>

#### 2.3.2.  原因

<details><summary>原因</summary>
原因は、EC2インスタンス「VPC1-AZ21-EC2」が存在するサブネットの Availability Zone に Transit Gateway の ENI が存在しないためです。

<img width="800" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/ff76ce53-529a-4ef1-aaaf-bd3701eb4cd8.png">

同じ VPC 内の他のサブネットに Transit Gateway の ENI が存在しますが、Availability Zone が異なると利用できません。

 一連の通信の流れを図式化すると以下のようになります。
 赤色になっている「TGW-VPC2-Attachment」の設定で EC2 の存在する Availability Zone 以外の設定がされているため、EC2 の存在する Availability Zone には　Transit Gateway の ENI が無い状況です。これでは通信ができません。
 
 ```mermaid
flowchart TD
classDef classerror fill:#ff5555
subgraph VPC2
    subgraph VPC2-AZ1
        subgraph VPC2-Subnet-EC2
            subgraph VPC2-EC2
                VPC2-EC2-instance-->|往路|VPC2-EC2-ENI;
                VPC2-EC2-ENI-->|往路|VPC2-EC2-SecurityGroup;

                VPC2-EC2-SecurityGroup-->|復路|VPC2-EC2-ENI;
                VPC2-EC2-ENI-->|復路|VPC2-EC2-instance;
            end
            VPC2-EC2-SecurityGroup-->|往路|VPC2-Subnet-EC2-NetworkACL;
            VPC2-Subnet-EC2-NetworkACL-->|往路|VPC2-Subnet-EC2-RootTable;

            VPC2-Subnet-EC2-NetworkACL-->|復路|VPC2-EC2-SecurityGroup;
        end
        subgraph VPC2-Subnet-TGW
            VPC2-Subnet-EC2-RootTable-->|往路|VPC2-Subnet-TGW-NetworkACL;
            VPC2-Subnet-TGW-NetworkACL-->|往路|VPC2-TGW-ENI;

            VPC2-TGW-ENI-->|復路|VPC2-Subnet-TGW-NetworkACL;
            VPC2-Subnet-TGW-NetworkACL-->|復路|VPC2-Subnet-TGW-RootTable;
            VPC2-Subnet-TGW-RootTable-->|復路|VPC2-Subnet-EC2-NetworkACL;
        end
    end
end

subgraph Transit Gateway
    VPC2-TGW-ENI-->|往路|TGW-VPC2-Attachment;
    TGW-VPC2-Attachment-->|往路|TGW-RootTable;
    TGW-RootTable-->|往路|TGW-VPC1-Attachment;
    
    TGW-VPC1-Attachment:::classerror-->|復路|TGW-RootTable;
    TGW-RootTable-->|復路|TGW-VPC2-Attachment;
    TGW-VPC2-Attachment-->|復路|VPC2-TGW-ENI;
end

subgraph VPC1
    subgraph VPC1-AZ1
        subgraph VPC1-Subnet-TGW
            TGW-VPC1-Attachment-->|往路|VPC1-TGW-ENI;
            VPC1-TGW-ENI:::classerror-->|往路|VPC1-Subnet-TGW-NetworkACL;
            VPC1-Subnet-TGW-NetworkACL-->|往路|VPC1-Subnet-TGW-RootTable;

            VPC1-Subnet-TGW-NetworkACL-->|復路|VPC1-TGW-ENI;
            VPC1-TGW-ENI-->|復路|TGW-VPC1-Attachment;
        end
    end
    subgraph VPC1-AZ2
        subgraph VPC1-Subnet-EC2
            VPC1-Subnet-TGW-RootTable-->|往路|VPC1-Subnet-EC2-NetworkACL;
            VPC1-Subnet-EC2-NetworkACL-->|往路|VPC1-EC2-SecurityGroup;
            VPC1-EC2-SecurityGroup-->|往路|VPC1-EC2-ENI;
        
            VPC1-Subnet-EC2-NetworkACL-->|復路|VPC1-Subnet-EC2-RootTable;
            VPC1-Subnet-EC2-RootTable-->|復路|VPC1-Subnet-TGW-NetworkACL;
            VPC1-EC2-SecurityGroup-->|復路|VPC1-Subnet-EC2-NetworkACL;

            subgraph VPC1-EC2
                VPC1-EC2-ENI-->|往路|VPC1-EC2-instance;

                VPC1-EC2-instance-->|復路|VPC1-EC2-ENI;
                VPC1-EC2-ENI-->|復路|VPC1-EC2-SecurityGroup;
            end
        end
    end
end
```


</details>

#### 2.3.3.  対策

<details><summary>対策</summary>
EC2インスタンス「VPC1-AZ21-EC2」が存在するサブネットの Availability Zone に Transit Gateway 用のサブネットを作成して、Transit Gateway の ENIを作成することで、疎通が可能になります。

<img width="800" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/7a5604bf-7865-4db0-8e18-50b410275b31.png">

 一連の通信の見直し後の流れを図式化すると以下のようになります。先ほどと異なり、EC2インスタンスと同じAvailability Zone に サブネットを準備します。

 ```mermaid
flowchart TD
classDef classerror fill:#ff5555
subgraph VPC2
    subgraph VPC2-AZ1
        subgraph VPC2-Subnet-EC2
            subgraph VPC2-EC2
                VPC2-EC2-instance-->|往路|VPC2-EC2-ENI;
                VPC2-EC2-ENI-->|往路|VPC2-EC2-SecurityGroup;

                VPC2-EC2-SecurityGroup-->|復路|VPC2-EC2-ENI;
                VPC2-EC2-ENI-->|復路|VPC2-EC2-instance;
            end
            VPC2-EC2-SecurityGroup-->|往路|VPC2-Subnet-EC2-NetworkACL;
            VPC2-Subnet-EC2-NetworkACL-->|往路|VPC2-Subnet-EC2-RootTable;

            VPC2-Subnet-EC2-NetworkACL-->|復路|VPC2-EC2-SecurityGroup;
        end
        subgraph VPC2-Subnet-TGW
            VPC2-Subnet-EC2-RootTable-->|往路|VPC2-Subnet-TGW-NetworkACL;
            VPC2-Subnet-TGW-NetworkACL-->|往路|VPC2-TGW-ENI;

            VPC2-TGW-ENI-->|復路|VPC2-Subnet-TGW-NetworkACL;
            VPC2-Subnet-TGW-NetworkACL-->|復路|VPC2-Subnet-TGW-RootTable;
            VPC2-Subnet-TGW-RootTable-->|復路|VPC2-Subnet-EC2-NetworkACL;
        end
    end
end

subgraph Transit Gateway
    VPC2-TGW-ENI-->|往路|TGW-VPC2-Attachment;
    TGW-VPC2-Attachment-->|往路|TGW-RootTable;
    TGW-RootTable-->|往路|TGW-VPC1-Attachment;
    
    TGW-VPC1-Attachment:::classerror-->|復路|TGW-RootTable;
    TGW-RootTable-->|復路|TGW-VPC2-Attachment;
    TGW-VPC2-Attachment-->|復路|VPC2-TGW-ENI;
end

subgraph VPC1    
    subgraph VPC1-AZ2
        subgraph VPC1-Subnet-TGW-AZ2
            TGW-VPC1-Attachment-->|往路|VPC1-TGW-AZ2-ENI;
            VPC1-TGW-AZ2-ENI:::classerror-->|往路|VPC1-Subnet-TGW-NetworkACL;
            VPC1-Subnet-TGW-NetworkACL-->|往路|VPC1-Subnet-TGW-RootTable;

            VPC1-Subnet-TGW-NetworkACL-->|復路|VPC1-TGW-AZ2-ENI;
            VPC1-TGW-AZ2-ENI-->|復路|TGW-VPC1-Attachment;
        end
        subgraph VPC1-Subnet-EC2
            VPC1-Subnet-TGW-RootTable-->|往路|VPC1-Subnet-EC2-NetworkACL;
            VPC1-Subnet-EC2-NetworkACL-->|往路|VPC1-EC2-SecurityGroup;
            VPC1-EC2-SecurityGroup-->|往路|VPC1-EC2-ENI;
        
            VPC1-Subnet-EC2-NetworkACL-->|復路|VPC1-Subnet-EC2-RootTable;
            VPC1-Subnet-EC2-RootTable-->|復路|VPC1-Subnet-TGW-NetworkACL;
            VPC1-EC2-SecurityGroup-->|復路|VPC1-Subnet-EC2-NetworkACL;

            subgraph VPC1-EC2
                VPC1-EC2-ENI-->|往路|VPC1-EC2-instance;

                VPC1-EC2-instance-->|復路|VPC1-EC2-ENI;
                VPC1-EC2-ENI-->|復路|VPC1-EC2-SecurityGroup;
            end
        end
    end
end
```

</details>

<details><summary>具体的な対策手順</summary>

この環境では、すでにサブネット「VPC1-AZ2-1-TGW-Subnet」が作成済みです。EC2インスタンス「VPC1-AZ21-EC2」と同じ Availability Zone に作成されています。ただし、Transit Gateway の ENI は未作成のため、作成する必要があります。

(１) AWS のマネジメントコンソールで「VPC」画面を開いてください。

(２) 画面左側にあるナビゲーションペインから「Transit Gateway アタッチメント」を選択します。

(３) 検索画面で「VPC1-Attachment」と入力します。これは、VPC1 のアタッチメントです。
 
(４) 対象のアタッチメントの「Transit Gateway アタッチメント ID」を選択します。アタッチメントの詳細画面が表示されます。

(５) 「アクション」から「Transit Gateway アタッチメントを変更」を選択します。
<img width="400" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/bbdf5023-bc72-4f89-add4-05f202106d68.png">

(６) 変更画面を確認すると、サブネットの指定で 1つの Availability Zone しか選択されていないことが分かります。これが疎通できない原因です。
<img width="400" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/d2948ea0-8e85-4f6b-9594-195c096343ae.png">

(７) 2つ目の Availability Zone にチェックを入れます。サブネット「VPC1-AZ2-1-TGW-Subnet」を指定して、「Transit Gateway アタッチメントを変更」を選択します。
<img width="400" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/0c207d8f-14b3-406c-83d0-c0951c3d5681.png">

(８) 「VPC1-Attachment」で新しい ENI を作成する処理が開始します。状態が「Modifying（変更中）」となり、数分程度処理が実施されます。
<img width="800" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/34b9aca6-ed39-4bd0-9624-abbf4cd6536c.png">

数分経過すると「Available（利用可能）」に更新されます。
<img width="800" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/c29ff1ab-2d5a-4afb-b8b8-ddea66c8a240.png">

(９) AWS Session Manager でEC2インスタンス「VPC2-AZ11-EC2」に接続します。

(10) EC2インスタンス「VPC2-AZ11-EC2」からEC2インスタンス「VPC1-AZ21-EC2」に対して Ping を実行します。

```
ping -c 5 "VPC1-AZ21-EC2 のプライベートIP"
```
(11) 問題なく Ping が通ることを確認します。

</details>


### 2.4. EC2「VPC3-AZ11-EC2」への通信不可問題

VPC2 の EC2インスタンス「VPC2-AZ11-EC2」から EC2インスタンス「VPC3-AZ11-EC2」への Ping が通らない問題です。

<img width="800" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/e7801cb0-6ed3-44a2-a04c-cfbb638877b2.png">

#### 2.4.1.  問題点

<details><summary>問題点</summary>
疎通を確認すると、往路ですでに問題があります。
VPC2からの通信が Transit Gateway を経由して VPC3 に受け渡しできていません。

<img width="800" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/ab642432-0037-47ca-aa00-3b94a4905d1a.png">
</details>

#### 2.4.2.  原因

<details><summary>原因</summary>
原因は、Transit Gateway のルートテーブルに VPC3 に関するルート設定がされていないためです。

<img width="800" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/b624641e-4cb4-41e0-9603-f56077d788df.png">

まず、VPC2-Attachment に関しては VPC1 にルーティングする設定がされていますが、VPC3 へのルーティング設定がされていません。

そして、VPC3-Attachment に関しては ルート設定が入っていない状態です。

これでは、VPC3は Transit Gateway を経由して送受信ができない状況となっています。

 EC2インスタンス「VPC1-AZ11-EC2」が Transit Gateway 経由で通信するためには、 Transit Gateway のルートテーブル上にそのためのルートが必要です。現在、そのためのルートが設定されていません。

  一連の通信の流れを図式化すると以下のようになります。
 赤色になっている「TGW-RootTable」の設定に問題があります。

 ```mermaid
flowchart TD
classDef classerror fill:#ff5555
subgraph VPC2
    subgraph VPC2-AZ1
        subgraph VPC2-Subnet-EC2
            subgraph VPC2-EC2
                VPC2-EC2-instance-->|往路|VPC2-EC2-ENI;
                VPC2-EC2-ENI-->|往路|VPC2-EC2-SecurityGroup;

                VPC2-EC2-SecurityGroup-->|復路|VPC2-EC2-ENI;
                VPC2-EC2-ENI-->|復路|VPC2-EC2-instance;
            end
            VPC2-EC2-SecurityGroup-->|往路|VPC2-Subnet-EC2-NetworkACL;
            VPC2-Subnet-EC2-NetworkACL-->|往路|VPC2-Subnet-EC2-RootTable;

            VPC2-Subnet-EC2-NetworkACL-->|復路|VPC2-EC2-SecurityGroup;
        end
        subgraph VPC2-Subnet-TGW
            VPC2-Subnet-EC2-RootTable-->|往路|VPC2-Subnet-TGW-NetworkACL;
            VPC2-Subnet-TGW-NetworkACL-->|往路|VPC2-TGW-ENI;

            VPC2-TGW-ENI-->|復路|VPC2-Subnet-TGW-NetworkACL;
            VPC2-Subnet-TGW-NetworkACL-->|復路|VPC2-Subnet-TGW-RootTable;
            VPC2-Subnet-TGW-RootTable-->|復路|VPC2-Subnet-EC2-NetworkACL;
        end
    end
end

subgraph Transit Gateway
    VPC2-TGW-ENI-->|往路|TGW-VPC2-Attachment;
    TGW-VPC2-Attachment-->|往路|TGW-RootTable;
    TGW-RootTable:::classerror-->|往路|TGW-VPC1-Attachment;
    
    TGW-VPC1-Attachment-->|復路|TGW-RootTable;
    TGW-RootTable-->|復路|TGW-VPC2-Attachment;
    TGW-VPC2-Attachment-->|復路|VPC2-TGW-ENI;
end

subgraph VPC1
    subgraph VPC1-AZ1
        subgraph VPC1-Subnet-TGW
            TGW-VPC1-Attachment-->|往路|VPC1-TGW-ENI;
            VPC1-TGW-ENI-->|往路|VPC1-Subnet-TGW-NetworkACL;
            VPC1-Subnet-TGW-NetworkACL-->|往路|VPC1-Subnet-TGW-RootTable;

            VPC1-Subnet-TGW-NetworkACL-->|復路|VPC1-TGW-ENI;
            VPC1-TGW-ENI-->|復路|TGW-VPC1-Attachment;
        end
        subgraph VPC1-Subnet-EC2
            VPC1-Subnet-TGW-RootTable-->|往路|VPC1-Subnet-EC2-NetworkACL;
            VPC1-Subnet-EC2-NetworkACL-->|往路|VPC1-EC2-SecurityGroup;
            VPC1-EC2-SecurityGroup-->|往路|VPC1-EC2-ENI;
        
            VPC1-Subnet-EC2-NetworkACL-->|復路|VPC1-Subnet-EC2-RootTable;
            VPC1-Subnet-EC2-RootTable-->|復路|VPC1-Subnet-TGW-NetworkACL;
            VPC1-EC2-SecurityGroup-->|復路|VPC1-Subnet-EC2-NetworkACL;

            subgraph VPC1-EC2
                VPC1-EC2-ENI-->|往路|VPC1-EC2-instance;

                VPC1-EC2-instance-->|復路|VPC1-EC2-ENI;
                VPC1-EC2-ENI-->|復路|VPC1-EC2-SecurityGroup;
            end
        end
    end
end
```

</details>

#### 2.4.3.  対策

<details><summary>対策</summary>
Transit Gateway ルートテーブルに、VPC3 に関する送信・受信両方の設定を実施することで、VPC2にある EC2インスタンス「VPC2-AZ11-EC2」との疎通が可能になります。

<img width="800" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/8a7816f3-df56-4330-8800-50ff09cd51db.png">

</details>

<details><summary>具体的な対策手順</summary>
まず、VPC2 から VPC3 への通信を可能にする設定を Transit Gateway ルートテーブルに実施します。

(１) AWS のマネジメントコンソールで「VPC」画面を開いてください。

(２) 画面左側にあるナビゲーションペインから「Transit Gateway ルートテーブル」を選択する。

(３) 検索画面で「VPC2-TGWRouteTable」と入力します。これが、VPC2Attachment用のルートテーブルです。
 
(４) 対象のルートテーブルの「Transit Gateway ルートテーブル ID」を選択します。

(５) ルートテーブルの詳細画面で「ルート」タブを選択します。以下の通り VPC2 から VPC1 (10.1.0.0/16) に対するルートのみが定義されていることが分かります。VPC3へのルートがないので追加する必要があります。

<img width="800" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/b3f7dbe8-c60a-4115-9d2f-2198774a3ac8.png">

(６) 「静的ルートを作成」を選択します。CIDR に「10.3.0.0/16」(VPC3 の CIDR) と入力します。タイプは「アクティブ」を選択します。アタッチメントを選択は「VPC3-Attachment」を選択します。
<img width="400" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/5bfcbecc-3f5c-46b0-93ac-f06a2e85a6a7.png">

「静的ルートを作成」を選択します。

(７)  以下の通りルートが追加されます。これで、VPC2 からは VPC1 と VPC3 への通信が可能になります。
<img width="800" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/f4b714c2-194a-41a8-8719-41eb19c5f9d2.png">

次に、VPC3 から VPC2 への通信を可能にする設定を Transit Gateway ルートテーブルに実施します。

(８) AWS のマネジメントコンソールで「VPC」画面を開いてください。

(９) 画面左側にあるナビゲーションペインから「Transit Gateway ルートテーブル」を選択する。

(10) 検索画面で「VPC3-TGWRouteTable」と入力します。これが、VPC3Attachment用のルートテーブルです。
 
(11) 対象のルートテーブルの「Transit Gateway ルートテーブル ID」を選択します。

(12) ルートテーブルの詳細画面で「ルート」タブを選択します。以下の通りルートが何も設定されていません。
<img width="800" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/4dfed521-314e-452f-bbf9-47a242281c1b.png">

(13)「静的ルートを作成」を選択します。CIDR に「10.2.0.0/16」(VPC2 の CIDR) と入力します。タイプは「アクティブ」を選択します。アタッチメントを選択は「VPC2-Attachment」を選択します。
<img width="400" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/dfa7cdea-ba4e-4759-a5ca-98e9b04fadf7.png">

「静的ルートを作成」を選択します。

(14) 以下の通りルートが追加されます。これで、VPC3 からは VPC2 への通信が可能になります。
<img width="800" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/9d0d9379-6f6e-4d09-a657-08c65de84a1e.png">

(15) AWS Session Manager でEC2インスタンス「VPC2-AZ11-EC2」に接続します。

(16) EC2インスタンス「VPC3-AZ11-EC2」に対して Ping を実行します。

```
ping -c 5 "VPC3-AZ11-EC2 のプライベートIP"
```
(17) 問題なく Ping が通ることを確認します。

</details>

### 2.5. 説明テンプレートによる Transit Gateway 通信不可問題のまとめ
この章では3つの問題について解説しました。

<details><summary>まとめ</summary>
今回は、VPCサブネットのルートテーブルの問題、Availability Zone の問題、Transit Gateway ルートテーブルの問題の３つでした。

<img width="800" alt="構成図" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253105/df01e890-e435-40a7-a24c-81989beca638.png">

ルーティングの設定は、資料を読むだけで詳細まで理解するのは難しいです。今回の環境を利用いただいて実際の設定を確認の上、理解を深めてください。

</details>

## 3. まとめ

Transit Gateway の基礎的説明用環境をさくっと利用したいという方はご活用ください。


※ 記載内容は個人的なものであり、所属する企業や組織、団体を代表する見解その他ではありません。