✌️

AWS CLI と Session ManagerでローカルからSSHする

2024/04/14に公開

aws-cliとSSM(session-manager)でローカルからEC2にSSHしてみました。cliとssh/configの設定でハマったところがあったところもあったので記事にします。

Session Managerを使えば踏み台を作らなくて良くなったり、セキュリティグループで22番ポートを開かなくても良いなどとても便利ですよね。
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager.html
https://dev.classmethod.jp/articles/session-manager-launches-tunneling-support-for-ssh-and-scp/

前提

Amazon Linux 2023
EC2にIAMロールがわり当たっている(AmazonSSMManagedInstanceCore)
プライベートサブネットに置きたかったのですが、気軽に試すためパブリックにしてます。

ローカルのバージョン確認

# aws-cliのバージョン
$ aws --version
aws-cli/2.15.36

# session-manager-plugin のバージョン
$ session-manager-plugin --version
1.2.553.0

aws cli --profileオプション

複数のAWSアカウントを使って環境構築する場合(ステージング環境とテスト環境の切り替えなど)aws-cliでは、--profileオプションでプロファイルを切り替えることができます。マネージメントコンソールでIAMユーザーごとにアクセスキーを作成する必要はありますが、一度設定してしまえばその後はコンソール経由で快適に切り替えられます。

オプションなし

$ aws configure

オプションあり

$ aws configure --profile xxx-stg

.ssh/configを編集します。

$ vim ~/.ssh/config

こちらのコマンドは公式のコマンドコピペで大丈夫です。
--profile をつける場合はssm の後に --profile [プロファイル名]

# SSH over Session Manager
host i-* mi-*
ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-getting-started-enable-ssh-connections.html

# --profile 指定なし
$ aws ssm start-session --target i-[インスタンスID]

# --profile 指定あり
$ aws ssm  --profile [プロファイル名] start-session --target i-[インスタンスID]

# 実行結果(この場合ユーザーがshで接続することになります)
sh-4.2$ 

aws configure で--profileオプションをつけて管理している場合、ssmの後に--profile [プロファイル名]を指定します。自分はこの設定をしていなかったため接続できず、30分くらいハマりました。

configureでリージョンを指定していなかった場合 一番最後に--region [リソースのリージョン] のオプションをつけましょう。

複数リソースを管理する場合

$ vim ~/.ssh/config

# リソース1
Host ssm
	HostName i-[インスタンスID]
	User ec2-user
	ProxyCommand sh -c "aws --profile [プロファイル名] ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
	IdentityFile [pemキーへのパス].pem
# リソース2
Host xxx
	 ...

Host名をssmといていますがユニークな名前をつければ何でもOKです。

上記を設定して接続するとec2-userでログインできます。

$ ssh ssm
[ec2-user@ip-xxxx ~]$ 

aws configureで設定した情報は.aws配下にあるconfig/credentialsで確認できます。

$ ls ~/.aws
config		credentials

個人的には--profileを設定しないとdefaultを見に行く仕様が怖いのでdefault設定自体を削除し、
--profileをつけて名前を指定しないと接続できないようにしています。

Discussion