ECSをEC2クラスタからfargateに移行するやり方

sakura
sakura2019
今年も桜がちった。写真てアップで撮るより周りの風景も入れたほうが面白いよね。 だけどいろいろ写ってると特定されちゃうよねえ🌸

今回はphpAPIをECSのEC2クラスタモードで動かしていたんだけど、 それをfargateに移行するという話🐶

もともと使っていたecsのパラメータの設定とdockr-compose.ymlは以下。 nginxとphp-fpmを立てている

💁こいつをfargate化していく💁

パラメータファイル

version: 1
task_definition:
  ecs_network_mode: bridge
  task_size:
    mem_limit: 0.5 GB
  services:
    php-fpm:
      essential: true
      mem_reservation: 256m
    nginx:
      essential: true
      mem_reservation: 128m

docker-compose.yml

version: '2'
services:
  nginx:
    image: hogehoge/nginx
    ports:
      - ":80"
    depends_on:
      - php-fpm
    links:
      - php-fpm
    volumes_from:
      - php-fpm
  php-fpm:
    image: hogehoge/php-fpm

そしてサービスを更新するときのコマンドはこれ↓

 ecs-cli compose \
      --file docker-compose.yml \
      --ecs-params [ECSのパラメータファイル] \
      --project-name [プロジェクトネーム] \
      service \
      --cluster [クラスタネーム] \
      --region ap-northeast-1 \
      up \
      --launch-type EC2 \
      --deployment-min-healthy-percent 50 \
      --target-group-arn [ターゲットグループARN] \
      --container-name nginx \
      --container-port 80 \
      --timeout 10

そして。。無事fargate化されたのが、これだ

1 2 3 ✍️

ecsパラメータファイル

version: 1
task_definition:
  ecs_network_mode: awsvpc  👈 ネットワークモードがawsvpcに変える
  task_execution_role: [タスク実行ロールARN] 👈task_execution_roleなるものが必要になる
  task_size:
    mem_limit: 1 GB
    cpu_limit: 0.25 vCPU 👈CPUリミット指定
  services:
    php-fpm:
      essential: true
      mem_reservation: 512m
    nginx:
      essential: true
      mem_reservation: 256m
run_params:
  network_configuration:
    awsvpc_configuration:
      subnets: [サブネットID]
      security_groups:
        - [セキュリティグループID]
      assign_public_ip: DISABLED

docker-compose.yml

version: '2'
services:
  nginx:
    image: hogehoge/nginx
    ports:
      - "80:80"  👈 awsvpcモードだとhost側のportも明示的に指定してやる必要がある.
    depends_on:
      - php-fpm
    volumes_from:
      - php-fpm
  php-fpm:
    image: hogehoge/php-fpm

実行コマンド

ecs-cli compose \
      --file docker-compose.yml \
      --file ecs-compose.yml \
      --ecs-params [パラメータファイル] \
      --project-name [プロジェクトネーム] \
      service \
      --cluster [クラスタネーム] \
      --region ap-northeast-1 \
      up \
      --launch-type FARGATE \ # FARGATEに
      --deployment-min-healthy-percent 50 \
      --target-group-arn [ターゲットグループARN] \
      --container-name nginx \
      --container-port 80 \
      --timeout 10

❗気をつけるポイント

タスク実行ロールを作る必要がある

Amazon ECS タスク実行 IAM ロール - Amazon Elastic Container Service

Amazon ECS コンテナエージェントはユーザーに代わって Amazon ECS API アクションを呼び出すため、エージェントがユーザーに属していることをサービスに伝えるために、IAM ポリシーおよびロールが必要です。

awsvpcモードになるとlink機能が使えなくなる代わりに他のコンテナにlocalhostでアクセスできる。(portを指定してアクセス)

これがけっこうハマりどころ

fastcgi_split_path_info ^(.+\.php)(/.+)$;
       fastcgi_pass 127.0.0.1:9000; 👈これが正解(nginxコンテナからポート9000でphp-fpmコンテナにアクセスできる)
       # fastcgi_pass php-fpm;       👈 これはだめ(dockerのlink機能を使ってしまっている)!
       fastcgi_index index.php;
       include fastcgi_params;

ガンバ🙋