はじめに
コンテナへSSHをする方法を紹介します。基本的に2つのやり方が存在します。
踏み台経由
SSH踏み台用のEC2を使いコンテナにアクセスするパターン
LB経由
NLB(ネットワークロードバランサー)を使い、コンテナに対して直接グローバルIP経由でアクセスをするパターン
LBを経由するやり方はコンテナの数が増えると面倒なことになるので、ECS(EC2)に着目しECSが動くEC2にSSHしそこからコンテナにSSHする方法を紹介します。
前提条件
- AWSアカウントを持っている
必要知識
- コンテナ/Docker
- Linux
- AWS
- ECS
- ECR
作業手順
イメージの準備
sshdを動作させるDockerfileはこちら
FROM alpine:3.5 RUN apk --update add --no-cache openssh bash \ && sed -i s/#PermitRootLogin.*/PermitRootLogin\ yes/ /etc/ssh/sshd_config \ && echo "root:gaFnGqGvsYRJ4iROB2bAv1TcWLJT+utKpvFh9Ef5JDo" | chpasswd \ && rm -rf /var/cache/apk/* RUN sed -ie 's/#Port 22/Port 22/g' /etc/ssh/sshd_config RUN sed -ri 's/#HostKey \/etc\/ssh\/ssh_host_key/HostKey \/etc\/ssh\/ssh_host_key/g' /etc/ssh/sshd_config RUN sed -ir 's/#HostKey \/etc\/ssh\/ssh_host_rsa_key/HostKey \/etc\/ssh\/ssh_host_rsa_key/g' /etc/ssh/sshd_config RUN sed -ir 's/#HostKey \/etc\/ssh\/ssh_host_dsa_key/HostKey \/etc\/ssh\/ssh_host_dsa_key/g' /etc/ssh/sshd_config RUN sed -ir 's/#HostKey \/etc\/ssh\/ssh_host_ecdsa_key/HostKey \/etc\/ssh\/ssh_host_ecdsa_key/g' /etc/ssh/sshd_config RUN sed -ir 's/#HostKey \/etc\/ssh\/ssh_host_ed25519_key/HostKey \/etc\/ssh\/ssh_host_ed25519_key/g' /etc/ssh/sshd_config RUN /usr/bin/ssh-keygen -A RUN ssh-keygen -t rsa -b 4096 -f /etc/ssh/ssh_host_key EXPOSE 22 CMD ["/usr/sbin/sshd","-D"]
ユーザ名とパスワードは以下の通りです。
- user:
root
- password:
gaFnGqGvsYRJ4iROB2bAv1TcWLJT+utKpvFh9Ef5JDo
手順(ECRへのイメージ追加)
リポジトリの作成
https://ap-northeast-1.console.aws.amazon.com/ecr/repositories?region=ap-northeast-1#にアクセスし、「リポジトリの作成」を押してください。
そして名前を指定します。
作成されました。
続いてプッシュ手順の確認です。
このようにAWSがリポジトリへプッシュ手順を用意してくれていますのでそれに従いましょう。
ECRへのDockerイメージのプッシュ
ECRへのログイン
まずはECRへのログインです(今回はmacを使っています)
※aws cliがインストールされていない場合はインストールを済ませておいてください
$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 850890597300.dkr.ecr.ap-northeast-1.amazonaws.com/ssh-test
イメージの作成
Dockerイメージの作成です。
$ docker build -t ssh-test . Sending build context to Docker daemon 21.47MB Step 1/12 : FROM alpine:3.5 ---> f80194ae2e0c Step 2/12 : RUN apk --update add --no-cache openssh bash && sed -i s/#PermitRootLogin.*/PermitRootLogin\ yes/ /etc/ssh/sshd_config && echo "root:gaFnGqGvsYRJ4iROB2bAv1TcWLJT+utKpvFh9Ef5JDo" | chpasswd && rm -rf /var/cache/apk/* ---> Using cache ---> f61abebc00d6 Step 3/12 : RUN sed -ie 's/#Port 22/Port 22/g' /etc/ssh/sshd_config ---> Using cache ---> 4de3c95a79c6 Step 4/12 : RUN sed -ri 's/#HostKey \/etc\/ssh\/ssh_host_key/HostKey \/etc\/ssh\/ssh_host_key/g' /etc/ssh/sshd_config ---> Using cache ---> 7d42231a3fe3 Step 5/12 : RUN sed -ir 's/#HostKey \/etc\/ssh\/ssh_host_rsa_key/HostKey \/etc\/ssh\/ssh_host_rsa_key/g' /etc/ssh/sshd_config ---> Using cache ---> d7a42a7f8bdf Step 6/12 : RUN sed -ir 's/#HostKey \/etc\/ssh\/ssh_host_dsa_key/HostKey \/etc\/ssh\/ssh_host_dsa_key/g' /etc/ssh/sshd_config ---> Using cache ---> ceaebd9f1889 Step 7/12 : RUN sed -ir 's/#HostKey \/etc\/ssh\/ssh_host_ecdsa_key/HostKey \/etc\/ssh\/ssh_host_ecdsa_key/g' /etc/ssh/sshd_config ---> Using cache ---> f81cd38abe13 Step 8/12 : RUN sed -ir 's/#HostKey \/etc\/ssh\/ssh_host_ed25519_key/HostKey \/etc\/ssh\/ssh_host_ed25519_key/g' /etc/ssh/sshd_config ---> Using cache ---> 96d7bf9cb232 Step 9/12 : RUN /usr/bin/ssh-keygen -A ---> Using cache ---> beabb405c886 Step 10/12 : RUN ssh-keygen -t rsa -b 4096 -f /etc/ssh/ssh_host_key ---> Using cache ---> db1cb2d32275 Step 11/12 : EXPOSE 22 ---> Using cache ---> 9587ef9bbb50 Step 12/12 : CMD ["/usr/sbin/sshd","-D"] ---> Using cache ---> 45853d91ddc5 Successfully built 45853d91ddc5 Successfully tagged ssh-test:latest
イメージのタグ付け
そしてイメージへのタグ付けです。
$ docker tag ssh-test:latest 850890597300.dkr.ecr.ap-northeast-1.amazonaws.com/ssh-test:latest
イメージのプッシュ
プッシュします
$ docker push 850890597300.dkr.ecr.ap-northeast-1.amazonaws.com/ssh-test:latest theast-1.amazonaws.com/ssh-test:latest The push refers to repository [850890597300.dkr.ecr.ap-northeast-1.amazonaws.com/ssh-test] a8188b27ce4f: Pushed d609b2ebf2e9: Pushed d9f83c8f0cf8: Pushed 6888a811e7f2: Pushed a8fcfb763f21: Pushed 128d810d2342: Pushed 34da0f5c09d6: Pushed 056cc72bd337: Pushed 5fa544a0193e: Pushed f566c57e6f2d: Pushed latest: digest: sha256:44e6c31fe8390a5b7391e5608c9ffc92d2870db4bba2493b160583c1d6d3601b size: 2403
イメージの確認
ここまでできたらECRの画面に戻って更新してみましょう。先ほどプッシュしたイメージが存在するはずです。
手順(ECSの作成)
秘密鍵の作成
コンテナへのSSHには不要ですがEC2インスタンスにSSHするように一応作っておきます。
できました!
いつのまにか秘密鍵がダウンロードされているので格納場所を控えておきましょう。
ダウンロードしたファイルを~/.ssh
に移動し、権限をchmod 600 ~/.ssh/ssh-test.pem
にしておきましょう。
IPアドレスは作成したEC2インスタンスの情報をWeb画面で確認してください。
SSHログインテスト
$ ssh -i ~/.ssh/ssh-test.pem ec2-user@3.112.55.66 __| __| __| _| ( \__ \ Amazon Linux 2 (ECS Optimized) ____|\___|____/ For documentation, visit http://aws.amazon.com/documentation/ecs No packages needed for security; 1 packages available Run "sudo yum update" to apply all updates.
ECSクラスタの作成
つづいてコンテナを動かす環境を準備します。
EC2にSSHする時用にセキュリティグループの22/tcpを穴あけしておきます。
自動で作成されました。
ECSクラスタの状態
今の状況はこんな感じです。色ついているインスタンスが今作成したECSクラスタです。
そもそもECSクラスタって何?という方はこちらの記事がおすすめです
今回作成したECSの概念と実体を図にするとこんな感じです。クラスタを作りましたが、実体としてはEC2が存在しています。
ECSクラスタへのサービスとタスクの作成
続いて作成したクラスタにサービスとタスクを追加していきましょう。
サービスの追加
EC2で動かしていますのでこちらを選択し、サービス名を規定し、タスクの数を1つにしましょう。
残りはそのままで良いでしょう。そしたら「次のステップ」を押してください。
ほかはそのままで構わないので「次のステップ」にいきましょう。
「次のステップ」を押してください
「サービスの作成」を押してください
セキュリティグループの修正
SSHを許可するためのセキュリティグループ修正するためにこちらをクリックし
SSHに変更して保存します。
タスク定義の変更
ここからタスク定義にジャンプします。
タスク定義の修正
コンテナの修正
タスクの実行(コンテナの起動)
確認
こちらの画面でRUNNINGになっていることを確認してください。
SSHの実施
コンテナのIPを確認しましょう。
そしてECS用のEC2にログインします。
$ ssh -i ~/.ssh/ssh-test.pem ec2-user@3.112.55.66 __| __| __| _| ( \__ \ Amazon Linux 2 (ECS Optimized) ____|\___|____/ For documentation, visit http://aws.amazon.com/documentation/ecs No packages needed for security; 1 packages available Run "sudo yum update" to apply all updates.
そしてコンテナにログインします。ユーザ名とパスワードは以下の通りです。
- user:
root
- password:
gaFnGqGvsYRJ4iROB2bAv1TcWLJT+utKpvFh9Ef5JDo
[ec2-user@ip-10-0-1-213 ~]$ ssh root@10.0.1.84 The authenticity of host '10.0.1.84 (10.0.1.84)' can't be established. ECDSA key fingerprint is SHA256:CdY0lDLFn6DuM8E8XhsjB0WrC3LLXeyaJHH3bVPeo04. ECDSA key fingerprint is MD5:8b:7f:6c:80:7b:c9:ed:10:44:9d:ce:93:46:29:8a:36. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '10.0.1.84' (ECDSA) to the list of known hosts. root@10.0.1.84's password: Welcome to Alpine! The Alpine Wiki contains a large amount of how-to guides and general information about administrating Alpine systems. See <http://wiki.alpinelinux.org>. You can setup the system with the command: setup-alpine You may change this message by editing /etc/motd. ip-10-0-1-84:~# hostname ip-10-0-1-84.ap-northeast-1.compute.internal ip-10-0-1-84:~# uname -a Linux ip-10-0-1-84.ap-northeast-1.compute.internal 4.14.173-137.228.amzn2.x86_64 #1 SMP Thu Mar 19 16:50:21 UTC 2020 x86_64 Linux
ログインできた方、おめでとうございます。
お疲れ様でした!