LoginSignup
1
0

More than 1 year has passed since last update.

Dockerを使用したAWS CLIの使い方(セッションマネージャーでインスタンスにアクセス)

Posted at

背景

個人的な用途のサーバとして、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, コンテナイメージ作成

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する際にマウントしてあげます。

  • 東京リージョンの例
~/.aws/config
[default]
output = json
region = ap-northeast-1
  • アクセスキー情報
~/.aws/credentials
[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

自分に合った管理方法をもう少し試行錯誤することになりそうですが、今日はここまで。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0