こんにちは、ロジカル・アーツの井川です。
ここ最近、SSM(AWS Systems Manager)を使用して EC2 インスタンスに接続する機会が増えてきたので、その手順をまとめたいと思います。SSM を使用することで、踏み台サーバを必要とせず、また、接続のために所定のポートを開放しなくてもよくなります。 今回は、プライベートサブネットにある EC2 インスタンス(Windows Server)に接続します。
はじめに
この記事は、基本的には本文で述べられている設定通りに進められる想定で書いていますが、既にお持ちのリソース(VPCやサブネットなど)を使用することも可能です。その場合は、設定値などを適宜読み替えてください。
前提条件
接続のために必要な条件や、今回の作業に関して前提とする項目を以下に記載します。インストールや設定が必要なものについては、該当リンク先を参照ください。
クライアント(接続元 PC)
- AWS CLI のインストール(バージョンは 1.16.12 以上)
- SSM 接続に必要な権限を持つクレデンシャルを設定済み(検証目的であれば、AmazonSSMFullAccess ポリシーに相当する権限を含む IAM ユーザで問題ないと思います。また、コンソールで作業を行う IAM ユーザと同一で問題ありません)
- Session Manager plugin のインストール
- RDP クライアントが使用可能
サーバ
- SSM Agent のインストール(バージョンは 2.3.672.0 以上)
- EC2 インスタンスに SSM を実行するのに必要な IAM ロールがアタッチされている(ロールの権限については、IAM ロールの作成で少し触れます)
その他
- リソースの作成はコンソール画面で行う
- AWS リソースは東京リージョン(ap-northeast-1)に作成
- クライアント PC の OS は Windows 10
- 接続対象サーバは Windows Server 2019
- 接続対象サーバはプライベートサブネットにある
なお、AWS が用意している AMI から作成したインスタンスの中には、SSM Agent が予めインストールされているものもあります。今回の Windows Server もその一つです。したがって、SSM Agent のインストール作業は不要になります。該当する AMI については、以下のリンクを参照ください。(このリンクは、上の SSM Agent のインストールのリンクと同じです。)
システム構成
この記事では、以下のシステム構成を扱います。
インスタンスの SSM Agent と SSM API との通信経路を用意する必要があります。プライベートサブネットの場合は、NAT ゲートウェイを使用することもできますが、今回は VPC エンドポイントを使用する方針で進めます。
手順
以下の手順では、一部省略されたものがあります。これらについては、該当箇所で参考になると思われる過去の記事へのリンクを載せますので、必要であればご参照ください*1。
VPC、サブネットの作成
詳細な手順は省略しますが、以下の設定で作成します。作成方法については、必要であれば以下の記事を参照してください。
リソース | 名前 | CIDR | 備考 |
---|---|---|---|
VPC | demo-vpc | 10.0.0.0/24 | |
サブネット | demo-private | 10.0.0.32/28 | プライベートサブネット。demo-vpc 内に作成 |
プライベート DNS の有効化
VPC の「DNS ホスト名」と「DNS 解決」を有効にしておく必要があります。
VPC コンソール画面で、画面左側の「VPC」を選択します。使用する VPC(ここでは demo-vpc
)にチェックを入れ、「詳細」タブを選択します。このとき、「DNS ホスト名」と「DNS 解決」が有効になっているかどうかを確認します。
有効になっていない場合は、「アクション」をクリックし、表示されたリストの中から編集したいものを選択します。
以下は「DNS ホスト名を編集」を選択した場合の参考画像です(「DNS 解決を編集」を選択してもほぼ同様の画面です)。 「有効化」にチェックを入れ、「変更を保存」をクリックすれば完了です。
セキュリティグループの作成
二つ作成します。一つは EC2 インスタンス用、もう一つは VPC エンドポイント用です。設定値のみ記載します。作成方法については、必要であれば以下の記事を参照してください。
設定値
セキュリティグループ名 | 説明 | VPC | インバウンドルール | アウトバウンド | タグ | 備考 |
---|---|---|---|---|---|---|
demo-ec2-sg | Security group for EC2 | demo-vpc | なし | デフォルトのまま | キー:Name 値:demo-vpce-sg |
EC2 インスタンス用 |
demo-vpce-sg | Security group for VPC Endpoints | demo-vpc | 下記参照 | デフォルトのまま | キー:Name 値:demo-vpce-sg |
VPC エンドポイント用 |
- demo-vpce-sg のインバウンドルール
タイプ | プロトコル | ポート範囲 | リソースタイプ | ソース | 説明 |
---|---|---|---|---|---|
HTTPS | TCP | 443 | カスタム | 10.0.0.32/28 |
補足
- EC2 インスタンスのセキュリティグループは、ポートを開けなくても接続できることを確認するため、インバウンドルールを設定しません
- エンドポイントへの通信は HTTPS (443 ポート) で行われます。今回は、プライベートサブネット(
demo-private
)から来た HTTPS 通信のみを許可するように設定します
VPC エンドポイントの作成
以下のエンドポイントが必要になります:
- com.amazonaws.ap-northeast-1.ssm
- com.amazonaws.ap-northeast-1.ssmmessages
- com.amazonaws.ap-northeast-1.ec2messages
作成手順はほとんど同じなので、ssm エンドポイントのみ画像付きで説明しようと思います。
ssm エンドポイントの作成
VPC コンソール画面で、画面左側の「エンドポイント」を選択します。その後、「エンドポイントの作成」をクリックします。(以下の画像では2つありますが、どちらをクリックしても大丈夫です。)
- 「サービスカテゴリ」は「AWS サービス」を選択します
- 「サービス名」の下側にある検索フィールドに「ssm」と入力します。表示されたサービス名から「com.amazonaws.ap-northeast-1.ssm」を選択します
- 「VPC*」は今回使用するものを選択します。ここでは
demo-vpc
を選択しています(入力欄をクリックすれば、VPC のリストが名前付きで表示されます)
- 「サブネット」では、使用したいサブネットのあるアベイラビリティゾーンにチェックを入れ、サブネットを選択します。ここではアベイラビリティゾーンは
ap-northeast-1a
、サブネットはdemo-private
を選択しています - 「プライベート DNS 名を有効にする」で「このエンドポイントで有効にする」にチェックを入れます
- 「セキュリティグループ」で、エンドポイントに割り当てるセキュリティグループを選択します。ここでは、
demo-vpce-sg
を選択しています - 「ポリシー*」は、今回は「フルアクセス」を選択します
見やすくするために、一応名前を付けておきましょう。記事中では以下のように設定します。
キー | 値 |
---|---|
Name | demo-ssm-vpce |
最後に、「エンドポイントの作成」をクリックします。
以下のような画面になると思います。続けて残りの二つも作成していきましょう。
ssmmessages エンドポイントの作成
ssm エンドポイントの作成と異なるのは、「サービス名」と「タグ」のところだけなので、その点のみ説明します。
「サービス名」の下側の検索フィールドに「ssm」と入力し、表示されたサービス名から「com.amazonaws.ap-northeast-1.ssmmessages」を選択します。
「タグ」については、以下のように設定します。
キー | 値 |
---|---|
Name | demo-ssmmessages-vpce |
その他の設定がすべて完了したら、「エンドポイントの作成」をクリックします。
ec2messages エンドポイントの作成
「サービス名」の下側の検索フィールドに「ec2」と入力し、表示されたサービス名から「com.amazonaws.ap-northeast-1.ec2messages」を選択します。
「タグ」については、以下のように設定します。
キー | 値 |
---|---|
Name | demo-ec2messages-vpce |
その他の設定がすべて完了したら、「エンドポイントの作成」をクリックします。
以下の画像のように「ステータス」が「使用可能」になれば、エンドポイントを介した通信ができるようになります。(通常は残りの作業をしている間になっているので、特に待つ必要はありません。)
IAM ロールの作成
EC2 インスタンスに SSM 接続可能なロールが割り当てられている必要があります。今回の操作では、AmazonSSMManagedInstanceCore ポリシーがあれば十分なので、そのポリシーをアタッチしたロールを用意します。
IAM コンソール画面に移動します。 画面左側の「ロール」を選択し、「ロールの作成」をクリックします。
「AWS サービス」を選択し、「EC2」を選択します。 「次のステップ: アクセス権限」をクリックします。
検索フィールドに「ssm」と入力します。 表示されたポリシーの中から「AmazonSSMManagedInstanceCore」を選択し、「次のステップ: タグ」をクリックします。
タグは特に設定せず、「次のステップ: 確認」をクリックします。
「ロール名*」に「demo-ssm」と入力し、「ロールの作成」をクリックします。
以上で IAM ロールの作成は完了です。
Windows Server の作成
細かい手順は省略しますが、ポイントとなる点を以下に示します。作成方法については、必要であれば以下の記事を参照してください。
項目名 | 値 | 備考 |
---|---|---|
AMI | Microsoft Windows Server 2019 Base | クイックスタートから選択 |
VPC | demo-vpc | 上記で作成したもの |
IAM | demo-ssm | 上記で作成したもの |
セキュリティグループ | demo-ec2-sg | 上記で作成したもの |
タグ | キー:Name 値:demo-ws2019 |
接続
Windows Server に接続するためにはパスワードが必要になります。以下ではコンソールを使用したパスワードの取得方法を説明します*2。
パスワードの取得
EC2 コンソール画面で、パスワードを取得したいインスタンスにチェックを入れ、「アクション」>「セキュリティ」>「Windows パスワードを取得」の順にクリックします。ついでにインスタンス ID も控えておきます。
「Browse」をクリックし、インスタンス作成時に使用したキーペアを選択するか、下のテキストボックスに当該キーペアの内容を直接貼り付けます。 いずれかの作業の後に「パスワードを暗号化」をクリックします。
パスワードが表示されるので控えておきます。
AWS CLI の実行
PowerShell を起動し、以下のコマンドを実行します。
<instance-id>
は接続したいインスタンス ID に、<profile-name>
は使用するプロファイル名に置き換えてください。(プロファイル名が default
の場合は、--profile <profile-name>
は省略できます。)
aws ssm start-session ` --target <instance-id> ` --document-name AWS-StartPortForwardingSession ` --parameters portNumber=3389,localPortNumber=13389 ` --profile <profile-name>
PowerShell は起動したままにします。
RDP クライアントによる接続
Windows キー + R
を押し、「ファイル名を指定して実行」を起動します。「名前」に mstsc
と入力し、「OK」をクリックします。
RDP クライアントが立ち上がるので、「コンピューター」に localhost:13389
と入力し、「接続」をクリックします。
パスワード欄に先程メモした値を入力し、「OK」をクリックします。 (ユーザー名が Administrator 以外になっている場合は、「その他」をクリックし、「別のアカウントを使用する」をクリックしてから、ユーザー名に Administrator を入力してください。)
セキュリティ警告画面が出てきますが、構わず「はい」をクリックします。
以下のような画面が表示されれば成功です!
おわりに
お疲れ様でした。踏み台サーバが無く、RDP 用のポート(3389)を開放しない状態でも EC2 インスタンスに接続できることが確認できたと思います。最初のうちは色々設定もあり、少々難しく思いますが、非常に便利な機能ではないでしょうか。