みなさん、こんにちは。Webサービスの開発において、AWSを使う場合にどのサービスを利用しよう……と悩む機会も多いかと思います。

昨今流行っているDockerイメージを利用したWebサービスの開発を行うための構成としてECSを利用する手法があり、2020年11月~2021年1月に開催されたAWS re: Inventと呼ばれるAWS主催の大規模イベントでも、ECSに関するセッションが数多く開催される等、ECSはAWSを利用する中でも外せないサービスとなりつつあります。 今回はDockerコンテナを利用してECSからWebサービスを公開する簡単なハンズオンとして、NginxでHello worldを表示するDockerイメージを作成して、ECRとECSを使って公開してみましょう。

やること

(手順の説明のための図なので、構成図とは違うことをご了承下さい)
  • nginxで構成されたDockerイメージをECRにPushする
  • ECSのクラスター/サービス/タスクをそれぞれ構成し、デプロイする
  • デプロイされたアプリケーションにブラウザからアクセスする

本記事では上図の3つの操作を行い、自分で作ったウェブサイトにアクセスできるようになる事を目指します。

前提知識の整理

まず、今回出てくる用語に関して簡単に挙げておきます。

Nginx:Apacheと並びに「Webサーバー」と呼ばれるアプリケーションの一つで、Laravel, RailsのようなWebアプリケーションフレームワークを用いたWebサービスにおいても広く使われています。

Docker:仮想化環境を構築するための技術で、これを用いる事でミドルウェアからアプリケーションまでの構成のコード化や、実行環境が違っても短期間で構築でき(可搬性)、同じように動く(冪等性)メリットを得られます。

Amazon Elastic Container Registry (ECR):Dockerイメージをホストするためのコンテナレジストリで、AWS各サービスとの連携の容易さをメリットとしてECSでもECRを用いて構成するケースが多いです。

Amazon Elastic Container Service (ECS):Dockerコンテナを構成管理するためのサービスで、今回目的とするようなWebアプリケーションのようなものから、バッチ目的のジョブまで様々な用途に応じて柔軟なシステムの構築が行なえます。

そもそも:なぜECSを使うのか?

今回はDockerイメージを利用したWebサービスの開発を行うために……という導入の通り、コンテナ化によってシステム構成のコード化や、開発からデプロイまで開発者目線での扱いやすさといったメリットを多く得られることがECSを使う勘所になります。紹介の手順でも実際の開発の雰囲気が感じられるよう、手順自体の説明が少し冗長になってしまう場合もございますがご了承ください。

手順の流れ

以下の順番で作業を行い、ECSを使ってNginxが利用できることを確認します。

・Nginxの入ったDockerイメージを作成して、ローカルの端末で動作確認を行う
・ECRにリポジトリを作成し、DockerイメージをPushする
・ECSにECRにpushされたイメージを利用したサービスを立ち上げる

それでは実際にハンズオンで試してみましょう。

Nginxの入ったDockerイメージを作成して、ローカルの端末で動作確認を行う

まずは開発者が自分の端末でDockerイメージを立ち上げる事ができるよう、Docker Desktop等のMac/WindowsでのDocker実行環境をインストールしておきます。

次に適当な作業用ディレクトリを作成し、その中にDockerfileという名前で次のようにファイルを作成します。

FROM nginx COPY content /usr/share/nginx/html

ここでは「ベースとなるnginxのオフィシャルのDockerイメージを利用して」「WebサイトのコンテンツをDockerイメージの中に配置する」ような事をDockerfileに書いています。

次はHello, Worldを表示するだけの簡単なhtmlを書いてみましょう。

<!DOCTYPE HTML>
<html lang=”ja”>
<head>    
  <title>Hello, World</title>
</head>
<body>    
 <h1>Hello, World</h1>
</body>
</html>

これを content/index.html として保存します。

├── Dockerfile └── content     └── index.html

こんな構成になっていればOKです。次にお使いのシェルで作業用ディレクトリに移動した後、以下のコマンドを実行します。

$ docker build -t nginx-ecs .

コマンドの最後に「.」がある事に注意して下さい。これは作業用ディレクトリをビルドコンテキストとして定義することを意味します。

次はビルドしたDockerイメージを自分の環境で動作確認してみましょう。

$ docker run -p 80:80 -d nginx-ecs

ブラウザで「localhost」にアクセスした時、先程書いたhtmlが表示されていればOKです。

$ docker rm $(docker stop $(docker ps -a -q –filter ancestor=nginx-ecs –format=”{{.ID}}”))

Dockerコンテナは放っておいても勝手に止まらないので、今回は作成したイメージに関連するコンテナを停止しておきます。

$ docker ps -a | grep nginx-ecs

Dockerのコンテナ一覧から消せた事を確認して、次に進みましょう。

いかがでしたでしょうか。 続きはまた次回お届けします!