AWS Management Console からブラウザベースのターミナルで EC2 に接続する
AWS Management Console 内から任意の EC2 インスタンスに SSH する機能が EC2 Instance Connect です。CloudShell 同様、ブラウザベースのターミナルで接続することになります。EC2 および IAM の設定以外にも Security Group の Inbound Rules を設定する必要があるのですが、公開されているドキュメントからはやや辿りにくいので、紹介します。
ドキュメント によると 4 つのタスクがありますが、すでに公開鍵/秘密鍵のペアで EC2 に接続できる状態であれば Task1 のネットワークアクセスは問題ないはずで、Task 2 の ec2-instance-connnect パッケージと sshd 設定も Amazon Linux 2023 であればデフォルトで設定済みなので必要ありません。Task 3 の pip install ec2instanceconnectcli は Optional なので必要ありません。
問題は Task 4 でインスタンス ID ごともしくはインスタンス全体に "Action": "ec2-instance-connect:SendSSHPublicKey"
を許可する必要があります。ここでは AWS CloudShell を使用して awscli を実行しました(なお CloudShell 上の vi でコピー&ペーストはインデントがおかしくなるので json はローカルマシンで編集してアップロードしています (^_^; )
[cloudshell-user@ip-10-12-34-56 ~]$ aws iam create-policy --policy-name Ec2InstanceConnectAccess --policy-document file://./Ec2InstanceConnectAccess.json
インスタンスIDごとにポリシーを設定している場合、別のインスタンスへの接続許可を与えるには配列を修正した後にポリシーを更新する必要があります(初回の新規作成は create-policy
で 2 回目の更新からは create-policy-version
)
[cloudshell-user@ip-10-12-34-56 ~]$ aws iam create-policy-version --policy-arn arn:aws:iam::__your_account_id__:policy/Ec2InstanceConnectAccess --policy-document file://./Ec2InstanceConnectAccess.json
ドキュメントには上記 4 つのタスクしか掲載されていませんが、これだけではまだ接続できず、Security Group の Inbound Rules にリージョンごとの特定の IP 範囲を指定してあげる必要があります。これは トラブルシューティング から確認できます。