4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

KGDCAdvent Calendar 2024

Day 5

【AWS】届くかどうかじゃねぇ...届かせるんだ!VPC Reachability Analyzerを検証

Last updated at Posted at 2024-11-04

この記事で伝えたいこと(Point)

  • VPC Reachability Analyzerをハンズオンしているよ
  • VPC Reachability Analyzerを使うとネットワーク周りのトラブルを解決できるよ

はじめに

この記事では「この前リリースされた機能って実際に動かすとどんな感じなんだろう」とか「もしかしたら内容次第では使えるかも」などAWSサービスの中でも特定の機能にフォーカスして検証していく記事です。

主な内容としては実践したときのメモを中心に書きます。(忘れやすいことなど)
誤りなどがあれば書き直していく予定です。

今回はVPCの機能として提供されているVPC Reachability Analyzerを検証してみます。

VPC Reachability Analyzer(以下、本文ではRA)とは

簡単に説明するとAWSリソース間におけるネットワークの接続性をテストするVPCの機能です。
対象リソースについては以下のドキュメントに記載があります。

Reachability Analyzer を使用した到達可能性に関する問題のトラブルシューティング

紹介ブログ

新機能 – VPC Reachability Analyzer

実際に触ってみよう

環境を構築

RAを試すためにまずは環境を構築します。紹介ブログにもCloudFormationテンプレートがありますが、今回はオリジナルでテンプレートを作りましたのでオリジナルのテンプレートを使って動作を確認します。

AWSTemplateFormatVersion: "2010-09-09"
Description: CloudFormation template to create a VPC, and an EC2 instance within that VPC with a specified IAM role for Systems Manager

Parameters:
  EC2ImageId:
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Default: "/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64"

Resources:
  VPC:
    Type: "AWS::EC2::VPC"
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: MyVPC

  InternetGateway:
    Type: "AWS::EC2::InternetGateway"
    Properties:
      Tags:
        - Key: Name
          Value: MyInternetGateway

  AttachGateway:
    Type: "AWS::EC2::VPCGatewayAttachment"
    Properties:
      VpcId: !Ref VPC
      InternetGatewayId: !Ref InternetGateway

  PublicSubnet:
    Type: "AWS::EC2::Subnet"
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.1.0/24
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: MyPublicSubnet

  RouteTable:
    Type: "AWS::EC2::RouteTable"
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: MyRouteTable

  PublicRoute:
    Type: "AWS::EC2::Route"
    DependsOn: AttachGateway
    Properties:
      RouteTableId: !Ref RouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway

  SubnetRouteTableAssociation:
    Type: "AWS::EC2::SubnetRouteTableAssociation"
    Properties:
      SubnetId: !Ref PublicSubnet
      RouteTableId: !Ref RouteTable

  InstanceSecurityGroupA:
    Type: "AWS::EC2::SecurityGroup"
    Properties:
      VpcId: !Ref VPC
      GroupDescription: Allow HTTPS traffic for SSM
      SecurityGroupEgress:
        - IpProtocol: tcp
          FromPort: "443"
          ToPort: "443"
          CidrIp: 0.0.0.0/0

  InstanceSecurityGroupB:
    Type: "AWS::EC2::SecurityGroup"
    Properties:
      VpcId: !Ref VPC
      GroupDescription: Allow HTTPS traffic for SSM
      SecurityGroupEgress:
        - IpProtocol: tcp
          FromPort: "443"
          ToPort: "443"
          CidrIp: 0.0.0.0/0

  MyInstanceA:
    Type: "AWS::EC2::Instance"
    Properties:
      InstanceType: t3.micro
      ImageId: !Ref EC2ImageId
      IamInstanceProfile: !Ref SSMRoleInstanceProfile
      SecurityGroupIds:
        - !Ref InstanceSecurityGroupA
      SubnetId: !Ref PublicSubnet
      Tags:
        - Key: Name
          Value: MyEC2InstanceA

  MyInstanceB:
    Type: "AWS::EC2::Instance"
    Properties:
      InstanceType: t3.micro
      ImageId: !Ref EC2ImageId
      IamInstanceProfile: !Ref SSMRoleInstanceProfile
      SecurityGroupIds:
        - !Ref InstanceSecurityGroupB
      SubnetId: !Ref PublicSubnet
      Tags:
        - Key: Name
          Value: MyEC2InstanceB

  SSMRoleInstanceProfile:
    Type: "AWS::IAM::InstanceProfile"
    Properties:
      Roles:
        - !Ref SSMRole

  SSMRole:
    Type: "AWS::IAM::Role"
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - ec2.amazonaws.com
            Action:
              - sts:AssumeRole
      Path: /
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
      Policies:
        - PolicyName: ListBucketsPolicy
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: Allow
                Action:
                  - s3:ListAllMyBuckets
                  - s3:CreateBucket
                  - s3:DeleteBucket
                  - s3:DeleteObject
                  - s3:ListBucket
                  - s3:PutObject
                  - s3:GetObject
                Resource: "*"
Outputs:
  VPCId:
    Description: The VPC ID
    Value: !Ref VPC

  InstanceIdA:
    Description: The Instance ID
    Value: !Ref MyInstanceA

  InstanceIdB:
    Description: The Instance ID
    Value: !Ref MyInstanceB

  PublicSubnetId:
    Description: The Subnet ID
    Value: !Ref PublicSubnet

CloudFormationテンプレートを適用するため、AWSマネジメントコンソールからCloudFormationを開きます。なお、今回は東京リージョンで試しています。

Screenshot 2024-11-04 at 18.24.03.png

CloudFormationの画面を開いたら、Stacksをクリックします。

Screenshot 2024-11-04 at 18.26.15.png

