既存 VPC 内の EC2 インスタンスに Systems Manager セッションマネージャーで接続するためのエンドポイントだけを一発で作成するCloudFormationテンプレートを作った

既存 VPC 内の EC2 インスタンスに Systems Manager セッションマネージャーで接続するためのエンドポイントだけを一発で作成するCloudFormationテンプレートを作った

セッションマネージャーでの接続には EC2 インスタンスから Systems Manager に向けて HTTPS(ポート番号 443)の通信が許可されている必要があります。
Clock Icon2024.03.20 10:08

コーヒーが好きな emi です。

普段は VPN や専用線(Direct Conect)経由で社内からプライベートサブネットの EC2 インスタンスにログインしているけど、一時的に Systems Manager セッションマネージャーで接続したい!

というケースがありました。Systems Manager(以降、SSM と省略)セッションマネージャーで EC2 インスタンスに接続するために、一時的に VPC エンドポイントだけを作成する CloudFormation テンプレートを作成しましたので、テンプレートと使い方を紹介します。

CloudFormation テンプレート

以下の CloudFormation テンプレートを yaml 形式で端末に保存しておきます。S3 や Git リポジトリに保存しても OK です。

AWSTemplateFormatVersion: "2010-09-09"
Description: VPC endpoints for session manager	

# ------------------------------------------------------------#
# Input Parameters
# -----------------------------------------------------------#
Parameters:

  AvailabilityZone:
    Type: AWS::EC2::AvailabilityZone::Name
    Description: Select the Availability Zone to create the VPC endpoints in.
    Default: ap-northeast-1a

  VpcId:
    Type: AWS::EC2::VPC::Id
    Description: Select the VPC to create the VPC endpoints in.
    Default: vpc-xxxxx

  SubnetId:
    Type: AWS::EC2::Subnet::Id
    Description: Select the Subnet to create the VPC endpoints in.
    Default: subnet-xxxxx

  Ec2InstanceSg:
    Type: AWS::EC2::SecurityGroup::Id
    Description: Select the security group assigned to the EC2 instance.

Resources:
  # ------------------------------------------------------------#
  #  Security group for VPC endpoints
  # ------------------------------------------------------------#
  VpcEndpointSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Security group for VPC endpoints
      VpcId: !Ref VpcId
      Tags:
        - Key: Name
          Value: vpcep-sg
      # Rule
      SecurityGroupIngress:
        - SourceSecurityGroupId: !Ref Ec2InstanceSg
          IpProtocol: tcp
          FromPort: 443
          ToPort: 443

  # ------------------------------------------------------------#
  #  VPC endpoints for session manager
  # ------------------------------------------------------------#
  SsmVpcEndpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      PrivateDnsEnabled: true
      SecurityGroupIds:
        - !Ref VpcEndpointSecurityGroup
      ServiceName: com.amazonaws.ap-northeast-1.ssm
      SubnetIds:
        - !Ref SubnetId
      VpcEndpointType: Interface
      VpcId: !Ref VpcId

  SsmMessagesVpcEndpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      PrivateDnsEnabled: true
      SecurityGroupIds:
        - !Ref VpcEndpointSecurityGroup
      ServiceName: com.amazonaws.ap-northeast-1.ssmmessages
      SubnetIds:
        - !Ref SubnetId
      VpcEndpointType: Interface
      VpcId: !Ref VpcId

  Ec2MessagesVpcEndpoint:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      PrivateDnsEnabled: true
      SecurityGroupIds:
        - !Ref VpcEndpointSecurityGroup
      ServiceName: com.amazonaws.ap-northeast-1.ec2messages
      SubnetIds:
        - !Ref SubnetId
      VpcEndpointType: Interface
      VpcId: !Ref VpcId

構成図とセキュリティグループの説明

この状態から、

CloudFormation テンプレートを展開するとこうなります。
Interface 型 VPC エンドポイント 3 つ(com.amazonaws.ap-northeast-1.ssmcom.amazonaws.ap-northeast-1.ssmmessagescom.amazonaws.ap-northeast-1.ec2messages)と、VPC エンドポイント用のセキュリティグループが 1 つ作成されます。作成された Interface 型 VPC エンドポイント 3 つに、同じ VPC エンドポイント用のセキュリティグループが付与されます。

EC2 インスタンスにセッションマネージャー経由で接続できるようになります。

VPC エンドポイント用セキュリティグループでは EC2 用セキュリティグループからの HTTPS(ポート番号 443)通信を許可しています。

VPC エンドポイント用セキュリティグループ:vpcep-sg

セキュリティグループ タイプ プロトコル ポート範囲 送信先 説明
インバウンド HTTPS TCP 443 EC2 用セキュリティグループ なし
アウトバウンド すべてのトラフィック すべて すべて 0.0.0.0/0 なし

ちなみに…
今回はアウトバウンド通信をすべて許可するセキュリテイグループを作成するのですが、セッションマネージャーでの接続には EC2 インスタンスから Systems Manager に向けて HTTPS(ポート番号 443)の通信が許可されていれば良いです。以下の図のようなイメージです。

使い方

CloudFormation コンソール画面で [スタックの作成] - [新しいリソース] をクリックします。

