ただメモができるだけのブラウザアプリ「TextArea」はこちらw

Laravel11をECS-Fagateにデプロイする

fargate

Laravel11をECS(Amazon Elastic Container Service)-Fagateにデプロイします!!!

以下の順で進めていきます。今回はとりあえずFargate上で動くことをゴールにしますので、MySQLは使いません。

  1. ローカルでLaravel11を立ち上げる
  2. ECR(Amazon Elastic Container Registry)にLaravelイメージをpushする
  3. ECRのイメージを使って、ECS(Amazon Elastic Container Service)-Fagateにデプロイ

まずは、ローカルでLaravel11を起動していきます。

ローカルでLaravel11を起動する

まずは、完成系のディレクトリ構成から記載します。

ディレクトリ構成

以下のような構成となります。


├── docker
│   ├── nginx
│   │   ├── Dockerfile
│   │   └── default.conf
│   └── php
│       └── Dockerfile
└── docker-compose.yml

ディレクトリの作成

上記ディレクトリ構成を作成するためのディレクトリを作成します。

mkdir fargate_laravel
cd fargate_laravel/

準備はできましたので、ディレクトリ構成に記載のディレクトリとファイルを作成していきます。

docker-compose.ymlの作成

docker-compose.ymlを作成します。

vi docker-compose.yml

<ファイルの中身>


version: '3'
services:
  app:
    build:
      context: .
      dockerfile: ./docker/php/Dockerfile
    container_name: app_laravel
    volumes:
      - .:/var/www
  nginx:
    build:
      context: .
      dockerfile: ./docker/nginx/Dockerfile
    container_name: nginx_laravel
    ports:
      - 8000:80
    working_dir: /var/www
    depends_on:
      - app

nginxのdefault.confを作成

nginxのdefault.confを作成します。

mkdir docker/nginx

vi docker/nginx/default.conf

<ファイルの中身>


server {
  listen 80;
  root /var/www/laravel-project/public;
  index index.php;
  location / {
    root /var/www/laravel-project/public;
    index index.php;
    try_files $uri $uri/ /index.php?$query_string;
  }
  location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;   # 正常に動作しない場合は、app:9000に書き換える
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  }
}

nginxのDockerfileの作成

nginxのDockerfileを作成します。

vi docker/php/Dockerfile

<ファイルの中身>

FROM nginx:1.25
COPY  docker/nginx/default.conf /etc/nginx/conf.d/

アプリコンテナのDockerfile作成

アプリコンテナのDockerfile作成を作成します。

mkdir docker/php

vi docker/php/Dockerfile

<ファイルの中身>


FROM php:8.3-fpm

RUN apt-get update \
  && apt-get install -y zlib1g-dev mariadb-client vim libzip-dev \
  && docker-php-ext-install zip pdo_mysql

#Composer install
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php composer-setup.php
RUN php -r "unlink('composer-setup.php');"
RUN mv composer.phar /usr/local/bin/composer

ENV COMPOSER_ALLOW_SUPERUSER 1

ENV COMPOSER_HOME /composer

ENV PATH $PATH:/composer/vendor/bin

COPY ./ /var/www/

RUN chmod -R 777 /var/www/

WORKDIR /var/www


RUN composer global require "laravel/installer"

必要なファイル作成が終わりましたので、コンテナ立ち上げてLaravel11をインストールしていきます。

コンテナ立ち上げ

以下のコマンドでコンテナを立ち上げます。

docker compose up -d

Laravel 11のインストール

アプリコンテナの中に入りLaravel11をインストールします。

# アプリコンテナに入るコマンド
docker compose exec app bash
# Laravel11インストールコマンド
composer create-project --prefer-dist laravel/laravel laravel-project "11.*"

ブラウザで「http://localhost:8000/」 へアクセスして以下の画面が表示されればOK!

 

 

次は、ECRにイメージをpushして行きます。

ECR(Amazon Elastic Container Registry)にLaravelイメージをpush

以下のコマンドで、AWSの接続設定をしておきます。

aws configure

次にECRログインします。


aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin {AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com

以下のコマンドでリポジトリを作成します。


aws ecr create-repository \
        --repository-name laravel.test \
        --image-scanning-configuration scanOnPush=true \
        --region ap-northeast-1 

aws ecr create-repository \
        --repository-name nginx \
        --image-scanning-configuration scanOnPush=true \
        --region ap-northeast-1

以下のコマンドでビルドします。

docker compose up --build

Laravelアプリのタグ作成します

docker tag fargate_laravel-app:latest {AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/laravel.test:latest

Laravelアプリのpushです

docker push {AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/laravel.test:latest

Nginxのタグ作成します

docker tag nginx:latest {AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/nginx:latest

Nginxのpushです

docker push {AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/nginx:latest

次に、Fagateにデプロイします!

ECS(Amazon Elastic Container Service)-Fagateにデプロイ

クラスターの作成

以下の設定で作成します。指定箇所以外は任意の値で大丈夫です。

  • インフラストラクチャ:AWS Fargate (サーバーレス)

タスク定義の作成

以下の設定で作成します。指定箇所以外は任意の値で大丈夫です。

  • インフラストラクチャの要件
    • 起動タイプ:AWS Fargate
    • オペレーティングシステム/アーキテクチャ:自分のPCと一致するもの(基本はx86_64でOK、M1/M2 MacはARM64を選択)
      • この設定に誤りがあると「exec /usr/local/bin/start-container: exec format error」エラーになります。
    • タスクサイズ
      • CPU:.5 vCPU
      • メモリ:1GB
  • コンテナ – 1
    • 名前:app
    • イメージURI:{AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/laravel.test:latest
  • コンテナ – 2
    • 名前:nginx
    • イメージURI:{AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/nginx:latest
    • コンテナポート:80
    • アプリケーションプロトコル:HTTP

タスク起動

作成したクラスターのタスクタブにある「新しいタスクの実行」を押下

  • コンピューティング設定:起動タイプ
  • デプロイ設定
    • ファミリー:先ほど作成したタスクを設定
    • リビジョン:最新
  • ネットワーキング
    • セキュリティグループ:ポート80の許可を追加

動作確認

作成したクラスターのタスクタブの任意のタスクの詳細を開きます。

パブリックIPが表示されるので、パブリックIPでブラウザからアクセスします。

以下の画面が表示されればOKです。

コンテナ利用時のログ出力に関する記事もありますので、気になる方は以下をクリックくださーい

Laravelをコンテナで運用する際のログ出力は、JSON形式で標準出力した方が良い
Laravelをコンテナで運用する際のログ出力は、JSON形式で標準出力した方が良いということを書いていきます。 Laravelに限らず、コンテナでは、JSON形式で標準出力が良いと思いますが、Laravelでは簡単にログをJSON形式で標...
スポンサーリンク
AWSLaravelPHP
フォローする
さゆフィクション