このページの本文へ

FIXER cloud.config Tech Blog

SSMでプライベートなEC2インスタンスに踏み台なしで接続してみる

2022年11月09日 10時00分更新

文● 廣原 花音/FIXER

  • この記事をはてなブックマークに追加
  • 本文印刷

 本記事はFIXERが提供する「cloud.config Tech Blog」に掲載された「プライベートなEC2インスタンスに踏み台なしで接続してみる」を再編集したものです。

はじめに


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

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

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

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

前提

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

・VPC、プライベートサブネットを構築済み
・プライベートサブネット内にWindowsサーバーを1台構築済み
・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エンドポイントを作成」ボタンから作成画面を開きます。

エンドポイント名には任意の名前を入力してください。

なおエンドポイントはひとつずつ作成する必要があるので、どのエンドポイントか分かる名前がいいと思います。

作成するエンドポイントの選択画面

 その下のサービスから作成するエンドポイントを選択します。

 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 エンドポイントを作成するにはどうすればよいですか?

廣原 花音/FIXER廣原 花音
(ひろはら かのん) 入社2年目
バドミントンと食べることをこよなく愛しています。

[転載元]
 プライベートなEC2インスタンスに踏み台なしで接続してみる

カテゴリートップへ