Create stackから新しいスタックを作成します。

Screenshot 2024-11-04 at 18.26.41.png

すでにあるテンプレートでスタックを作成するようにし、テンプレートをアップロードします。アップロードが終わったら、Nextをクリックします。

Screenshot 2024-11-04 at 18.28.27.png

スタック名はVpcRaとし、Nextをクリックします。

Screenshot 2024-11-04 at 18.32.09.png

今回はIAMリースを作成しているため、Capabilitiesのチェック項目にチェックを入れます。Nextをクリックします。

Screenshot 2024-11-04 at 18.34.23.png

最後のページは何も操作することがないため、一番下までスクロールしてSubmitをクリックします。

Screenshot 2024-11-04 at 18.34.58.png

CREATE COMPLETEになったことを確認します。

Screenshot 2024-11-04 at 19.14.41.png

VPC Reachability Analyzerを試す

マネジメントコンソールからVPC Reachability Analyzerと入力してVPC Reachability Analyzerを開きます。

Screenshot 2024-11-04 at 19.17.40.png

画面が遷移したら、Create and analyze pathをクリックします。

Screenshot 2024-11-04 at 19.28.45.png

設定画面に遷移したら、以下のとおりに設定を入れます。

項目
Path configuration InstanceAtoB

送信元の設定

項目
Path Source MyEC2InstanceA
Source port 443
Destination port 443

送信先の設定

項目
Path destination MyEC2InstanceB
Source port 443
Destination port 443

ProtocolはTCPとします。Create and analyze pathをクリックします。
画面が再び遷移してネットワークのテストが始まります。

実行結果の確認

今回のCloudFormationではセキュリティグループ(SG)を以下のように設定しているため、テストは失敗するはずです。

  InstanceSecurityGroupA:
    Type: "AWS::EC2::SecurityGroup"
    Properties:
      VpcId: !Ref VPC
      GroupDescription: Allow HTTPS traffic for SSM
      SecurityGroupEgress:
        - IpProtocol: tcp
          FromPort: "443"
          ToPort: "443"
          CidrIp: 0.0.0.0/0

  InstanceSecurityGroupB:
    Type: "AWS::EC2::SecurityGroup"
    Properties:
      VpcId: !Ref VPC
      GroupDescription: Allow HTTPS traffic for SSM
      SecurityGroupEgress:
        - IpProtocol: tcp
          FromPort: "443"
          ToPort: "443"
          CidrIp: 0.0.0.0/0

では実際にどうなったか見ていきましょう。RAは分析を開始するとniaで始まるIDを発行します。niaで始まるIDをクリックします。

Screenshot 2024-11-04 at 19.50.04.png

niaで始まるIDをクリックすると画面が遷移し、SummaryAnalysis explorerが表示されます。Analysis explorerを使って結果を確認します。

Analysis explorerを確認する

今回はMyEC2InstanceAのSGではアウトバウンドポートで443を許可しているため、MyEC2InstanceAにおける以下のテストはパスします。つまり、初手では通信できているということです。

項目
Source port range 443
Destination port range 443
プロトコル TCP

問題となる部分についてはMyEC2InstanceBです。直前にあるENIで通信できていないことがわかります。これはMyEC2InstanceBにあるSGがInBoundで443ポートを許可していないためです。

  InstanceSecurityGroupB:
    Type: "AWS::EC2::SecurityGroup"
    Properties:
      VpcId: !Ref VPC
      GroupDescription: Allow HTTPS traffic for SSM
      SecurityGroupEgress:
        - IpProtocol: tcp
          FromPort: "443"
          ToPort: "443"
          CidrIp: 0.0.0.0/0

Screenshot 2024-11-04 at 19.54.57.png

※今回はIDなどをマスキングしていません。リソースはハンズオン終了後に削除しています。

RAの面白いところとしてはEC2からEC2に通信するとき、ENIをしっかり通していることを表示するところです。「ちゃんとENIを経由して通信しているよ」と認識できます。

VPC Reachability Analyzerはどういうところで利用できるか

ハンズオンは以上です。今回はEC2同士の通信ですが、実際には以下のような使い方ができると思います。たとえば

  • InternetGatewayで外からアクセスできないことを確認する
    • プライベートネットワークであることを担保する
  • プライベートからパブリックに通信できないことを確認する
    • NAT Gatewayなどを配置した構成で想定内以外の通信ができないことを確認する
  • VPCエンドポイントで通信していることを確認する
  • VPCピアリングなど複雑なネットワーク構成になりやすいネットワークをテストする

などです。

もうちょっと応用的に使っていきたい

今回は特定のアカウント、シングルアカウントにおける接続性テストであるため、規模が小さいというところがあり、あまり凄さを体験できないところがあります。

実際にはマルチアカウントで接続性テストをすることもあります。マルチアカウントの場合は組織でVPC Reachability Analyzerを信頼して利用する必要があります。

また、マネジメントコンソールで今回は実行しましたが
複数の接続性確認を実行する場合はAWS CLIを使いたいケースもあるでしょう。AWS CLIで接続性を確認する場合は以下を手順で行います。

1.パスを作成
2.パスを解析
3.パス解析の結果を取得

参考 - Amazon VPC Reachability Analyzer を使用して Amazon VPC リソースの接続に関する問題をトラブルシューティングするにはどうすればよいですか?

Getting started with Reachability Analyzer using the AWS CLI

まとめ

今回はVPCで接続性確認が実行できるVPC Reachability Analyzerの使い方を見ました。
VPCというサービスが洗練されているからこそ、成り立つ側面もあるのかなと思わせるようなものでした。使えるところでは積極的に使っていきましょう。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?