雑記
 

AWS ECS (Fargate)で Dockerコンテナを動かす

2020/2/22

この記事が対象とする製品・バージョン

  Azure × 対象外です。
  AWS 対象です。
  Visual Studio × 対象外です。

目次

1.概要

この記事ではASP.NET CoreのサンプルWebアプリケーションをAWS ECS (Fargate)で実行し、ブラウザーからアクセスします。

この記事ではASP.NET Coreのサンプルを使用しますが、Dockerを使っているため、PHPのサンプルでも、Javaのサンプルでも同じ要領で実行できます。

自作のコンテナを使用するには、手順の途中でコンテナのイメージを指定する箇所を自作のイメージに置き換えます。自作のイメージはECRなどECSからアクセスできる場所にあらかじめ配置しておく必要があります。

初回実行ウィザードを使ってシンプルな設定を行います。

発展 発展学習  -  ASP.NET CoreのWebアプリケーションを最も簡単に稼動させられるのはAzure AppService

発展学習では意欲的な方のために現段階では特に理解する必要はない項目を解説します。

AWSやDockerというこだわりがなく、ASP.NET CoreのWebアプリケーションを稼動させることが目的の場合は、AzureのApp Serviceが最も簡単です。そのうえ、App Serivceには期間の制限がない無料プランもあるため、クリティカルではないWebアプリケーションを稼動させるにうってつけです。詳細は下記の記事に記載しています。

無料でAzureを使ってVB/C#のアプリを公開する方法

また、AWS EC2でDockerを動作させたり、Dockerを使わずにASP.NET CoreのWebアプリケーションを稼動させることもできます。

 

2.手順

2-1.初回実行ウィザードの開始

初めての場合はAWSコンソールでECSにアクセスすると、「今すぐ始める」ボタンが表示されるのでこれをクリックして、初回実行ウィザードにアクセスします。

 

初めてでない場合など、「今すぐ始める」ボタンが表示されない場合は、下記URLで初回実行ウィザードにアクセスします。

東京リージョン(ap-northeast-1)でない場合、URL内のリージョンを変更してください。

https://ap-northeast-1.console.aws.amazon.com/ecs/home?region=ap-northeast-1#/firstRun

 

2-2.コンテナのイメージの設定

初回実行ウィザードでは、まずコンテナ定義で custom の「設定」をクリックします。

※こだわりがなければ他のサンプル用のイメージを選択して、手順を簡略化することもできます。

 

コンテナ名は任意。ここでは aspnetsample としておきます。

イメージにこのイメージが配置されている場所を指定します。

Docker Hubのようなパブリックなレジストリであれば単純に指定するだけでOKです。ここではdocker hubで公開されているASP.NET Core Webアプリケーションのサンプルとして mcr.microsoft.com/dotnet/core/samples:aspnetapp を指定します。

メモリ制限 500

ポートマッピング 80

ポート 80 を指定することでコンテナとHTTPで通信できるようになります。

ユーザーのブラウザーとはHTTPではなく、HTTPSで通信することが推奨されているので、この後の設定でロードバランサーを使用しない場合はポート80で通信できるようにすることは実用上好ましくありません。実験やお試しには便利です。

「更新」ボタンをクリック

 

2-3.タスク定義

タスク定義はデフォルトのまま「次」をクリックします。

タスクとはコンテナを実行する処理のことです。コンテナを立ち上げる場合は必ずタスクが起動します。複数のコンテナを同時に使う場合は、タスクも複数起動します。

 

2-4.サービス定義

サービスを定義するでも、デフォルトのまま「次」をクリックします。

サービスとは必要に応じてタスクを起動する司令塔のような役割です。

今回はECSのシンプルな使い方を知る目的でロードバランサーなしにしていますが、実用ではロードバランサーを使うことになります。

ロードバランサーを使用したい場合は、ロードバランサーの種類で Application Load Balancer を選択してください。

こちらを選択するだけでロードバランサーが自動的に作成されコンテナにアクセスできるように構成されます。

ロードバランサーはEC2のポータルから確認できます。

 

2-5.クラスター

クラスターの設定でもデフォルトのまま「次」をクリックします。

 

最後の確認画面で作成をクリックします。

作成中画面になり、2、3分で完了します。

 

 

3.Webアプリケーションへのアクセス

