44
43

More than 5 years have passed since last update.

ECSのバックエンドをEC2からFargateに変更

Last updated at Posted at 2019-03-01

概要

ECS+EC2で動作しているアプリケーションをFargateに変更にします。
ECS+EC2での環境構築は、LaravelアプリケーションをAWS上のDockerで動かすを参考にしてください。

全てマネジメントコンソール上で行います。

前提条件

Farageteについて

メリット

  • コンテナのためのEC2の管理が不要
    • コンテナのスケールに合わせてインスタンスタイプの変更、あるいはスケールアウトさせる必要がない
    • インスタンスタイプの選択が不要
  • AutoScaleのタイミング設定が不要

デメリット

  • コンテナホストにssh接続できない
    • Dockerコマンドが実行できないため、コンテナの状況を確認するといったことができない
  • ログドライバがawslogsのみ

料金

EC2単位ではなく、コンテナ単位で料金が発生します。
下記の記事に最新の料金が記載されていましたので、参考にしてみてください。
2019年1月にAWS Fargateが大幅値下げしたのでEC2との価格比を確認してみた | DevelopersIO

nginxの設定ファイルを修正

Fargateでは、コンテナ間通信の宛先は127.0.0.1になります。
nginxの設定ファイルの一部を下記の通り変更します。

default.conf
# 変更前
fastcgi_pass php-fpm:9000;
# 変更後
fastcgi_pass 127.0.0.1:9000;

IAMロールを作成

ECSタスク実行ロールを作成します。
手順は、下記のecsTaskExecutionRole IAM ロールを作成するにはに従って作成してください。
Amazon ECS タスク実行 IAM ロール - Amazon Elastic Container Service

なお、タスク定義のリビジョンの作成前にECSタスク実行ロールが作成されている必要があります。新しいリビジョンの作成の途中でロールを作成した場合、ECSタスク実行ロールを選択することができず、エラーとなります。

ALBのターゲットグループを作成

ALBのターゲットグループのターゲットの種類はipである必要があります。
既存のEC2のALBのターゲットグループがターゲットの種類がinstanceとなっている場合、新規で作成する必要があります。

タスクの定義のリビジョンを作成する

Amazon ECS > タスク定義 から作成済みのタスクを選択し、新しいリビジョンの作成を選択します。

以下の項目を変更します。

項目
ネットワークモード awsvpc
互換性が必要 FARGATE

Fargateの場合、ネットワークモードはawsvpcを設定する必要があります。
nginxの設定ファイルを修正で、コンテナ間通信の宛先を127.0.0.1に変更した理由もここにあります。

タスクサイズ

項目
タスクメモリ (GB) 0.5GB
タスクメモリ (GB) 0.25vCPU

EC2の場合、設定はオプション項目となっていますが、FARGATEを選択した場合は必須となります。

コンテナの定義
コンテナのネットワーク設定でリンクを設定している場合、awsvpcではサポートされていないため変更する必要があります。今回は、EC2で動作している際に、nginxコンテナのネットワーク設定のリンクの設定を削除します。

また、ここではログの設定も行います。
コンテナでの運用の場合、コンテナを落とした際にログが消えてしまうため、ログを外部に出力する必要があります。
今回は、awslogsログドライバーを利用して、標準出力に出力されたログをCloudWatchに送信します。

ストレージとログのログ設定でログの出力先を設定します。
Auto-configure CloudWatch Logsにチェックを入れると、自動でロググループが作成されます。以上でログの設定は完了です。CloudWatchからログを確認することが可能となりました。

スクリーンショット 2019-03-02 15.15.24.png

そのほかの設定の変更がなければ作成を押下して、新しいリビジョンの作成は完了です。

サービスを作成する

Amazon ECS > クラスター から作成済みのクラスタを選択し、サービスタブの作成を押下します。

項目
起動タイプ FARGATE
タスク定義 上記で作成した新しいリビジョンを選択
プラットフォームのバージョン LATEST
クラスタ sample-api-cluster
サービス名 sample-fargate-api
サービスタイプ REPLICA
タスクの数 1

Elastic Load Balancing(オプション)

項目
ELB タイプ Application Load Balancer
サービス用の IAM ロールの選択 自動で生成されるAWSServiceRoleForECSサービスリンクロールが使用される
ELB 名 作成したALBを選択

負荷分散用のコンテナ

nginx:80:80を指定し、ELBへの追加を選択。
ターゲットグループ名に、作成したALBに紐づくターゲットグループを選択を選択。

以上で、ECSの環境構築は完了です。

動作確認

作成したALBのDNS名にアクセスし、動作確認を行います。

余談

Laravelのログを標準出力する際に、以下の余分なメッセージが出力される問題にぶつかりました。

WARNING: [pool www] child 10 said into stdout

原因と対応方法は、https://github.com/docker-library/php/issues/207 に記載されています。
また、PHP7.3ではこの問題が解消しており、 DockerイメージFROM php:7.3.2-fpm-alpineでは余分なメッセージが出力されていないことを確認できています。

参考記事

参考にさせていただきました。ありがとうございます。
AWS FargateでElixirのコンテンツ配信システムを動かしてみた (実装編) - エムスリーテックブログ
AWSにおける本番環境を想定したCI/CD実践 - y-ohgi's blog
AWS Fargate のすヽめ | 開発ブログ | Elastic Infra

44
43
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
44
43