【AWS_48_03】セッションマネージャーを利用してプライベートサブネットのEC2インスタンスへSSH接続する(VPCエンドポイントがある場合)

セッションマネージャーについて一度記事を書いたのですが、あらためて検証をしてみるといろいろと疑問が出てきて、あらためて整理しないとと感じました。
それは以下3点の場合にそれぞれ設定は異なるがどうすればいいのだろうということでした。(それぞれ検証して記事にしていますのでご興味ある方は、リンクからアクセスしてください。
・EC2インスタンスがパブリックサブネットにある場合
・EC2インスタンスがプライベートサブネットにあり、インターネットへのアウトバウンド通信経路がある場合
・EC2インスタンスがプライベートサブネットにあり、インターネットへのアウトバウンド通信経路がない場合
また、使用するユーザーが管理者レベル、一般ユーザーレベルで必要な設定も変わるのかなというところも疑問に思いました。
このあたりを検証して整理したいと思います。
今回は、「EC2インスタンスがプライベートサブネットにあり、インターネットへのアウトバウンド通信経路がない場合」を検証します。
検証のポイントは、以下となります。
・VPCの設定で「DNS名を有効化」を有効化する
・プライベートサブネット内からVPC外部(AWS内部ネットワーク)へ接続する経路としてVPCエンドポイントを作成する
・EC2インスタンスには、セッションマネージャー接続のためのIAMロール(AmazonSSMManagedInstanceCore)を割り当てる
・EC2インスタンス用のセキュリティグループを設定する(インバウンド:不要、アウトバウンド:443ポートを許可)
※アウトバウンドはデフォルトですべてのトラフィックを許可しているのでそれを利用する
・VPCエンドポイント用のセキュリティグループを設定する(インバウンド:443ポートを許可、アウトバウンド:不要)
・VPCエンドポイントを3つ作成する
com.amazonaws.region.ssm
com.amazonaws.region.ssmmessages
com.amazonaws.region.ec2messages
・管理者ユーザー(admin)へ、AdministratorAccessポリシーをアタッチする
・一般ユーザー(user01)へ、カスタマーポリシー、AmazonEC2FullAccessポリシーをアタッチする

目次
前提
設定は、admin(管理者)で作業しています。admin(管理者)には、AdministratorAccessポリシーを適用しています。
user01(一般ユーザー)は、作成済みとして進めます。
VPCの作成
VPCを作成します。作成方法がわからない方は、以下記事を参考にしてください。
VPC作成後、チェックを入れてアクション > VPCの設定を編集 をクリックします。

「DNS ホスト名を有効化」にチェックを入れて、「保存」をクリックします。
※この設定は、VPCエンドポイントの設定で「DNS名を有効化」にチェックを入れるために必要となります。(この設定なしで検証していたのでしばらくはまりました・・・)

プライベートサブネットの作成
プライベートサブネットを作成します。作成方法がわからない方は、以下記事を参考にしてください。
※IPv4 サブネット CIDR ブロックは、10.0.2.0/24 で作成しています

プライベートサブネットへEC2インスタンスを作成
プライベートサブネットへEC2インスタンスを作成します。作成方法がわからない方は、以下記事を参考にしてください。
※サーバ名は、pri-sv にしました
※キーペアは、「キーペアなしで続行」を選択します
※パブリック IP の自動割り当ては、無効化にします
※セキュリティグループ名は、pri-sv-sg にしました
※セキュリティグループのインバウンドセキュリティグループのルールは、削除して空にします
IAMロールを作成し、EC2インスタンスへアタッチ
IAMロールの作成
AWSマネジメントコンソールで「iam」を検索します。
左ペインのロールをクリック、画面右上の「ロールを作成」をクリックします。
「信頼されたエンティティタイプ」で「AWSのサービス」を選択します。

「ユースケース」で「EC2」を選択し、「次へ」をクリックします。

「許可ポリシー」で「AmazonSSMManagedInstanceCore」を検索し、左側にチェックを入れて「次へ」をクリックします。

「ロールの詳細」へロール名を入力します。
その他はデフォルトのままで「ロールを作成」をクリックします。



IAMロールが作成されました。

IAMロールをEC2インスタンスへアタッチ
AWSマネジメントコンソールで「ec2」を検索します。
左ペインのインスタンスをクリック、作成したEC2インスタンスにチェックを入れます。
アクション > セキュリティ > IAMロールを変更 をクリックします。

プルダウンから作成したIAMロールを選択し、「IAMロールの更新」をクリックします。

EC2インスタンスの「セキュリティ」タブでIAMロールがアタッチされていることを確認します。


EC2インスタンスのセキュリティグループの確認
AWSマネジメントコンソールで「ec2」を検索します。
左ペインのセキュリティグループをクリック、EC2インスタンス用のセキュリティグループ(pri-sv-sg)にチェックを入れます。

「インバウンドルール」タブは「ルールなし」、「アウトバウンドルール」タブは、「すべてのトラフィックが許可」となっていることを確認しておきます。

VPCエンドポイント用のセキュリティグループを作成
AWSマネジメントコンソールで「vpc」を検索します。
左ペインのセキュリティグループをクリック、「セキュリティグループを作成」をクリックします。
「セキュリティグループ名」と「説明」は、任意の名前を入力します。今回は「endpoint-sg」としました。
「VPC」は、該当のVPCを選択します。

「インバウンドルール」は、以下のとおり選択します。
タイプ:HTTPS
ソース:0.0.0.0/0
「アウトバウンドルール」、その他はデフォルトのままで「セキュリティグループを作成」をクリックします。


VPCエンドポイント用のセキュリティグループが作成されました。

VPCエンドポイントの作成
VPCエンドポイントを3つ作成します。
●com.amazonaws.region.ssm
⇒Systems Manager サービスのエンドポイント
●com.amazonaws.region.ssmmessages
⇒Systems Manager は、このエンドポイントを使用して SSM Agent から Systems Manager サービスへの呼び出しを行う
●com.amazonaws.region.ec2messages
⇒Run Command のために、および Session Manager を使用してセキュアなデータチャネル経由でインスタンスに接続している場合に、SSM Agent が Systems Manager サービスと通信する上で必要
AWSマネジメントコンソールで「vpc」を検索します。
左ペインのエンドポイントをクリック、「エンドポイントを作成」をクリックします。
「エンドポイントの設定」で任意の名前タグを入力します。今回は「ssm」としました。
「タイプ」は、「AWSのサービス」を選択します。

「サービス」の検索ウィンドウで「ssm」を入力、表示された「com.amazonaws.ap-northeast-1.ssm」を選択します。
※環境によりリージョン名(ap-northeast-1)は異なります

「ネットワーク設定」で該当のVPCを選択します。
「追加設定」の「DNS名」で「DNS名を有効化」にチェックを入れます。
※「DNS名を有効化」にチェックがないと今回の通信が確立されないのでご注意ください

「サブネット」で該当のアベイラビリティーゾーンにチェックを入れ、サブネットIDのプルダウンからプライベートサブネットを選択します。

「セキュリティグループ」は、事前に作成した「endpoint-sg」を選択します。

「ポリシー」、「タグ」はデフォルトのままで「エンドポイントを作成をクリックします。


VPCエンドポイントが作成されました。

同じ流れで残り2つのVPCエンドポイントを作成します。
設定が異なる箇所は「名前タグ」と「サービス」になります。
●com.amazonaws.region.ssmmessages
名前タグ:ssmmessages
サービス:com.amazonaws.region.ssmmessages
●com.amazonaws.region.ec2messages
名前タグ:ec2messages
サービス:com.amazonaws.region.ec2messages
3つ作成することができました。ステータスが「使用可能」になるまで少し待ちます。

EC2インスタンスの再起動
参考サイトに「EC2インスタンスからシステムマネージャーへの接続は、インスタンス起動時に行われ、SSMエージェントがシステムマネージャーへ登録を行っている」とありましたのでEC2インスタンスを再起動します。
実際、再起動せずに接続しようとしたら失敗しました。

セッションマネージャーからEC2インスタンスへ接続(admin:管理者)
AWSマネジメントコンソールで「ec2」を検索します。
左ペインのインスタンスをクリック、作成したEC2インスタンスにチェックを入れ、「接続」をクリックします。

「接続」をクリックします。
※ここで「接続」ボタンがグレーアウトしていたら設定が反映されてないか、設定に不備があります。

接続できました。「終了ボタン」やブラウザのタブを閉じるなどして切断することができます。

一般ユーザー(user01)で接続するための設定
一般ユーザー(user01)がEC2インスタンスへ接続するためには、EC2インスタンスを扱えるポリシーとセッションマネージャーに関するポリシーが必要になります。
今回、EC2インスタンスを扱えるポリシーは「AmazonEC2FullAccess」をアタッチし、
セッションマネージャーに関するポリシーは、カスタムポリシーをJSONで作成してアタッチします。
EC2インスタンスのインスタンスARNを確認
AWSマネジメントコンソールで「ec2」を検索します。
左ペインのインスタンスをクリック、該当のEC2インスタンスにチェックを入れます。
画面下の「詳細」タブを選択し、「インスタンスARN」の値を控えます。今回は「arn:aws:ec2:ap-northeast-1:750067409009:instance/i-07469275a13585563」となります。
ポリシー作成の際に必要となります。

セッションマネージャーに関するポリシーの作成
AWSマネジメントコンソールで「iam」を検索します。
左ペインのポリシーをクリック、「ポリシーの作成」をクリックします。
「ポリシーエディタ」で「JSON」を選択します。
「ポリシーエディタ」にあるコードを一度削除し、上書きする形で新しいコードを貼り付けます。


■コード
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssm:StartSession"
],
"Resource": [
"arn:aws:ec2:ap-northeast-1:750067409009:instance/i-07469275a13585563",
"arn:aws:ssm:ap-northeast-1:750067409009:document/SSM-SessionManagerRunShell"
]
},
{
"Effect": "Allow",
"Action": [
"ssmmessages:OpenDataChannel"
],
"Resource": [
"arn:aws:ssm:*:*:session/${aws:userid}-*"
]
},
{
"Effect": "Allow",
"Action": [
"ssm:DescribeSessions",
"ssm:GetConnectionStatus",
"ssm:DescribeInstanceProperties",
"ec2:DescribeInstances"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"ssm:TerminateSession",
"ssm:ResumeSession"
],
"Resource": [
"arn:aws:ssm:*:*:session/${aws:userid}-*"
]
},
{
"Effect": "Allow",
"Action": [
"ssm:DescribeInstanceInformation"
],
"Resource": [
"*"
]
}
]
}
任意のポリシー名を入力します。今回は「20250826-user01-policy」としました。