割り当てられたIPアドレスをブラウザーに入力するとコンテナで公開されているWebアプリケーションを表示できます。

割り当てられたIPアドレスは次の方法で確認できます。

まず、AWSコンソールで対象のAmazon ECS クラスターを表示します。

東京リージョンの場合、次のURLでもアクセスできます。

https://ap-northeast-1.console.aws.amazon.com/ecs/

 

defaultというクラスターが作成されています。defaultをクリックします。

タスクタブのタスク(ランダムな英数で表示されています)をクリックします。

ネットワークのパブリックIPに表示されているIPアドレスが求めるIPアドレスです。

 

これを使ってブラウザーのアドレスバーに次のように入力します。

http://パブリックIPアドレス/

http://99.99.99.99/

コンテナで実行されているWebアプリケーションの画面が表示されます。

マイクロソフトはこのイメージを頻繁に更新しているようなので、画面はこれとは異なるものが表示されるかもしれません。

 

ロードバランサー(Application Load Balancer)を使用する設定にした場合は、上記のIPアドレスでもアクセスできますが、ロードバランサーのDNSでアクセスすべきです。そうでないとせっかく設定したロードバランサーの意味がありません。

ロードバランサーのDNSを確認するには、

クラスター default をクリックして、サービスタブのサービス名をクリックして、ロードバランシング欄のターゲットグループ名をクリックします。

次に「基本的な設定」欄でロードバランサーをクリックし、表示されるDNS名を使ってWebアプリケーションにアクセスできます。

たとえば、DNS名に EC2xxxxxxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com と表示されている場合、アプリケーションのURLは下記の通りです。

http://EC2xxxxxxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com/

 

4.実行するコンテナ数の変更

初回実行ウィザードではデフォルトではコンテナを1つだけ実行します。

(厳密には、タスクを1つだけ実行するという表現の方が適切です。そしてウィザードで作成されたタスクはコンテナを1つだけ実行するので結果としてコンテナが1つだけ実行されます。)

設定を変更することで複数のコンテナを同時に実行できます。

設定方法

クラスター default をクリックして、サービスタグのサービス名をクリックして、右上の「更新」ボタンをクリックします。

タスクの数で同時に実行したいコンテナ数を指定します。たとえば、「2」。

後はデフォルトのまま「次のステップ」を何回かクリックし、最後に「サービスの更新」をクリックすれば完了です。

 

5.ロードバランサー

以上、ECSの初回実行ウィサードを使うことで簡単にDockerコンテナを動作させることはできますが、デフォルトの設定だとコンテナ1個がぽつんと動作しているだけでECSのありがたみがほとんどありません。

サービス定義でタスク数を2に変更すると、2つ動作させることはできますが、それぞれ別のIPアドレスが割り当てられ、完全に別物として動作します。

これではコンテナを大量に実行して負荷分散するという使い方ができませんし、実行中のコンテナの1つが、何かの異常で停止してしまった場合、同じURLやIPアドレスでもう1つのコンテナにアクセスすることはできません。(ただし、ECSは異常停止したコンテナに代わって、新しいコンテナを自動的に開始することで、定義された実行数を維持します。)

※異常停止したときの具体的な動作を試してみたいのですが、どうやったら異常停止させられるものか・・・。正常停止させた後、新しく立ち上がるコンテナは停止前とは異なるIPアドレスが割り当てられるので異常停止の場合も同じだと思います。サービスのサービスタイプによってこの動作は変わるかもしれません。(私の知識ではわかりません。)

理想的には、Webサイトを利用するユーザーにIPアドレスやURLを意識させないで継続的にアプリケーションを利用してもらいたいところです。

 

ロードバランサーを設置すると、ユーザーは直接コンテナのWebアプリケーションにアクセスするのではなく、ロードバランサー経由でWebアプリケーションにアクセスするようにできます。裏のコンテナが停止しても、ロードバランサーが自動的に生きているコンテナに転送(フォワード)してくれるので、使用しているユーザーからは同じIPアドレス・URLでアプリケーションを使用し続けているように見えます。

ウィザードの途中の「サービスを定義する」で、ロードバランサーにApplication Load Balancerを選択すると、ウィザードは自動的にロードバランサーも作成してくれます。

参考:サービスロードバランシング

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/service-load-balancing.html