Last updated on

AWS Amplify の Fargate 対応で "うまくいかない" docker-compose.yml の書き方


[point_maker type=“heading_icon” base_color=“apple_green” title_icon=“info-circle-solid” title_color_background=“true” title_color_border=“false” content_type=“text” content_color_background=“true” content_color_border=“false” block_editor=“true”]

こちらは、 “ゆるWeb勉強会@札幌 Advent Calendar 2020” の 14日目の記事です。

[/point_maker]

AWS Amplify の API 機能で AWS Fargate をサポートするようになりました。 (2020年12月10日ごろ)

https://aws.amazon.com/jp/about-aws/whats-new/2020/12/amplify-cli-enables-serverless-container-deployments-using-aws-fargate/

このブログ記事の通りにやれば、試すことができます。

Amplify のドキュメントも更新されて情報が追加になっていますね。

https://docs.amplify.aws/cli/usage/containers

私は PHPer なので、最終的に PHP のフレームワークである Laravel を Amplify で動かすことを目指しています。(完成したら、別途記事にします。)

今回は、その過程で docker-compose.yml の書き方に制限があったのでそれを書いておきます。

試す

素直にやる場合

試すのは、こちらのオフィシャルブログに従えばできます。(できました。)

https://aws.amazon.com/jp/blogs/mobile/zero-effort-container-deployment-for-graphql-and-rest-apis-and-web-hosting-with-amplify-cli/

こちらで展開されるファイルは、 GitHub のこちらにありますね。

https://github.com/aws-amplify/amplify-cli/tree/master/packages/amplify-category-api/resources/awscloudformation/container-templates/dockercompose-rest-express

まず、基本的な docker-compose.yml の書き方はこうなります。
Custom でも、当然これに従ってやってみることでうまく行きます。

version: "3.8"
 services:
   express:
     build:
       context: ./express
       dockerfile: Dockerfile
     ports:
       - "8080:8080"
     networks:
       - public
       - private
   python:
     build:
       context: ./python
       dockerfile: Dockerfile
     networks:
       - public
       - private
     ports:
       - "5000:5000"
 networks:
   public:
   private:

buildcontextdockerfile の指定があります。context でビルドするディレクトリを、 dockerfile で実際にビルド対象となるファイル名を指定できます。ローカルでやる場合、この dockerfile は自由に指定可能です。

Custom で試す (うまくいかないパターン)

そして、 PHP のフレームワークを動かそうとする場合、一般的なコンテナの組み方として Webサーバ(Nginx) のコンテナと、 PHP-FPM のコンテナを二つ用意します。かつ、その両方に同一のソースコードを格納する必要があります。

ということで、下記のような docker-compose.yml を書いてみました。

version: "3.8"
services:
  web:
    build:
      context: ./php
      dockerfile: Dockerfile_web
    ports:
      - "8080:8080"
    networks:
      - public
      - private
  app:
    build:
      context: ./php
      dockerfile: Dockerfile_app
    ports:
      - "9000:9000"
    networks:
      - public
      - private
networks:
  public:
  private:

それぞれの Dockerfile_* の中で、 Laravel のコードを COPY しています。

(他のファイルは今回は割愛します。)

これで、ローカルの実行はうまくいきますが、 amplify push すると途中で失敗します。

この時、 CodeBuild のログを確認すると、下記のようなログが残っています。

(snip)

[Container] 2020/12/14 09:00:45 Running command docker build -t $web_REPOSITORY_URI:latest ././php 
52
unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /codebuild/output/src084676718/src/php/Dockerfile: no such file or directory 
53

(snip)

どうやら、 dockerfile の指定は効かないみたいですね。

まとめ

上記のエラーに気づくまでに結構時間を取られてしまったので、いったんはここまで。

そもそも、 Fargate の元のサービスである Amazon ECS の方で Docker Compose 構文の制限に引っかかっていたのかもしれないです。

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/cmd-ecs-cli-compose-parameters.html

成功パターンは、別の記事にまとめたいと思います。