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

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

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

Amplify CLI が、AWS Fargate を使用したサーバーレスコンテナのデプロイを実現製品
Amplify CLI が、AWS Fargate を使用したサーバーレスコンテナのデプロイを実現 aws.amazon.com
Amplify CLI が、AWS Fargate を使用したサーバーレスコンテナのデプロイを実現

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

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

Advanced workflows - Serverless containers - Amplify DocsServerless containers provide the ability for you to deploy APIs and host websites using AWS Fargate. Customers with existing applications or those who require a lower level of control can bring Docker containers and deploy them into an Amplify project fully integrating with other resources.
Advanced workflows - Serverless containers - Amplify Docs docs.amplify.aws
Advanced workflows - Serverless containers - Amplify Docs

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

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

試す

素直にやる場合

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

Zero-effort Container deployment for GraphQL and REST APIs and Web Hosting with Amplify CLI | Amazon Web ServicesAWS Amplify is the fastest and easiest way to build cloud-powered mobile and web apps on AWS. Amplify comprises a set of tools and services that enables front-end web and mobile developers to leverage the power of AWS services to build innovative and feature-rich applications. With today’s Amplify CLI release, we’re enabling front-end web and […]
Zero-effort Container deployment for GraphQL and REST APIs and Web Hosting with Amplify CLI | Amazon Web Services aws.amazon.com
Zero-effort Container deployment for GraphQL and REST APIs and Web Hosting with Amplify CLI | Amazon Web Services

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

aws-amplify/amplify-cliThe AWS Amplify CLI is a toolchain for simplifying serverless web and mobile development. - aws-amplify/amplify-cli
aws-amplify/amplify-cli github.com
aws-amplify/amplify-cli

まず、基本的な 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 構文の制限に引っかかっていたのかもしれないです。

Docker Compose ファイル構文の使用 - Amazon Elastic Container Serviceecs-cli compose および ecs-cli compose service コマンドを使用すると、タスク定義を作成し、Docker Compose ファイルを使用して Amazon ECS タスクおよびサービスを管理できます。詳細については、「 」および「 」を参照してください。
Docker Compose ファイル構文の使用 - Amazon Elastic Container Service docs.aws.amazon.com
Docker Compose ファイル構文の使用 - Amazon Elastic Container Service

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

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください