プライベートなEC2インスタンスに踏み台なしで接続してみる
2022-10-24
azblob://2022/11/11/eyecatch/2022-10-23-connect-private-instance-without-bastion-000.jpg

はじめに

皆さんこんにちは!秋も深まってきたので、頭をオレンジ色に紅葉させた廣原です。

今回は、EC2で構築したWindows サーバにSession Manager(以下SSM)を使って接続する方法を書こうと思います!

SSMを使用することで「踏み台サーバを経由せずに」プライベートサブネット内のインスタンスに接続することができるんです!

それでは早速やってみましょう!

 

前提

今回ですが、以下の準備が済んでいることを前提として進めます。

  • VPC, プライベートサブネットを構築済み
  • プライベートサブネット内にWindowsサーバを一台構築済み
  • AWS CLIが手元にインストール済み

 

今回は以下の手順で進めていきます!

  1. SSMでインスタンスに接続する用のIAMユーザを作成する
  2. VPCエンドポイントを作成する
  3. インスタンスにロールをアタッチする
  4. AWS CLIを使ってインスタンスに接続する

 

こんな少ない作業でいいんです!

それではれっつら!

 

1. IAMユーザを作成する

まずはインスタンスに接続する用のユーザと、それに当てるポリシーを作成していきます。

Admin権限が付与されていれば問題ないのですが、「テストチームにインスタンスへの接続だけしてもらいたい!」のような要件もあると思いますので、どのポリシーを持っていればインスタンスに接続できるのかご紹介します。

早速ポリシーから作成しましょう。

AWS IAM コンソールを表示し、左側に表示されるメニューから「ポリシー」を選択した後、「ポリシーの作成」ボタンをクリックします。

ポリシーの作成画面に遷移するので、JSONタブをクリックし、ポリシーをJSON形式で定義するエディタを表示します。

IAMポリシーの作成画面

切り替えましたら、以下の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です!

 

次にユーザを作成します。

左メニューからユーザを選択し、「ユーザの作成ボタン」をクリック。

IAMユーザの作成画面

ユーザ名は任意のものを入力してください。

「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ロールを変更する画面

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です!

コマンド入力後のPowerShell

 

では、自分のPCでリモートデスクトップ接続を起動し、接続してみましょう!

 

左下の検索バーで「RDP」と検索し、「リモートデスクトップ接続」を起動します。

RDPの画面

「コンピュータ」には「localhost:13389」と入力しましょう。

 

ユーザ名にはadministrator、パスワードはインスタンスに付与されたパスワードを入力します。

色々許可を求められるかもしれませんが、すべて許可して下さい。

最終的にこのような画面が表示されればOKです!

Windowsの画面が表示されました!

 

接続できない?

手順通りやったのに接続できない!というときには以下の原因が考えられます。

  • インスタンスが起動していない、まだロールが有効になっていない
  • インスタンスにロールが割当っていない
  • VPCエンドポイントが作成されていない
  • AWS CLIで使用しているユーザが違う

このあたりを見直してみるといいかと思います。

 

ここに注意!

これは私がやってしまったのですが、VPCエンドポイントは作っておくだけで料金が発生してしまうので、お試しで作る場合は作って放置などしないようにしましょう^^;

さいごに

いかがでしたか?

このようにSSMを使用することでインターネットに接続しなくても、踏み台サーバを作成しなくてもプライベートなインスタンスに接続することができます!

是非、お試しください!

参考リンク

Session Manager の追加サンプル IAM ポリシー

ステップ 4: Systems Manager の IAM インスタンスプロファイルを作成する

セッションの開始 (リモートホストへのポート転送)

Systems Manager を使用してインターネットアクセスなしでプライベート EC2 インスタンスを管理できるように、VPC エンドポイントを作成するにはどうすればよいですか?