背景
個人的な用途のサーバとして、AWSのパブリックサブネット上にいるインスタンスが1台います。
コストかかってもしょうがないので踏み台サーバは用意せず、sshは自宅のipアドレスのみ許可する運用でやってました。
ただ最近外出先からちょくちょくサーバにアクセスしたいと思う機会があり、そろそろセッションマネージャーを検討しようかなと思い始めました。
ただセッションマネージャーを使用するにはAWS CLIが必要です。外出時に使用している比較的買ったばかりのPCを汚したくないため、AWS CLIをWSL上のDockerで用意しようと思い、今回使用できるようになったので記載します。
ゴール
- 外出時にAWS上のインスタンスにWindowsターミナルからアクセスできるようにする
- クライアントPCは環境をなるべく汚したくないため、WSL上のDockerで環境を用意する
前提
- WSLにDockerインストール済み
- セッションマネージャーで管理するインスタンスにセッションマネージャーに必要なIAMロールをアタッチ済み
(私はAdministrator権限付与してしまってます) - AWS CLI実行用のユーザを作成してアクセスキーを発行済み(readonlyのAWS管理ポリシーしていたら、あとはssmのStartSession, TerminateSessionの二つだけ追加すれば大丈夫でした)
環境準備
WSL準備
まずはdockerを使用できるようにするため、WindowsターミナルからWSLの立ち上げとdockerサービスを起動します。
PS C:\Users\horonium> wsl
horonium@<host>:~$ sudo /etc/init.d/docker start
[sudo] password for horonium:
* Starting Docker: docker
Dockerfile, コンテナイメージ作成
FROM amazon/aws-cli
WORKDIR /tmp
RUN curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/linux_64bit/session-manager-plugin.rpm" -o "session-manager-plugin.rpm" \
&& yum install -y session-manager-plugin.rpm \
&& rm session-manager-plugin.rpm
WORKDIR /root
コンテナイメージは以下公式リファレンスにある情報からamazon/aws-cli
を使用します。
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-docker.html
またsession-managerを使用するにはプラグインをインストールしないといけないので、インストールする処理を記載しました。
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html
これからイメージを作成します。
docker build . -t awscli:latest
AWS CLI実行準備
AWS CLIを実行するにはaws configure
で使用するリージョンやIAMユーザのアクセスキーの情報を設定する必要があります。
実際に設定したファイルは、~/.awsディレクトリ配下にconfigとcredentialsとして用意されるので、それをWSL上のディレクトリに用意して、docker run
する際にマウントしてあげます。
- 東京リージョンの例
[default]
output = json
region = ap-northeast-1
- アクセスキー情報
[default]
aws_access_key_id = <accessKey>
aws_secret_access_key = <secretAccess>
SSMのStartSession実行
ではいよいよ実行します。コンテナイメージは作成済みなので、あとはdocker run
を実行すればよいです。
上記記載済みの通りですが、.awsをマウントしてあげるのを忘れずに。
docker run --rm -it -v ~/.aws/:/root/.aws awscli ssm start-session --target "<instanceID>"
Starting session with SessionId: readonly-xxxxxxxxxxxxxxxxx
sh-4.2$
これでWSL上のDockerを使用して、AWS上のインスタンスにアクセスできるようになりました。
アクセスキーを誤って公開してしまうようなことをしなければ、これで安全にどこからでもAWS上のインスタンスを管理できますね!
あとは毎回上記コマンドを入力するのも面倒なので、エイリアスの設定を.bashrcなどに記載すればaws ~
でWSL上からすぐ実行できます。
いずれ
ここを参考に、ほんとはsshのconfigにProxyCommandとかを設定して、scpとかもできるようになりたいのですが以下エラーでうまくいかず、、、
正直コンテナを使用しているからの気がします。
$ ssh <hostName>
kex_exchange_identification: Connection closed by remote host
Connection closed by UNKNOWN port 65535
自分に合った管理方法をもう少し試行錯誤することになりそうですが、今日はここまで。