Laravel11をECS(Amazon Elastic Container Service)-Fagateにデプロイします!!!
以下の順で進めていきます。今回はとりあえずFargate上で動くことをゴールにしますので、MySQLは使いません。
- ローカルでLaravel11を立ち上げる
- ECR(Amazon Elastic Container Registry)にLaravelイメージをpushする
- 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 -p docker/nginx
vi docker/nginx/default.conf
<ファイルの中身>
server {
listen 80;
root /var/www/laravel-project/public;
index index.php;
location / {
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/nginx/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です。
コンテナ利用時のログ出力に関する記事もありますので、気になる方は以下をクリックくださーい