「テンプレートファイルのアップロード」より、CloudFormation テンプレートの yaml ファイルをアップロードします。S3 や Git リポジトリに保存した方はそちらからテンプレートを指定してください。

  • スタック名
    • 任意のスタック名を指定
  • Ec2InstanceSg
    • 接続したい EC2 インスタンスに付与されているセキュリティグループを選択
  • SubnetId
    • VPC エンドポイントを作成するサブネットを選択
      • プライベートサブネットでもパブリックサブネットでも OK です
      • EC2 インスタンスが通信可能なサブネットを選択してください
  • VpcId
    • VPC エンドポイントを作成する VPC を選択

上記パラメータを入力したら「次へ」をクリックします。

「スタックオプションの設定」画面では何もせず次へ進み、「確認して作成」画面で「送信」をクリックします。

スタックの状態が 1~2 分程度で「CREATE_IN_PROGRESS」から「CREATE_COMPLETE」に変わります。

リソースタブを確認すると、Interface 型 VPC エンドポイント 3 つと、セキュリティグループ 1 つが作成されています。

EC2 コンソール画面でセキュリティグループを確認すると、「vpcep-sg」というセキュリティグループが作成されているのが分かります。

VPC コンソール画面でエンドポイントを確認すると、com.amazonaws.ap-northeast-1.ssmcom.amazonaws.ap-northeast-1.ssmmessagescom.amazonaws.ap-northeast-1.ec2messages の 3 つのエンドポイントが作成されているのが分かります。

Systems Manager フリートマネージャーを確認すると、EC2 インスタンスの Ping ステータスがオンラインになっており、EC2 インスタンスにセッションマネージャー(もしくはフリートマネージャー)で接続できるようになっています。

準備完了です。EC2 インスタンスに接続して作業しましょう!

削除方法

接続して作業が終わったら、CloudFormation スタックを削除すればエンドポイント関連のリソースのみ削除されるので元通りです。

CloudFormation スタックの削除は、スタックを開いて「削除」をクリックすれば OK です。

スタックのステータスが「DELETE_COMPLETE」になれば削除完了です。

時間を置くと、フリートマネージャーのステータスが「接続が失われました」となり、接続不可になります。

注意

  • EC2 インスタンスから SSM への通信は可能になりますが、インターネット向けには通信できません。ソフトウェアのダウンロードなどが必要な場合は NAT Gateway の利用をご検討ください。
  • EC2 インスタンスに SSM エージェントがインストールされていることが前提です。
  • EC2 インスタンスに付与されているセキュリティグループのアウトバウンドで HTTPS(ポート番号 443)が解放されていない場合、SSM と通信できません。
  • VPC の設定で DNS ホスト名が無効になっていると、VPC エンドポイント名が名前解決できず以下のようなエラーになり、通信できません。

VPC エンドポイントの作成中にエラーが発生しました
Enabling private DNS requires both enableDnsSupport and enableDnsHostnames VPC attributes set to true for vpc-xxxxx

NAT Gateway と VPC エンドポイントの料金計算比較

同じケースで NAT Gateway を作ってルートテーブルを編集するという手順でも接続可能です。

東京リージョンでの料金を以下に記載します。

リソース自体の料金の比較

NAT Gatewayあたりの料金 (USD/時) 各 AZ の Interface 型 VPC エンドポイント 1 つあたりの料金 (USD/時間)
USD 0.062 USD 0.014

セッションマネージャーのための Interface 型 VPC エンドポイントは 3 つ必要なので、構築したリソース自体の料金の比較であれば

  • NAT Gateway:USD 0.062
  • Interface 型 VPC エンドポイント:USD 0.042(= 0.014 * 3)

と、若干 VPC エンドポイントの方がお得です。

通信料金の比較

NAT Gateway の通信料

NAT Gateway 処理データ 1 GiB あたりの料金 (USD)
USD 0.062

Interface 型 VPC エンドポイントの通信料

Interface 型 VPC エンドポイント AWS リージョンで 1 か月に処理されるデータ 処理データ 1 GiB あたりの料金 (USD)※
最初の 1 PB 0.01 USD
次の 4 PB 0.006 USD
5 PB以上のもの 0.004 USD

※AWS リージョン内のすべてのインターフェイスエンドポイントが処理するデータの合計

処理データ 1 GiB あたりの料金は

  • NAT Gateway:USD 0.062
  • Interface 型 VPC エンドポイント:USD 0.03

と、これも VPC エンドポイントの方がお得です。

今回は一時的にセッションマネージャーで EC2 インスタンスに接続したい場合の試算です。
他にも AWS サービス向けに通信したいリソースが多くある場合、リソースの分だけ VPC エンドポイントの数が増えて管理が煩雑化し、料金が増える可能性があります。その場合は NAT Gateway の方が管理コストが下がり料金も安くなる可能性があります。

参考

SSM Agent の更新や SSM Agent のインストールに必要な PRM ファイルのダウンロードが必要な場合、別途 Gateway 型 S3 エンドポイント(com.amazonaws.ap-northeast-1.s3)が必要です。Gateway 型 S3 エンドポイントはセキュリティグループという概念がないので、エンドポイントポリシーで VPC 内の EC2 インスタンスからの接続が許可されていれば通信可能です。以下記事も参考にしてください。

終わりに

既に先人が誰か作っていそうな気がしましたが、検索でヒットしなかったのでブログにしました。一時作業などでお役に立てば幸いです。

この記事をシェアする

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.