その他はデフォルトのままで「ポリシーの作成」をクリックします。

ポリシーが作成されました。

一般ユーザー(user01)へポリシーの適用
今回は、ユーザーへ直接アタッチします。
AWSマネジメントコンソールで「iam」を検索します。
左ペインのユーザーをクリック、ポリシーを適用したいユーザー選択します。今回は「user01」を選択します。
「許可」タブを選択し、「許可を追加」を選択します。

「許可のオプション」で「ポリシーを直接アタッチする」を選択します。

検索ウィンドウへ「AmazonEC2FullAccess」と入力し、表示された「AmazonEC2FullAccess」にチェックを入れます。

フィルタを一度解除(×印)し、次に作成したポリシー「20250826-user01-policy」にチェックを入れて、「次へ」をクリックします。

確認画面で「AmazonEC2FullAccess」と「20250826-user01-policy」が選択されていることを確認し、「許可を追加」をクリックします。

2つのポリシーが追加されたことを確認します。

セッションマネージャーからEC2インスタンスへ接続(user01:一般ユーザー)
admin(管理者)からサインアウトして、user01(一般ユーザー)でサインインします。
AWSマネジメントコンソールで「ec2」を検索します。
左ペインのインスタンスをクリック、作成したEC2インスタンスにチェックを入れ、「接続」をクリックします。

「接続」をクリックします。
※ここで「接続」ボタンがグレーアウトしていたら設定が反映されてないか、設定に不備があります

接続できました。「終了ボタン」やブラウザのタブを閉じるなどして切断することができます。

検証後のリソースの削除
簡単にですが、作成したリソースの削除について記載します。
・EC2インスタンス
削除
・VPCエンドポイント
削除
・IAMロール
削除
・IAMポリシー
削除
・VPC
削除
まとめ
本検証にて、セッションマネージャーを利用してプライベートサブネットのEC2インスタンスへSSH接続する(VPCエンドポイントがある場合)することができました。
これで、以下のようにセッションマネージャーを利用した接続パターンを3つ検証することができました。セッションマネージャーについて、少しは理解ができたのかなと感じました。
・【AWS_48_01】セッションマネージャーを利用してパブリックサブネットのEC2インスタンスへSSH接続する
・【AWS_48_02】セッションマネージャーを利用してプライベートサブネットのEC2インスタンスへSSH接続する(NATゲートウェイがある場合)
・【AWS_48_03】セッションマネージャーを利用してプライベートサブネットのEC2インスタンスへSSH接続する(VPCエンドポイントがある場合) ※この記事です
下、他の記事をまとめた一覧です。AWSもまとめています。