AWS FargateでnginxとLaravelをsocket通信させるとき

この記事はトラブルシューティング系の記事です。

経緯

nginxとlaravelをfargeteでsocket通信させるときにphp-fpm.sockってどうやって共有したらいいんだっけ?と思い備忘録的に記事にしようと思います。

結論

bind mount機能を使用します。(公式マニュアル

概要

terraformでfargate環境を構築していたのですが、nginxからlaravelコンテナに通信ができないトラブルがありました。ローカル環境では通信周りで困らなかったので少し時間をかけて調査していたら、fargate上ではphp-fpm.sockを共有してないことに気づきました。

ローカル環境ではdocker-compose.ymlで/var/run/php-fpmをマウントするようにしていたのですが、それをaws fargateで構築するときに、すっかり考慮することを忘れていました。

そのため、fargateの機能を使わないと共有できないのですが、aws fargateではDocker volumesとBind mountでの共有方法が書かれていました。

ただ、Docker volumesのほうはterraformで構築不可のエラーとなってしまったため、Bimd mountの方法を採用しました。

方法

terraformでaws_ecs_task_definitionでvolume属性を追加します。

resource "aws_ecs_task_definition" "service" {
  ・
  ・
  ・
  volume {
    name      = "service-storage"
  }
}

そして、container_definitionsの該当コンテナに以下のようにmoutPoints属性を追加するだけです

{
  "name": "nginx",
  "image": "nginx:latest",
  "mountPoints": [
    {
      "sourceVolume": "php-fpm-socket",
      "containerPath": "/var/run/php-fpm"
    }
  ]
}

moutPointsを同様にLaravelのコンテナに追加すれば完成です

最後に

普段はdocker-compose.ymlでテンプレを引用するだけで、深く気にしたことがなかったので、勉強になりました。コンテナ間で何かしたら共有するときにこの知識は役に立ちそうでよかったです。

この記事が気に入ったらサポートをしてみませんか?