Blogical

AWS/Salesforceを中心に様々な情報を配信していきます(/・ω・)/

SSM を使用したプライベート EC2 インスタンスへの接続

こんにちは、ロジカル・アーツの井川です。

ここ最近、SSM(AWS Systems Manager)を使用して EC2 インスタンスに接続する機会が増えてきたので、その手順をまとめたいと思います。SSM を使用することで、踏み台サーバを必要とせず、また、接続のために所定のポートを開放しなくてもよくなります。 今回は、プライベートサブネットにある EC2 インスタンスWindows Server)に接続します。

はじめに

この記事は、基本的には本文で述べられている設定通りに進められる想定で書いていますが、既にお持ちのリソース(VPCやサブネットなど)を使用することも可能です。その場合は、設定値などを適宜読み替えてください。

前提条件

接続のために必要な条件や、今回の作業に関して前提とする項目を以下に記載します。インストールや設定が必要なものについては、該当リンク先を参照ください。

クライアント(接続元 PC)

サーバ

その他

  • リソースの作成はコンソール画面で行う
  • AWS リソースは東京リージョン(ap-northeast-1)に作成
  • クライアント PC の OS は Windows 10
  • 接続対象サーバは Windows Server 2019
  • 接続対象サーバはプライベートサブネットにある

なお、AWS が用意している AMI から作成したインスタンスの中には、SSM Agent が予めインストールされているものもあります。今回の Windows Server もその一つです。したがって、SSM Agent のインストール作業は不要になります。該当する AMI については、以下のリンクを参照ください。(このリンクは、上の SSM Agent のインストールのリンクと同じです。)

docs.aws.amazon.com

システム構成

この記事では、以下のシステム構成を扱います。

f:id:logicalarts:20210520175721p:plain

インスタンスの SSM Agent と SSM API との通信経路を用意する必要があります。プライベートサブネットの場合は、NAT ゲートウェイを使用することもできますが、今回は VPC エンドポイントを使用する方針で進めます。

手順

以下の手順では、一部省略されたものがあります。これらについては、該当箇所で参考になると思われる過去の記事へのリンクを載せますので、必要であればご参照ください*1

VPC、サブネットの作成

詳細な手順は省略しますが、以下の設定で作成します。作成方法については、必要であれば以下の記事を参照してください。

blog.logical.co.jp

リソース 名前 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 解決」が有効になっているかどうかを確認します。

f:id:logicalarts:20210520102156p:plain

有効になっていない場合は、「アクション」をクリックし、表示されたリストの中から編集したいものを選択します。

f:id:logicalarts:20210421154408p:plain

以下は「DNS ホスト名を編集」を選択した場合の参考画像です(「DNS 解決を編集」を選択してもほぼ同様の画面です)。 「有効化」にチェックを入れ、「変更を保存」をクリックすれば完了です。

f:id:logicalarts:20210421154403p:plain

セキュリティグループの作成

二つ作成します。一つは EC2 インスタンス用、もう一つは VPC エンドポイント用です。設定値のみ記載します。作成方法については、必要であれば以下の記事を参照してください。

blog.logical.co.jp

設定値

セキュリティグループ名 説明 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つありますが、どちらをクリックしても大丈夫です。)

f:id:logicalarts:20210420134937p:plain

  • サービスカテゴリ」は「AWS サービス」を選択します
  • サービス名」の下側にある検索フィールドに「ssm」と入力します。表示されたサービス名から「com.amazonaws.ap-northeast-1.ssm」を選択します
  • VPC*」は今回使用するものを選択します。ここでは demo-vpc を選択しています(入力欄をクリックすれば、VPC のリストが名前付きで表示されます)

f:id:logicalarts:20210420132737p:plain

  • サブネット」では、使用したいサブネットのあるアベイラビリティゾーンにチェックを入れ、サブネットを選択します。ここではアベイラビリティゾーンは ap-northeast-1a、サブネットは demo-private を選択しています
  • プライベート DNS 名を有効にする」で「このエンドポイントで有効にする」にチェックを入れます

f:id:logicalarts:20210420132731p:plain

  • セキュリティグループ」で、エンドポイントに割り当てるセキュリティグループを選択します。ここでは、demo-vpce-sg を選択しています
  • ポリシー*」は、今回は「フルアクセス」を選択します

f:id:logicalarts:20210420132725p:plain

見やすくするために、一応名前を付けておきましょう。記事中では以下のように設定します。

