AWS Session ManagerでPrivate Subnet EC2に接続してみた

AWS Session Managerを利用して、Private Subnet EC2に接続する方法やエラーについて整理してみました。
2021.06.11

こんにちは、今年4月に入社したKim Jaewook(キム・ジェウク)と申します。

今回は、AWS Session Managerを利用して、Private Subnet EC2に接続する方法と、接続しながら、出たエラーについて整理してみました。

目標

まず、Pubiic Subnet EC2に接続します。それから、AWS Session Managerを利用して、Private Subnet EC2に接続します。追加的にSession Managerで接続したPrivate Subnet EC2で、Pingコマンドを実行するのが、今回の目標になります。

VPC、Public Subnet EC2、Private Subnet EC2の設定はこちらを参考してください。

NAT Gatewayの設定

Private Subnet EC2に接続するためには、NAT Gatewayを経由する必要があります。

まず、NAT Gatewayを設定してみましょう。

NAT Gatewayの設定は簡単です。「名前」にはNAT Gatewayの名前を入力した後、サブネットは「Public subnet」を選択します。Elastic IPは、作成したElastic IPがあったら、それを選択してください。もし、作成したElastic IPがなかった場合「Elastic IPの割り当て」のボタンを押したら、自動的に割り当てられます。

次は、Private SubnetのRouteTableに入ります。

「Add route」ボタンを押して、Destionationは「0.0.0.0/0」Targetは先、設定したNAT Gatewayを選択します。

Private SubnetのSecurity Groupの設定は、タイプは「HTTPS」ソースは「マイIP」にします。

AWS Session Managerの設定

Session Manager Pluginインストール

curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/linux_64bit/session-manager-plugin.rpm" -o "session-manager-plugin.rpm"
sudo yum install -y session-manager-plugin.rpm

Public EC2に接続した後、コマンドを実行して、Session Manager Pluginをインストールします。

aws ssm start-session --target 「Private EC2のID」 --region 「Private EC2のRegion」

その後、Private EC2に接続してみると、

Unable to locate credentials. You can configure credentials by running "aws configure".

というエラーが出ます。AWS configureを通じて、アカウント情報設定をしなかったというエラーメッセージですが、ssm:StartSessionとssm:TerminateSessionをIAMロールを設定すると解決できます。

IAMロールの作成

IAMロールを作成しましょう。まず、IAMロールからAWSサービス→EC2を選択します。

ポリシーは選択せずにロール名だけ入力します。

IAMロールの作成が終わったら、「インラインポリシーの追加」を押します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:StartSession"
            ],
            "Resource": [
                "arn:aws:ssm:「Region」:「AWS Account」:session/「EC2-ID」",
                "arn:aws:ec2:「Region」:「AWS Account」:instance/「EC2-ID」"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssm:TerminateSession"
            ],
            "Resource": "arn:aws:ssm:*:*:session/${aws:username}-*"
        }
    ]
}

「Region」は、自分のRegionを、「AWS Account」は、自分のアカウント(数字)を、「EC2-ID」はPrivate EC2のIDを入力します。

その後、Public EC2を選択して、アクション→セキュリティ→IAMロールを変更をクリックします。

先、作成したIAMロールを選択してください。

その後、Private EC2に接続してみると、

An error occurred (TargetNotConnected) when calling the StartSession operation

というエラーがでます。

ではTargetである、Private EC2にもIAMロールを設定してみましょう。

Private EC2のIAMロールの設定は簡単です。IAMロールで「AmazonSSMManagedInstanceCore」ポリシーを選択して、Private EC2にIAMロールを設定したら終わりです。

Session ManagerでPrivate EC2に接続

aws ssm start-session --target 「Private EC2-ID」 --region 「自分のRegion」

コマンドを実行すると、Private EC2に接続ができます。

pingテストを実行したところ、NAT Gatewayを経由して、インターネットに通信されることを確認することができます。

最後に

Session ManagerでPrivate EC2に接続しようとした時、様々なエラーが出て大変でした。もし、私みたいに、Session ManagerでPrivate EC2に接続しようと思う人たちに、このBlogの内容が役に立つといいなと思います。

参考