すこぶる.net

技術系備忘録など

AWS Copilot CLI Fargate Laravel

AWS Copilot CLI で Laravel アプリケーションを Fargate にデプロイして Nginx とコンテナ間共有する

投稿日:2023年8月19日 更新日:

Copilot CLI で Fargate にデプロイした Laravel コンテナと Nginx コンテナのファイル共有

AWS Copilot CLI を使用して Laravel フレームワークで開発した PHPアプリケーション を Fargate にデプロイする際に私自身が困ったことを中心に記したいと思います。

まず今回やりたかったことについて説明します。
Nginx と Laravel のコンテナをデプロイして同じ Fargate タスクに含めたいという状況で、Nginx のコンテナはサイドカーで実行する形を取ります。(構成についてはもう少し考えたい部分はありますがご了承ください。)
まず Laravel のコンテナイメージを ECR にアップロードする必要があります。その際に、 composer install, npm install などいくつか処理したい内容が Dockerfile に記載されていました。
そして、Nginx のコンテナイメージを ECR にアップロードして、Laravel と Nginx の2つのコンテナを同じタスクとして Copilot CLI でデプロイします。

Nginx に来た静的なコンテンツに関しては、 nginx.conf の root で指定した /var/www/html/public から直接返したいと思います。

そこで、Laravel コンテナのボリューム /var/www/html/public を Nginx に共有する方法を取ることにしました。
ボリュームソースとして Laravel コンテナを指定し読み取りができるように Nginx コンテナ側にバインドマウントさせます。
実は以上のことを Fargate で実現する事自体は特に難しい話ではありません。
( ここまでの構成や設定については、ユニファ株式会社さんの 開発者ブログの記事 がとても丁寧にまとめてくれていますので参考にしてください。 )

では今回どこで苦労したかというと、これをどのように Copilot のマニフェストで実現すればよいのかというところでした。( Nginx のコンテナイメージをビルドする際に Laravel コンテナ同様にアプリケーションを含めるということも可能ですが、殆ど変更のない Nginx のコンテナイメージを毎回 Laravel のアプリを更新するためだけにビルドしてアップロードするのは大変ですし、イメージサイズの肥大にもなり、無駄が多くとても Bad な手段・アーキテクチャとなってしまいます。)

ちなみに、マウントポイントに関してはドキュメントに方法が記載されていますが、ボリュームソースの設定に関しては記載がありません。

今回は下図のようになることが目標です。

コンテナのボリューム設定

解決策: Copilot マニフェストの書き方

さっそくどのようにすべきかについてですが、対応していないものは taskdef_overrides というセクションを利用するのがよいことが分かりました。
ECSタスク定義に関するドキュメントや、実際に動いているコンテナの定義をコンソールから確認することで、変更すべき項目が "ContainerDefinitions[1].VolumesFrom[-]" であることが分かりました。

“ContainerDefinitions[1].VolumesFrom[-]”

ちなみに以下のようなこともあったので、 copilot svc package コマンドでも確認した方がよさそうです。

オーバーライドすべき項目がわかったので以下のマニフェストを実行し、上図 “コンテナのボリューム設定” のようにボリュームソースとしてソースコンテナを Laravel コンテナに指定することができました。

さいごに

よくドキュメントを読んでいれば taskdef_overrides についても気づけましたが… 今回は以上となります。

余談:AWS Copilot CLI は Pipeline や Schedule Job の作成、シークレットマネージャーとの連携、 App Runner の作成などにも対応していますし、開発がしっかり進められているので今後にも期待です。

Github: aws/copilot-cli

-AWS, Copilot CLI, Fargate, Laravel
-, , , , , ,

執筆者:

関連記事

NginxからプライベートのS3にリバースプロキシ

概要 Nginx から AWS にあるプライベートな S3 のバケットにリバースプロキシしたいという要件があったため、その方法をご紹介します。 AWS にある EC2 上からであれば、IAM Role …

【AWS WAF】検知したリクエストをCloudWatch Logs で確認する

AWS WAF で検知、ブロックしたリクエストを CloudWatch Logs で確認する AWS で CloudFront や ALB に WAF を設定した際に、WAFで検知したリクエストの詳細 …

【CloudWatch Log Insights】WAFのログからUser-Agentを抽出する方法

AWS WAF のログからUser-Agent(ユーザーエージェント)を抽出して分析したい AWS WAF のログを CLoudWatch Log Insights で分析した際に、User-Agen …

DNSの多段CNAMEとRoute53のエイリアスレコードとは

多段 CNAME とは 多段 CNAME とは、 DNS において、 CNAME レコードに別の CNAME レコードを登録することです。 具体的には以下のようなレコードを多段 CNAME といいます …

【AWS Lightsail】データベースのタイムゾーン変更方法

Amazon Lightsail のデータベースのタイムゾーン変更方法について Amazon Lightsail のデーターベースを使っているときに、time_zone を UTC から Asia/T …