はじめに
皆さんこんにちは!秋も深まってきたので、頭をオレンジ色に紅葉させた廣原です。
今回は、EC2で構築したWindows サーバにSession Manager(以下SSM)を使って接続する方法を書こうと思います!
SSMを使用することで「踏み台サーバを経由せずに」プライベートサブネット内のインスタンスに接続することができるんです!
それでは早速やってみましょう!
前提
今回ですが、以下の準備が済んでいることを前提として進めます。
- VPC, プライベートサブネットを構築済み
- プライベートサブネット内にWindowsサーバを一台構築済み
- AWS CLIが手元にインストール済み
今回は以下の手順で進めていきます!
- SSMでインスタンスに接続する用のIAMユーザを作成する
- VPCエンドポイントを作成する
- インスタンスにロールをアタッチする
- AWS CLIを使ってインスタンスに接続する
こんな少ない作業でいいんです!
それではれっつら!
1. IAMユーザを作成する
まずはインスタンスに接続する用のユーザと、それに当てるポリシーを作成していきます。
Admin権限が付与されていれば問題ないのですが、「テストチームにインスタンスへの接続だけしてもらいたい!」のような要件もあると思いますので、どのポリシーを持っていればインスタンスに接続できるのかご紹介します。
早速ポリシーから作成しましょう。
AWS IAM コンソールを表示し、左側に表示されるメニューから「ポリシー」を選択した後、「ポリシーの作成」ボタンをクリックします。
ポリシーの作成画面に遷移するので、JSONタブをクリックし、ポリシーをJSON形式で定義するエディタを表示します。
切り替えましたら、以下のJSONを貼り付けてください。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssm:StartSession"
],
"Resource": [
"*"
]
},
{
"Effect": "Allow",
"Action": [
"ssm:TerminateSession",
"ssm:ResumeSession"
],
"Resource": [
"arn:aws:ssm:*:*:session/${aws:username}-*"
]
}
]
}
一番良いのはssm:StartSession
の下の`Resource`で接続可能なインスタンスを絞る方法なのですが、今回は簡易的にすべて(*)のリソースへのアクセスを許可しています(笑)
ポリシー名には任意の名前を入力し(SSMで接続するためのポリシーであることが分かったほうが後々楽です)、「ポリシーの作成」ボタンが表示されるまで進め、ボタンを押せばOKです!
次にユーザを作成します。
左メニューからユーザを選択し、「ユーザの作成ボタン」をクリック。
ユーザ名は任意のものを入力してください。
「AWSアクセスの種類を選択」とありますが、今回はAWS CLIを使用するので「アクセスキー・プログラムによるアクセス」は必ず選択してください。
あとは任意で選択していただき、次のステップに進みます。
次のステップではユーザのアクセス許可を設定するので、ここで先程作成したポリシーを選択します。
「既存のポリシーを直接アタッチ」を選択し、ポリシーのフィルタで先程作成したポリシー名を入力、選択して次のステップへ進みます。
必要に応じてユーザにタグを付与していただき、確認画面へ進んで「ユーザの作成ボタン」を押したらIAMユーザの作成は完了です!
ユーザのアクセスキーなどが書かれているcsvファイルをダウンロードするボタンが表示されますので、必ずダウンロードしましょう。(インスタンス接続時に、中に書かれているアクセスキーとシークレットキーが必要です)
2. VPCエンドポイントを作成する
続いてVPCエンドポイントを作成します。
SSMとプライベートなインスタンスがインターネットを経由せずに通信するためには、VPCエンドポイントが必要です。
今回作成するのは以下3つのエンドポイントです。
- com.amazonaws.[region].ssm
- com.amazonaws.[region].ec2messages
- com.amazonaws.[region].ssmmessages
regioinにはインスタンスが存在するリージョン名が入ります。
まずはVPCコンソールを開き、左メニューから「エンドポイント」を選択、「VPCエンドポイントを作成」ボタンから作成画面を開きます。
エンドポイント名には任意の名前を入力してください。
なおエンドポイントは1つずつ作成する必要があるので、どのエンドポイントか分かる名前がいいと思います。
その下のサービスから作成するエンドポイントを選択します。
VPCの欄では、エンドポイントを作成するサブネットを選択します。
はじめはサブネットの入力欄が表示されていませんが、VPCを選択すると表示されるようになります。
またサブネットもアベイラビリティゾーンにチェックを入れないと選択できないので注意が必要です。
サブネットとIPアドレスタイプ(IPv4)を選択したら、セキュリティグループの選択に移ります。
セキュリティグループはデフォルトで用意されているもので問題ないと思いますが、必要に応じて「インスタンスが属するセキュリティグループ」からのアクセスを許可したセキュリティグループを用意すると良いでしょう。
あとは「エンドポイントを作成」ボタンを押せばOKです!これを3エンドポイント分繰り返します。
3. インスタンスにロールをアタッチする
次はインスタンスに対してSSMで接続するためのロールをアタッチします。
まずはロールを作成します。
IAMコンソールを開き、左メニューのロールを選択、「ロールを作成」ボタンをクリックします。
まずは上図のようにどのAWSサービスに対してロールを作成するかを選択する画面が表示されるので、「AWSのサービス」、「EC2」を選択します。
次へを押すと、ロールに対してどのポリシーを当てるかを選択する画面が表示されるので、以下のポリシーを検索、選択します。
AmazonSSMManagedInstanceCore
次へボタンを押して任意のロール名を入力、ロールの作成ボタンを押したらロールの作成は完了です!
このロールを、SSMで接続したいインスタンスにアタッチします!
まずはEC2コンソールを表示し、接続したいインスタンスを選択します。
右上の「アクション」ボタンから、「セキュリティ > IAMロールを変更」の順で選択します。
IAMロールの変更画面が表示されるので、先ほど作成したロールを選択して「IAMロールの更新」をしましょう!
これでインスタンスにSSMで接続する準備はOKです!
4. AWS CLIを使ってインスタンスに接続する
いよいよお待ちかねの接続タイムです!
まずはPowerShellなどを起動し、以下のコマンドを入力します。
aws configure
入力するとアクセスキーの入力などを求められるので、1でダウンロードしたcsvに書かれているアクセスキー、シークレットキーを入力します。
リージョン名にはインスタンスを作ったリージョン名を、フォーマットはjsonと入力します。
これで1で作成したユーザに切り替えることができます!
次に以下のコマンドを入力します。
aws ssm start-session --target [instanceID] --document-name AWS-StartPortForwardingSession --parameters "portNumber=3389, localPortNumber=13389"
[instanceID]の部分には、[]なしで接続するインスタンスのIDを入力してください。
入力後、以下のような文字が表示されればOKです!
では、自分のPCでリモートデスクトップ接続を起動し、接続してみましょう!
左下の検索バーで「RDP」と検索し、「リモートデスクトップ接続」を起動します。
「コンピュータ」には「localhost:13389」と入力しましょう。
ユーザ名にはadministrator、パスワードはインスタンスに付与されたパスワードを入力します。
色々許可を求められるかもしれませんが、すべて許可して下さい。
最終的にこのような画面が表示されればOKです!
接続できない?
手順通りやったのに接続できない!というときには以下の原因が考えられます。
- インスタンスが起動していない、まだロールが有効になっていない
- インスタンスにロールが割当っていない
- VPCエンドポイントが作成されていない
- AWS CLIで使用しているユーザが違う
このあたりを見直してみるといいかと思います。
ここに注意!
これは私がやってしまったのですが、VPCエンドポイントは作っておくだけで料金が発生してしまうので、お試しで作る場合は作って放置などしないようにしましょう^^;
さいごに
いかがでしたか?
このようにSSMを使用することでインターネットに接続しなくても、踏み台サーバを作成しなくてもプライベートなインスタンスに接続することができます!
是非、お試しください!
参考リンク
Session Manager の追加サンプル IAM ポリシー
ステップ 4: Systems Manager の IAM インスタンスプロファイルを作成する
Systems Manager を使用してインターネットアクセスなしでプライベート EC2 インスタンスを管理できるように、VPC エンドポイントを作成するにはどうすればよいですか?