以下ハンズオンのリンク
https://pages.awscloud.com/JAPAN-event-OE-Hands-on-for-Beginners-ECS-2022-confirmation_012.html
全体像
流れ
- cloud9でコンテナイメージを作成
- ECRのリポジトリを作成
- コンテナイメージをECRにアップロード
- クラスターを作成
- タスク定義を作成
- サービスを作成(サービスの中にALBとタスクが含まれる)
- 稼働確認
作業内容
#1. cloud9で作業用の環境を作成
- amazonlinux2023
- 設定は特に気にしなくて良い
#2. cloud9でインスタンスのコンソールに入り、Dockerfileを作成
ec2-user:~ $ echo > Dockerfile
ec2-user:~ $ ll
total 4
-rw-r--r--. 1 ec2-user ec2-user 1 Apr 22 13:52 Dockerfile
drwxr-xr-x. 3 ec2-user ec2-user 34 Apr 22 13:44 environment
drwxr-xr-x. 3 ec2-user ec2-user 17 Apr 17 22:01 go
#3. Dockerfileを開いて中に以下のコンテナイメージを記載
FROM ubuntu:18.04
# Install dependencies
RUN apt-get update && \
apt-get -y install apache2
# Install apache and write hello world message
RUN echo 'Hello World!' > /var/www/html/index.html
# Configure apache
RUN echo '. /etc/apache2/envvars' > /root/run_apache.sh && \
echo 'mkdir -p /var/run/apache2' >> /root/run_apache.sh && \
echo 'mkdir -p /var/lock/apache2' >> /root/run_apache.sh && \
echo '/usr/sbin/apache2 -D FOREGROUND' >> /root/run_apache.sh && \
chmod 755 /root/run_apache.sh
EXPOSE 80
CMD /root/run_apache.sh
中身の詳細は以下
- 作成するコンテナイメージの基となるベースイメージは DockerHub で公開されている Ubuntu 18.04
- Web サーバーとして Apache HTTP Server をインストール
- 実際の Web ページに表示するために index.html を作成
- EXPOSE で、このコンテナは 80 ポート(HTTP) を利用することを宣言
#4. コンテナイメージをビルド
# イメージが他にないか確認
ec2-user:~/environment $ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
# ビルド(-tオプションはタグ)
ec2-user:~/environment $ docker build -t hello-world .
# 数十秒でコンテナイメージの作成が終わる
# コンテナイメージが作成されていることを確認
ec2-user:~/environment $ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest 3ecb0bbd7483 About a minute ago 205MB
# 他にコンテナが動作していないことを確認
ec2-user:~/environment $ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# コンテナを起動
ec2-user:~/environment $ docker run -d -p 8080:80 --name h4b-local-run hello-world
e0298b0d68ad7bbc579344590f66f72fbd632728346b2c8b4bb1db4d6eec073e
docker runコマンドの補足
- -p : Cloud9 の Linux 環境の 8080 ポートを、コンテナ側の 80 番ポートと接続する指定。これによって、Cloud9 の画面上から、動かしているコンテナにアクセスするのが簡単になる
- -d : バックグラウンド実行
- --name : 名前の指定
#5. 動作を確認
# コンテナが動作していることを確認
ec2-user:~/environment $ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e0298b0d68ad hello-world "/bin/sh -c /root/ru…" 4 minutes ago Up 4 minutes 0.0.0.0:8080->80/tcp, :::8080->80/tcp h4b-local-run
# ローカルホストの8080にアクセスするとコンテナの80へ行くことを確認
ec2-user:~/environment $ curl localhost:8080
Hello World!
#6. コンテナの中身を確認
# docker execコマンドによりサーバにログインしたかのようにbashが使える
ec2-user:~ $ docker exec -i -t h4b-local-run bash
root@e0298b0d68ad:/# cd /var/www/html
root@e0298b0d68ad:/var/www/html# cat index.html
Hello World!
#7. ECRにコンテナイメージをアップロード
# ECRでプライベートリポジトリを作成しURIをコピー
# 再度cloud9のコンソールに戻る
ec2-user:~/environment $ ll
total 8
-rw-r--r--. 1 ec2-user ec2-user 535 Apr 22 13:56 Dockerfile
-rw-r--r--. 1 ec2-user ec2-user 569 Apr 17 20:27 README.md
# buildを実行(-t <ECR の URL>:<バージョン Tag> )
ec2-user:~/environment $ docker build -t 000000000000.dkr.ecr.ap-northeast-1.amazonaws.com/h4b-ecs-helloworld:0.0.1 .
# 再度コンテナイメージを確認
ec2-user:~/environment $ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
000000000000.dkr.ecr.ap-northeast-1.amazonaws.com/h4b-ecs-helloworld 0.0.1 3ecb0bbd7483 About an hour ago 205MB
hello-world latest 3ecb0bbd7483 About an hour ago 205MB
#8. コンテナイメージをECRにアップロード
# リポジトリにログイン
ec2-user:~/environment $ aws ecr get-login-password | docker login --username AWS --password-stdin 000000000000.dkr.ecr.ap-northeast-1.amazonaws.com
WARNING! Your password will be stored unencrypted in /home/ec2-user/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
# コンテナイメージをアップロード
ec2-user:~/environment $ docker push 000000000000.dkr.ecr.ap-northeast-1.amazonaws.com/h4b-ecs-helloworld:0.0.1
The push refers to repository [000000000000.dkr.ecr.ap-northeast-1.amazonaws.com/h4b-ecs-helloworld]
a61a92ef202d: Pushed
19dcff01c4a2: Pushed
de44312c12b2: Pushed
548a79621a42: Pushed
0.0.1: digest: sha256:ee0af1933cdde643be42b8353757268b9245f21efc34e5258f2bb0637d3771fc size: 1155
#9. コンテナを動かすためのVPCやサブネット周りを作成
#12. サービスを作成
今回はサービスに使用するタスク定義を#11で作成したものにし、必要タスクを2にしてALBを作成するように設定した。
1つのサービスにつきタスク定義は1つのみなのでWebサーバとAppサーバだったらサービスは2つとかになるはず

間違えてSGインバウンドで80を許可していなかったのでヘルスチェックに失敗し、タスクの停止、新規起動が繰り返されてた

#13. 確認
ALBのドメインをブラウザで見ると下記ページが表示されたので成功!

振り返り
初めてなのでページを公開するまで時間がかかったが、運用面を考えるとEC2で構築するのと比べてECSはすごい楽になるんだろうなと感じた。
まだ、仕組み的に分かっていない部分が多いので勉強します。






