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

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

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

コーヒーが好きな 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

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

この状態から、
emiki_sessionmanagerep_cfn_1

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_COMPLET!E」になれば削除完了です。

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

注意

  • 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 の方が管理コストが下がり料金も安くなる可能性があります。

https://aws.amazon.com/jp/vpc/pricing/

https://aws.amazon.com/jp/privatelink/pricing/

参考

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

https://dev.classmethod.jp/articles/ssm-agent-private-install/

https://dev.classmethod.jp/articles/private-ec2-ssm-vpcendpoint-policy/

https://repost.aws/ja/knowledge-center/install-ssm-agent-ec2-linux

https://repost.aws/ja/knowledge-center/ec2-systems-manager-vpc-endpoints

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/setup-create-vpc.html

終わりに

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

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.