フラミナル

考え方や調べたことを書き殴ります。IT技術系記事多め

【説明】AWS ECSコンテナにSSHするまでの手順まとめ

f:id:lirlia:20200407203940p:plain

はじめに

コンテナへSSHをする方法を紹介します。基本的に2つのやり方が存在します。

踏み台経由

SSH踏み台用のEC2を使いコンテナにアクセスするパターン

f:id:lirlia:20200407203017p:plain

LB経由

NLB(ネットワークロードバランサー)を使い、コンテナに対して直接グローバルIP経由でアクセスをするパターン

f:id:lirlia:20200407203027p:plain

LBを経由するやり方はコンテナの数が増えると面倒なことになるので、ECS(EC2)に着目しECSが動くEC2にSSHしそこからコンテナにSSHする方法を紹介します。

f:id:lirlia:20200407203259p:plain

前提条件

  • 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#にアクセスし、「リポジトリの作成」を押してください。

f:id:lirlia:20200407184127p:plain


そして名前を指定します。

f:id:lirlia:20200407184246p:plain


作成されました。

f:id:lirlia:20200407184310p:plain


続いてプッシュ手順の確認です。

f:id:lirlia:20200407184346p:plain


このようにAWSがリポジトリへプッシュ手順を用意してくれていますのでそれに従いましょう。

f:id:lirlia:20200407184408p:plain

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の画面に戻って更新してみましょう。先ほどプッシュしたイメージが存在するはずです。

f:id:lirlia:20200407190733p:plain

手順(ECSの作成)

秘密鍵の作成

コンテナへのSSHには不要ですがEC2インスタンスにSSHするように一応作っておきます。

f:id:lirlia:20200407121354p:plain


f:id:lirlia:20200407121421p:plain


できました!

f:id:lirlia:20200407121444p:plain


いつのまにか秘密鍵がダウンロードされているので格納場所を控えておきましょう。

f:id:lirlia:20200407121615p:plain

ダウンロードしたファイルを~/.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クラスタの作成

つづいてコンテナを動かす環境を準備します。


f:id:lirlia:20200407121027p:plain


f:id:lirlia:20200407121135p:plain


f:id:lirlia:20200407121748p:plain

EC2にSSHする時用にセキュリティグループの22/tcpを穴あけしておきます。


f:id:lirlia:20200407122008p:plain


f:id:lirlia:20200407122042p:plain


自動で作成されました。

f:id:lirlia:20200407122352p:plain

ECSクラスタの状態

今の状況はこんな感じです。色ついているインスタンスが今作成したECSクラスタです。

f:id:lirlia:20200407211354p:plain

そもそもECSクラスタって何?という方はこちらの記事がおすすめです

今回作成したECSの概念と実体を図にするとこんな感じです。クラスタを作りましたが、実体としてはEC2が存在しています。

f:id:lirlia:20200407134121p:plain

ECSクラスタへのサービスとタスクの作成

続いて作成したクラスタにサービスタスクを追加していきましょう。

サービスの追加

f:id:lirlia:20200407192002p:plain


EC2で動かしていますのでこちらを選択し、サービス名を規定し、タスクの数を1つにしましょう。

f:id:lirlia:20200407192151p:plain


残りはそのままで良いでしょう。そしたら「次のステップ」を押してください。

f:id:lirlia:20200407192327p:plain


f:id:lirlia:20200407192705p:plain


ほかはそのままで構わないので「次のステップ」にいきましょう。

f:id:lirlia:20200407192750p:plain


「次のステップ」を押してください

f:id:lirlia:20200407192829p:plain


「サービスの作成」を押してください

f:id:lirlia:20200407192915p:plain


セキュリティグループの修正

SSHを許可するためのセキュリティグループ修正するためにこちらをクリックし

f:id:lirlia:20200407193029p:plain


f:id:lirlia:20200407193116p:plain

SSHに変更して保存します。

f:id:lirlia:20200407193156p:plain

タスク定義の変更

ここからタスク定義にジャンプします。

f:id:lirlia:20200407193422p:plain


f:id:lirlia:20200407193511p:plain

タスク定義の修正

f:id:lirlia:20200407193614p:plain

コンテナの修正

f:id:lirlia:20200407193718p:plain

f:id:lirlia:20200407193926p:plain

f:id:lirlia:20200407193951p:plain

タスクの実行(コンテナの起動)

f:id:lirlia:20200407194535p:plain


f:id:lirlia:20200407194929p:plain


f:id:lirlia:20200407194741p:plain

確認

こちらの画面でRUNNINGになっていることを確認してください。

f:id:lirlia:20200407195022p:plain

SSHの実施

コンテナのIPを確認しましょう。

f:id:lirlia:20200407200443p:plain

そして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

ログインできた方、おめでとうございます。

お疲れ様でした!