はじめに
AWS公式ハンズオンのECS入門編をCloudFormationを使用して実施しましたので、紹介してみたいと思います。
構成図
公式に記載されている通りの構成になりますので、以下をご確認いただければと思います。
実際に進めてみる
まずは環境構築
公式ハンズオンでは、Cloud9を起動してIDEを使用します。私は、ローカル環境のVScodeを使用しますので、この章はスキップしました。必要に応じて環境構築していきましょう。以下の記事でCloud9環境の構築をしていますので、参考にしてみてください。
Dockerがインストールされていることを確認しておく
以下のコマンドを実行して、Dockerがインストールされていることを予め確認しておきます。
docker version
以下のようにバージョン情報が表示されれば問題ないです。
Client:
Cloud integration: v1.0.28
Version: 20.10.17
・
・
〜省略〜
・
・
Dockerがインストールされていない場合は、以下のサイトからインストールしておきます。
MacであればHomebrewからインストールできます。
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を使用して作成していきます。
CloudFormationテンプレートは以下にございますのでご参考ください。※他のファイルも後述の手順で使用します
以下のコマンドで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クラスター、タスク定義、サービスの作成
以下を参考にテンプレートを作成しました。
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に乗せ替えるような検証もしていきたいと思います。
最後までご覧いただきありがとうございました!
コメント