最近ECSやらFargateチャレンジしてるから楽しくてしゃーない。コンテナのノウハウ高まる。
— adachin?SRE (@adachin0817) December 26, 2019
今回は初の試みでございます。AWS Fargateを利用してSSHコンテナを動かしてみました。前回のブログでSSMエージェントを使ってログインを試したかったんですが、Alpine Linuxが対応しておらず、結局ssh-serverを立ち上げたほうが楽なのでは?と判断したので、まずは概要と構成から説明していましょう。
■環境/概要
- 本番のDB接続やaws-cliなど、確認用のSSHコンテナ(deploy container)が必要なため
- VPCはPublicとNATゲートウェイ経由のPrivateネットワークと、Privateネットワークの構成
- 2つのAWSアカウントがあり、両方ともVPCピアリングの設定をしている
- AWS 01のbastionからAWS 02の対象のコンテナへSSHをする
- AWS 02のセキュリティグループには22で10.0.0.0/16が許可されている
VPCの構成については以下を参考に。
■IAM
- add role
ecsTaskExecutionRole
- ecs-task.json
1 2 3 4 5 6 7 8 9 10 11 12 13 |
{ "Version": "2008-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "ecs-tasks.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } |
■ECR push
- Dockerfile
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
FROM alpine:3.11 LABEL maintainer adachin_devteam ARG pip_installer="https://bootstrap.pypa.io/get-pip.py" # Setup UTC+9 RUN apk --update add tzdata && \ cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \ apk del tzdata # Install Package RUN apk update && \ apk upgrade && \ apk add --update \ bash \ openssl \ openssl-dev \ openssh \ sudo \ perl \ curl \ curl-dev \ wget \ git \ python \ curl \ groff \ mysql-client \ bash \ supervisor \ vim && \ rm -rf /var/cache/apk/* # Install awscli RUN curl ${pip_installer} | python && \ pip install awscli # Create adachin user RUN apk add sudo RUN adduser -D adachin RUN sed -ri 's/^wheel:x:10:/wheel:x:10:adachin/' /etc/group RUN sed -ri 's/^# %wheel/adachin/' /etc/sudoers RUN sed -ri '85 s/adachin/#adachin/' /etc/sudoers COPY common/shadow /etc/ COPY .vimrc /root/ COPY .vimrc /home/adachin/ RUN echo Set disable_coredump false > /etc/sudo.conf # Setup ssh RUN sed -ri 's/^#Port 22/Port 22/' /etc/ssh/sshd_config RUN sed -ri 's/^#PermitEmptyPasswords no/PermitEmptyPasswords yes/' /etc/ssh/sshd_config RUN sed -ri 's/^#PermitRootLogin yes/PermitRootLogin yes/' /etc/ssh/sshd_config RUN sed -ri 's/^UsePAM yes/UsePAM no/' /etc/ssh/sshd_config RUN sed -ri 's/^#PermitUserEnvironment no/PermitUserEnvironment no/' /etc/ssh/sshd_config RUN ssh-keygen -A # setting superviser COPY supervisor/sshd.conf /etc/supervisor/conf.d/sshd.conf RUN echo files = /etc/supervisor/conf.d/*.conf >> /etc/supervisord.conf # Service to run CMD [ "/usr/bin/supervisord" ] |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
$ docker commit adachin-deploy xxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/adachin-deploy:latest sha256:xxxxxxxxxxxxxxxxxxxxx $ docker push xxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/adachin-deploy:latest The push refers to repository [xxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/adachin-deploy] 09699dab7925: Pushed 3d1f9ee12cb9: Pushed 932d8e230b78: Pushed 18163620e723: Pushed e6065526eaca: Pushed 59a1feeec617: Pushed f1d5b3d9ee2c: Pushed 7c4d7be820dc: Pushed 2cd049620a0d: Pushed 8ad833db0a98: Pushed 03bbfc4ccf65: Pushed 96c9f2b25a42: Pushed c3ef53bb75db: Pushed 1d01317c7f92: Pushed 8cb395132b40: Pushed 7f900dec8b3d: Pushed b6d79eca04c7: Pushed 557d789a7ab1: Pushed 1e61c373e99b: Pushed 6c627c63598a: Pushed 9a0b14c8c199: Pushed 17c3565aed20: Pushed 61a0ac369567: Pushed 6bc83681f1ba: Layer already exists latest: digest: sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx size: 5318 |
まずECRでリポジトリを作成してpushしましょう。
■クラスターの作成
- ネットワーキングのみを選択して次のステップ
- クラスターの設定
■タスク定義の設定
- 起動タイプの互換性の選択
- タスクとコンテナの定義の設定
タスクロールは ecsTaskExecutionRole
- コンテナの追加
■クラスター > サービス > 追加
- サービスの設定
- ネットワークの構成
今回はPublic IPとロードバランサーは必要ないので無効化しましょう。
■確認
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ ssh adachin@10.2.x.xxxx 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. adachin@ip-10-2-x-xxx:~$ cat /etc/os-release NAME="Alpine Linux" ID=alpine VERSION_ID=3.11.0 PRETTY_NAME="Alpine Linux v3.11" HOME_URL="https://alpinelinux.org/" BUG_REPORT_URL="https://bugs.alpinelinux.org/" |
OK!!!!!!
■まとめ
Fargateおもしろい!設定項目が多いので、次回はこれらをTerraformで自動化していきたいと思います。
しかし、これができるとなるとbastionもFargate化して、毎週コンテナの脆弱性update(Trivyで)して作り直すみたいな運用ができそう。コンテナのデプロイはecs-deployかな。またね!
※Terraform化もしてるので参考に。
0件のコメント