キー
Name demo-ssm-vpce

最後に、「エンドポイントの作成」をクリックします。

f:id:logicalarts:20210420132718p:plain

以下のような画面になると思います。続けて残りの二つも作成していきましょう。

f:id:logicalarts:20210422153902p:plain

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

その他の設定がすべて完了したら、「エンドポイントの作成」をクリックします。

以下の画像のように「ステータス」が「使用可能」になれば、エンドポイントを介した通信ができるようになります。(通常は残りの作業をしている間になっているので、特に待つ必要はありません。) f:id:logicalarts:20210422162458p:plain

IAM ロールの作成

EC2 インスタンスに SSM 接続可能なロールが割り当てられている必要があります。今回の操作では、AmazonSSMManagedInstanceCore ポリシーがあれば十分なので、そのポリシーをアタッチしたロールを用意します。

IAM コンソール画面に移動します。 画面左側の「ロール」を選択し、「ロールの作成」をクリックします。

f:id:logicalarts:20210513174715p:plain

AWS サービス」を選択し、「EC2」を選択します。 「次のステップ: アクセス権限」をクリックします。

f:id:logicalarts:20210513174707p:plain

検索フィールドに「ssm」と入力します。 表示されたポリシーの中から「AmazonSSMManagedInstanceCore」を選択し、「次のステップ: タグ」をクリックします。

f:id:logicalarts:20210513174702p:plain

タグは特に設定せず、「次のステップ: 確認」をクリックします。

f:id:logicalarts:20210513174657p:plain

ロール名*」に「demo-ssm」と入力し、「ロールの作成」をクリックします。

f:id:logicalarts:20210513174652p:plain

以上で IAM ロールの作成は完了です。

Windows Server の作成

細かい手順は省略しますが、ポイントとなる点を以下に示します。作成方法については、必要であれば以下の記事を参照してください。

blog.logical.co.jp

項目名 備考
AMI Microsoft Windows Server 2019 Base クイックスタートから選択
VPC demo-vpc 上記で作成したもの
IAM demo-ssm 上記で作成したもの
セキュリティグループ demo-ec2-sg 上記で作成したもの
タグ キー:Name
値:demo-ws2019

接続

Windows Server に接続するためにはパスワードが必要になります。以下ではコンソールを使用したパスワードの取得方法を説明します*2

パスワードの取得

EC2 コンソール画面で、パスワードを取得したいインスタンスにチェックを入れ、「アクション」>「セキュリティ」>「Windows パスワードを取得」の順にクリックします。ついでにインスタンス ID も控えておきます。

f:id:logicalarts:20210422162454p:plain

Browse」をクリックし、インスタンス作成時に使用したキーペアを選択するか、下のテキストボックスに当該キーペアの内容を直接貼り付けます。 いずれかの作業の後に「パスワードを暗号化」をクリックします。

f:id:logicalarts:20210422162449p:plain

パスワードが表示されるので控えておきます。

f:id:logicalarts:20210422162444p:plain

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」をクリックします。

f:id:logicalarts:20210422162440p:plain

RDP クライアントが立ち上がるので、「コンピューター」に localhost:13389 と入力し、「接続」をクリックします。

f:id:logicalarts:20210422162436p:plain

パスワード欄に先程メモした値を入力し、「OK」をクリックします。 (ユーザー名が Administrator 以外になっている場合は、「その他」をクリックし、「別のアカウントを使用する」をクリックしてから、ユーザー名に Administrator を入力してください。)

f:id:logicalarts:20210422162432p:plain

セキュリティ警告画面が出てきますが、構わず「はい」をクリックします。

f:id:logicalarts:20210519160747p:plain

以下のような画面が表示されれば成功です!

f:id:logicalarts:20210422162425p:plain

おわりに

お疲れ様でした。踏み台サーバが無く、RDP 用のポート(3389)を開放しない状態でも EC2 インスタンスに接続できることが確認できたと思います。最初のうちは色々設定もあり、少々難しく思いますが、非常に便利な機能ではないでしょうか。

参考リンク

*1:ただ、UI が若干変わっていたり、説明の読み替えが必要だったりして、ないよりはまし程度かもしれません。。

*2:この方法は、AWS の用意している AMI からインスタンスを作成したときには有効ですが、自身で取得した AMI から作成したインスタンスに対しては取得できません。ただし、パスワード自体はイメージ取得前のものが引き継がれているので、ログイン自体は可能です。