既存 VPC 内の EC2 インスタンスに Systems Manager セッションマネージャーで接続するためのエンドポイントだけを一発で作成するCloudFormationテンプレートを作った
コーヒーが好きな 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.ssm
、com.amazonaws.ap-northeast-1.ssmmessages
、com.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 インスタンスが通信可能なサブネットを選択してください
- VPC エンドポイントを作成するサブネットを選択
- VpcId
- VPC エンドポイントを作成する VPC を選択
上記パラメータを入力したら「次へ」をクリックします。
「スタックオプションの設定」画面では何もせず次へ進み、「確認して作成」画面で「送信」をクリックします。
スタックの状態が 1~2 分程度で「CREATE_IN_PROGRESS」から「CREATE_COMPLETE」に変わります。
リソースタブを確認すると、Interface 型 VPC エンドポイント 3 つと、セキュリティグループ 1 つが作成されています。
EC2 コンソール画面でセキュリティグループを確認すると、「vpcep-sg」というセキュリティグループが作成されているのが分かります。
VPC コンソール画面でエンドポイントを確認すると、com.amazonaws.ap-northeast-1.ssm
、com.amazonaws.ap-northeast-1.ssmmessages
、com.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 インスタンスからの接続が許可されていれば通信可能です。以下記事も参考にしてください。
終わりに
既に先人が誰か作っていそうな気がしましたが、検索でヒットしなかったのでブログにしました。一時作業などでお役に立てば幸いです。