本記事は個人の意見であり、所属する組織の見解とは関係ありません。

こちらはAWS Fargate Advent Calendar 2017の12/2分の記事です。

AWS Fargateを使うことで、コンテナを使ったアプリケーションにだけ集中して開発することができます。今日は、Amazon ECSのコンソールのFirst runチュートリアルを通して、簡単にNginxを立ち上げてみて、変更を加えてデプロイしてみましょう。

First runは以下のリンクから始められます。

1セット作成してみる

Step 1を見ると、Nginxのコンテナ定義はチュートリアルにあるのでそれを選ぶだけで簡単に作成できます。

Screen Shot 2017-12-03 at 12.40.39 AM.png

Step 2では、サービスにApplication Load Balancerを紐付けるチェックボックスを選択します。

Screen Shot 2017-12-03 at 12.41.07 AM.png

Step 3では、Cluster nameを適当につけます。ここではadvent-calendar-2017とします。

Screen Shot 2017-12-03 at 12.41.39 AM.png

Step 4で確認したら作成します。これだけです。実際は選択した情報を元にAWS CloudFormationスタックが作成され、以下のリソースが自動的に生成されます。もちろん、Fargateを使うのでこの中にAmazon EC2インスタンスは含まれていません!

Screen Shot 2017-12-03 at 12.48.05 AM.png

作成が完了したら、Load balancerのリンクを開き、DNS nameをブラウザで開くとNginxのindex.htmlが表示されます。503が返って来る場合は、タスクの起動待ちですのでしばらく待てば大丈夫です。

Screen Shot 2017-12-03 at 12.49.10 AM.png

View Service => Tasksタブから、起動しているタスクの詳細を開くとLogというタブがあるので、そこを見るとNginxのアクセスログが表示されると思います。ALBからのヘルスチェックと自身のブラウザでアクセスしたログが記録されています。なお、実体はAmazon CloudWatch Logsに収集されています。

Screen Shot 2017-12-03 at 12.50.49 AM.png

以上です。とても簡単ですね!、、、だけだと面白くないので、作成したECSサービスをすこしだけいじってみましょう。

スケールしてみる

タスクはFargateで起動されているので、数を変更してスケールさせたい時はサービスのタスク数を変更して更新するだけです。先程作成した時には1タスクになっているので、これを2にしてみましょう。サービスの画面でUpdateをクリックします。

Screen Shot 2017-12-03 at 12.53.44 AM.png

Number of tasksを2に変更して、あとはNext stepを押し続け、最後にサービスを更新します。

Screen Shot 2017-12-03 at 12.54.00 AM.png

しばらくすると以下のようにタスクの数が増えています。ALBへの登録もサービスが自動で行ってくれますので、すぐにALBからのリクエストがバランスされます。

Screen Shot 2017-12-03 at 12.56.50 AM.png

こちらのリンクからCloudWatch Logsの画面に行くと、2つのタスクのログをまとめて見ることができます。

Screen Shot 2017-12-03 at 12.58.24 AM.png

デプロイしてみる

いわゆるデプロイをするために、タスク定義を新たに作成してサービスを更新してみましょう。サービスの詳細画面からTask definitionのリンクをクリックし現在のタスク定義の画面に飛びます(リビジョンの数字は人によって違います)。そして、Create new revisionをクリックします。

Screen Shot 2017-12-03 at 1.01.55 AM.png

下の方にスクロールして、Container Definitionsの中にあるnginxをクリックします。すると、コンテナ定義の変更画面が出てくるので、Imageをより軽量なAlpine Linuxベースに変更するため、nginx:alpineにします。

Screen Shot 2017-12-03 at 1.03.09 AM.png

そのままコンテナ定義の画面を下にスクロールして、Advanced container configurationの中のEntry pointとCommandを以下の様に変更します。

  • Entry point
    • sh,-c (コンマを忘れずに)
  • Command
    • ifconfig eth1 | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1 > /usr/share/nginx/html/index.html && exec nginx -g "daemon off;"
    • コンテナ起動時に、Private IPアドレスをindex.htmlに書き込んでいます。

Screen Shot 2017-12-03 at 1.04.08 AM.png

コンテナ定義のUpdateをクリックして閉じ、一番下のCreateをクリックしてタスク定義を作成します。最後に、今作成したタスク定義でサービスを更新します。ActionsからUpdate Serviceを選択します。

Screen Shot 2017-12-03 at 1.11.49 AM.png

変更画面が開くと、Task Definitionが新しくなっているので、ClusterとService nameが間違っていないことを確認したらNext stepを押し続け、最後にUpdateをクリックします。

Screen Shot 2017-12-03 at 1.13.03 AM.png

これによって、新旧タスクがいわゆるBlue/Greenデプロイの形で入れ替わります。デフォルトの設定では、デプロイ中も最低限100%(2タスク)を確保しつつ、最大で200%(4タスク)が同時実行されることを許容する設定にしているので、おおまかには以下の様な流れでデプロイが実行されます:

  1. 新タスク定義のタスクが2つ起動する
  2. 新タスク定義のタスクがALBに登録され、Healthyになる
    • この時点で、トラフィックは新旧混在状態になる
  3. 旧タスク定義のタスク2つがALBから解除される
    • この時点で、トラフィックは新タスクのみになる
    • ALBのTarget GroupのDeregistration Delayがデフォルトだと300秒になっているので、ここから5分かかるが、0秒に変更すれば即座に解除される。
  4. 旧タスク定義のタスク2つが削除され、サービス更新完了

ALBのDNS nameに何度かアクセスしてみると、表示されるIPアドレスが入れ替わることが分かると思います。

作成した環境を削除する

最後に、今作成した環境を削除しておきます。といっても簡単で、ECSのクラスタを削除すれば、関連するリソースを全て自動的に削除してくれます。具体的には、CloudFormationスタックが削除されます。

Screen Shot 2017-12-03 at 1.26.16 AM.png

進捗も表示されるので安心です。

Screen Shot 2017-12-03 at 1.26.36 AM.png

まとめ

First runチュートリアルで数クリックでNginxをFargateで立ち上げた後に、スケールしたりデプロイしてみたりしました。タスクのこととサービスのことだけに集中して作業できることがお分かり頂けたかと思います。