【AWS公式ハンズオン】CloudFormationを用いてECSに入門してみた!

AWS

はじめに

AWS公式ハンズオンのECS入門編をCloudFormationを使用して実施しましたので、紹介してみたいと思います。

構成図

公式に記載されている通りの構成になりますので、以下をご確認いただければと思います。

AWS Hands-on for Beginners Amazon Elastic Container Service 入門 コンテナイメージを作って動かしてみよう | AWS Webinar
AWS Hands-on for Beginners Amazon Elastic Container Service 入門 コンテナイメージを作って動かしてみよう | AWS Webinar

実際に進めてみる

まずは環境構築

公式ハンズオンでは、Cloud9を起動してIDEを使用します。私は、ローカル環境のVScodeを使用しますので、この章はスキップしました。必要に応じて環境構築していきましょう。以下の記事でCloud9環境の構築をしていますので、参考にしてみてください。

Dockerがインストールされていることを確認しておく

以下のコマンドを実行して、Dockerがインストールされていることを予め確認しておきます。

docker version

以下のようにバージョン情報が表示されれば問題ないです。

Client:
 Cloud integration: v1.0.28
 Version:           20.10.17
・
・
〜省略〜
・
・

Dockerがインストールされていない場合は、以下のサイトからインストールしておきます。

Docker Desktop: The #1 Containerization Tool for Developers | Docker
Docker Desktop is collaborative containerization software for developers. Get started and download Docker Desktop today ...

MacであればHomebrewからインストールできます。

Homebrew
The Missing Package Manager for macOS (or Linux).

Dockerイメージの作成と実行

以下で、参考手順に用意されているDockerイメージを使用してイメージ作成と実行をしていきます。
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/docker-basics.html

具体的には、任意のプロジェクトフォルダ内にDocerfileという名前のファイルを作成して、以下の内容を記述します。

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

現状、保持しているイメージを確認しておきます。

docker images

以下のコマンドでイメージをビルドします。

docker build -t hello-world .

再度、以下のコマンドを実行して、ビルドされたイメージhello-worldが追加されていることを確認します。

docker images

以下のコマンドで、これから起動するもの以外で、Dockerのプロセスが稼働していないか確認します。
何も稼働していなければカラム(列のタイトル)のみ表示されると思います。

docker ps

以下のコマンドを実行して、Dockerコンテナを稼働させます。

  • -d:バックグラウンド実行
  • -p:実行環境のポート番号(任意の番号)とDockerfileで定義しておいたイメージのポート番号を指定して接続する
  • –name:イメージの指定
docker run -d -p 8080:80 --name h4b-local-run hello-world

再度、docker psで、稼働させたコンテナを確認できます。
次に、以下のコマンドで、httpアクセスできることを確認できます。

curl localhost:8080

稼働中のコンテナにメンテナンスアクセスする

稼働中のコンテナにログインしてメンテナンスや調査をする際のコマンドが紹介されていました。(助かりますね。。)

docker exec -i -t h4b-local-run bash

ログインしたら以下のコマンドの流れで、bashからコンテナ内のファイルなどを確認する動作が体感できます。

pwd
ls -la
cd /root 
ls -la
cat run_apache.sh
cd /var/www/html/
ls -la
cat index.html

docker exitコマンドでコンテナを抜けて、docker stop {CONTAINER ID}コマンドで稼働中のコンテナを停止できます。

DockerイメージをECRにあげる

ECRからコンテナ用のリポジトリを作成します。

今回は、以下を参考にCloudFormationを使用して作成していきます。

AWS::ECR::Repository - AWS CloudFormation
Use the CloudFormation AWS::ECR::Repository resource for ECR.

CloudFormationテンプレートは以下にございますのでご参考ください。※他のファイルも後述の手順で使用します

GitHub - kosments/handson-for-ecs-Introduction
Contribute to kosments/handson-for-ecs-Introduction development by creating an account on GitHub.

以下のコマンドでDockerイメージを作成する。
バージョンタグの箇所は、0.0.1にしておく。
タグの後ろに.としてフォルダ配下全てをビルドの対象としている。

docker build -t <ECR の URL>:<バージョン Tag> .

M1macなどでローカル環境で上記のビルドコマンドを実行する場合は、以下のようにしてOSとアーキテクチャを指定します。

docker build -t image-name --platform linux/x86_64 .

docker imagesを実行すると上記が追加されていることが分かる。

ECRにアップロードするために、以下のコマンドを実行しておく。問題なければLogin Succeededと表示される。

aws ecr get-login-password | docker login --username AWS --password-stdin {アカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com

以下のコマンドで、ECRにアップロードする。

docker push {アカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/dev-ecs-helloworld:0.0.1

VPCの作成

ECSを配置するVPCを作成していきます。
例によって、CloudFormationテンプレートを使用していきます。

ALBとECSクラスター、タスク定義、サービスの作成

以下を参考にテンプレートを作成しました。

AWS::ECS::Cluster - AWS CloudFormation
Use the CloudFormation AWS::ECS::Cluster resource for ECS.
Amazon Elastic Container Service
AWS::ElasticLoadBalancingV2::LoadBalancer - AWS CloudFormation
Specifies an Application Load Balancer, a Network Load Balancer, or a Gateway Load Balancer.

CloudFormationテンプレートは、以下に保存されていますので必要に応じて参照いただければと思います。

まずは、ECSクラスターとALBのスタックを作成していきます。

次に、ECSのタスク定義とサービスのスタックを作成していきます。ALBのターゲットグループも指定しているため、作成後すぐにWebからアクセスできるようになります。

作成されたECSタスクのコンテナに付与されたIPアドレスは、ALBのターゲットに追加されていてヘルスチェックも問題ないことが確認できます。

ブラウザからアクセス

必要なリソースが一通り準備できたため、ブラウザからアクセスしてECSが正常に動作しているか確認していきます。

ALBのコンソールを開き、DNS名をブラウザのアドレスバーに貼り付けアクセスします。
ECSサービスの設定まで進み、Configration and Networkingタブを開くとネットワーク設定項目がありますので、使用しているロードバランサーのDNS名をオープンアドレスで開くこともできます。

以下のように表示されていれば問題ないです。

コンテナの自動復旧とスケールアウト

擬似障害を発生させて、自動復旧することを確認していきます。現在は、2つのタスクが起動しています。それぞれのタスクのパブリックIPアドレスにブラウザからアクセスして、HelloWorldが表示されることを確認しておきます。

以下のコマンドを実行して、1秒ごとにhttpリクエストを送り続蹴ておきます。

url=http://{DNS名}
while true; do TZ=JST-9 date; curl $url; sleep 1s; done

タスクを一つ終了しても、HelloWorldが表示され続けて、かつ別のタスクが起動することを確認します。

タスクを終了しても継続して、HelloWorldが返ってきています。

また、即座に別タスクが起動していることが確認できます。

HelloWorldも継続して返ってきています。

まとめ

今回は、AWSハンズオンのECS入門編をCloudFormationで構築して検証まで進めてみました。
ECSに入門するには、非常にわかりやすい内容だったかと思いました。次回以降では、既存の構成をECSに乗せ替えるような検証もしていきたいと思います。
最後までご覧いただきありがとうございました!

コメント

タイトルとURLをコピーしました