当記事の概要
当記事では、AWSのAmazon EC2インスタンス(Linuxを想定)に、Session Managerを使用して接続する手順を示します(よく手順を忘れるので備忘録的にまとめます)。
Session Managerで接続するための条件
EC2インスタンスにSession Managerで接続するためには以下の条件を満たしている必要があります。
- SSM Agentがインストールされていること(Amazon Linux 2ではプリインストールされているので対応不要)
- EC2インスタンスに、AWS管理ポリシー
AmazonSSMManagedInstanceCore
を含むIAMロールをアタッチする - SSMエンドポイントへのアクセスが可能
以下、上記の条件を満たすための設定手順を記載します。
SSM Agentのインストール
SSM Agentのインストール手順はOSによって異なるため、以下リンク先の手順に沿って実施します。
Linux 用 EC2 インスタンスに SSM Agent を手動でインストールおよびアンインストールする
IAMロールのアタッチ
まず、AWS管理ポリシー AmazonSSMManagedInstanceCore
を含むIAMロールを作成します(なお、以下ではAmazonSSMManagedInstanceCore
のみ含むIAMロールを作成しますが、既存のIAMロールにAmazonSSMManagedInstanceCore
を追加してもOKです)。
AWSマネジメントコンソールで、IAMを開き、画面左側メニューの「ロール」を選択します。
画面右側の「ロールの作成」ボタンをクリックします。
「AWSのサービス」を選択し、「サービスまたはユースケース」では「EC2」、「EC2 Role for AWS System Manager」を選択し、「次へ」ボタンをクリックします。
AmazonSSMManagedInstanceCore
があることを確認し、「次へ」ボタンをクリックします。
「ロール名」に任意の名前を設定し、「ロールを作成」ボタンをクリックします。
次に、作成したIAMロールをEC2インスタンスにアタッチします。対象のEC2インスタンスの概要画面に遷移し、「アクション」→「セキュリティ」→「IAMロールを変更」を選択します。
作成したIAMロールを選択し、「IAMロールの更新」ボタンをクリックします。
なお、他の条件が全てクリアできている状態で、最後にIAMロールの設定を実施した場合、IAMロール設定直後はSession Managerでの接続ができません。しばらく待つ必要があるためご注意ください。
SSMエンドポイントへのアクセスを可能とする
EC2インスタンスがインターネットアクセスが可能な場合
セキュリティグループのアウトバウンドルールで、以下へのHTTPS(443)のアクセスを許可します。region
はEC2インスタンスのリージョンを設定します。東京リージョンは「ap-northeast-1」、大阪リージョンは「ap-northeast-3」です。
- ssm.region.amazonaws.com
- ssmmessages.region.amazonaws.com
- ec2messages.region.amazonaws.com
東京リージョンの場合には以下になります。
ssm.ap-northeast-1.amazonaws.com
ssmmessages.ap-northeast-1.amazonaws.com
ec2messages.ap-northeast-1.amazonaws.com
EC2インスタンスがインターネットアクセス不可の場合
以下を参考に設定を実施します。
インターネットにアクセスしなくても、 VPC エンドポイントを作成して、Systems Manager でプライベート EC2 インスタンスを管理するにはどうすればよいですか?
VPCエンドポイントを作成するのですが、その前に必要なセキュリティグループを作成します。
インバウンドルールで以下を許容するルールを作成します。
- タイプ:HTTPS(443)
- ソース:対象VPCのCIDR(VPCによって異なる)
次に、下記3つのVPCエンドポイントを作成します。
- com.amazonaws.region.ssm
- com.amazonaws.region.ec2messages
- com.amazonaws.region.ssmmessages
- com.amazonaws.region.s3
東京リージョンの場合には以下になります。
com.amazonaws.ap-northeast-1.ssm
com.amazonaws.ap-northeast-1.ec2messages
com.amazonaws.ap-northeast-1.ssmmessages
com.amazonaws.ap-northeast-1.s3
VPCエンドポイントは、AWSマネジメントコンソールの「VPC」サービスで、画面左側メニューの「エンドポイント」を選択し、「エンドポイントを作成」ボタンをクリックします。
エンドポイントの設定画面で、「名前タグ」に任意の名前を入力し、「サービスカテゴリ」は「AWSのサービス」を選択します。
「VPC」には対象のVPC、「サブネット」はエンドポイントを作成するアベイラビリティーゾーン、サブネットを選択します。
「セキュリティグループ」では先ほど作成したセキュリティグループを選択します。「ポリシー」はデフォルトのままでOKです。その後、画面下部の「エンドポイントを作成」ボタンをクリックします。
上記の手順を、以下3つのエンドポイントに対して実施します。
- com.amazonaws.region.ssm
- com.amazonaws.region.ec2messages
- com.amazonaws.region.ssmmessages
4つ目の「com.amazonaws.region.s3」については、エンドポイントのタイプとして「Gateway」、「Interface」が選択可能ですが、「Gateway」を選択します。「Gateway」の場合、ルートテーブルの選択が必要です。(「Interface」を選択しても有料になるだけで問題はないと思います)
AWSマネジメントコンソールからの接続
対象のEC2インスタンスの概要ページで「接続」ボタンをクリックします。
「セッションマネージャー」タブを選択します。特に何もエラーが表示されていなければ接続可能な状態になっています。「接続」ボタンをクリックします。
AWSマネジメントコンソールからのアクセスができました。
ターミナルからの接続(AWS CLI)
ターミナルからSession Managerを使用してEC2インスタンスに接続するには、「AWS CLI」、および、「AWS CLIのSession Managerプラグイン」が必要です。
以下のガイドに沿って、2つをインストールしてください。
インストール後、AWSの認証情報を設定します。以下の記事を参照ください。
設定後、以下のコマンドを実行すると、ターミナルからEC2インスタンスに接続できます。
aws ssm start-session --target <EC2インスタンスのインスタンスID>
ターミナルからの接続(ssh)
Session Managerでは、ターミナルからsshを使用して接続することも可能です。また、sshでの接続ができるようになると、scpやsftpも使用可能です。このとき、EC2側はsshのポートを開ける必要はありません。
まずは通常のssh用の設定を実施します(秘密鍵・公開鍵の作成、サーバ側でのログインユーザの~/.ssh/authorized_keys
への公開鍵の設定)。
ローカル端末側の ~/.ssh/config
を以下の通り設定します(以下はMacの場合の設定です)。
host i-* mi-*
ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
上記のProxyCommand
の設定により、Session Managerをプロキシとしてssh接続が可能となります。
あとは普通にsshログインを実行します。
ssh -i <秘密鍵のパス> <ユーザ名>@<EC2 インスタンスID>
~/.ssh/config
に IdentityAgent
の設定を実施することで、1Passwordに保存された秘密鍵を使用することも可能です。