ECSをEC2クラスタからfargateに移行するやり方
今年も桜がちった。写真てアップで撮るより周りの風景も入れたほうが面白いよね。 だけどいろいろ写ってると特定されちゃうよねえ🌸
今回はphpのAPIを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;