Laravel9 + Fargate に Supervisor を導入

# はじめに

# 初期構築

下記記事を参考に初期構築をします。

https://qiita.com/hirai-11/items/241df305a90af3ccf973

リポジトリはこちら



# Supervisorを導入

## Dockerfileを編集
`./docker/php/Dockerfile`内を２箇所修正します。
```diff_docker:./docker/php/Dockerfile
FROM php:8.1-fpm-bullseye

ENV TZ=Asia/Tokyo \
  # locale
  LANG=ja_JP.UTF-8 \
  LANGUAGE=ja_JP:ja \
  LC_ALL=ja_JP.UTF-8 \
  # composer environment
  COMPOSER_ALLOW_SUPERUSER=1 \
  COMPOSER_HOME=/composer

COPY --from=composer:2.3 /usr/bin/composer /usr/bin/composer

RUN apt-get update \
  && apt-get -y install --no-install-recommends \
    locales \
    git \
    libzip-dev \
    libicu-dev \
    libonig-dev \
+   supervisor \
    unzip \
    vim \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/* \
  && locale-gen ja_JP.UTF-8 \
  && localedef -f UTF-8 -i ja_JP ja_JP.UTF-8 \
  && docker-php-ext-install \
    bcmath \
    intl \
    pdo_mysql \
    zip \
  && composer config -g process-timeout 3600 \
  && composer config -g repos.packagist composer https://packagist.org

COPY ./src /var/www/html
COPY ./docker/php/php.ini /usr/local/etc/php/php.ini
+ COPY ./docker/php/laravel-worker.conf /etc/supervisor/conf.d

WORKDIR /var/www/html
RUN composer install -q -n --no-ansi --no-dev --no-scripts --no-progress --prefer-dist \
  && chown -R www-data:www-data ./ \
  && chmod -R 777 storage bootstrap/cache \
  && php artisan optimize:clear \
  && php artisan optimize \
  && php artisan cache:clear \
  && php artisan config:clear \
  && php artisan route:clear \
  && php artisan view:clear \
```

管理プロセス設定ファイルを`./docker/php/laravel-worker.conf`という名前にして、作成します。


```conf:./docker/php/laravel-worker.conf
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/html/artisan queue:work --sleep=3 --tries=3
autostart=true
autorestart=true
user=root
numprocs=2
redirect_stderr=true
stdout_logfile=/var/www/html/storage/logs/worker.log
```
fargateの側のルートディレクトリを`/var/www/html/`と想定した場合の設定になります。


# タスク定義を変更する
タスク定義で、`Supervisor`を起動させるコマンドを追加させる必要があります。

タスク定義のコマンド変更前
```
php artisan config:cache && php artisan view:cache && php artisan route:cache && php artisan migrate --force && chown -hR www-data:www-data storage bootstrap/cache && php-fpm && composer install --optimize-autoloader --no-dev
```
タスク定義のコマンド変更後
```
service supervisor start && php artisan config:cache && php artisan view:cache && php artisan route:cache && php artisan migrate --force && chown -hR www-data:www-data storage bootstrap/cache && php-fpm && composer install --optimize-autoloader --no-dev
```
先頭に`service supervisor start &&`を追加しただけです。

![スクリーンショット 2022-11-12 16.53.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/2a100203-e911-25c4-7be9-0d543da9d58d.png)

**注意**
`service supervisor start &&`をコマンドの先頭ではなく、最後に持ってくると、supervisorが起動しませんでした。
必ず先頭に持っていきましょう。

これで、fargateのタスクが立ち上がると、supervisorが起動します。

# supervisorの起動を確認

ECS EXECでfargateのタスク内に入ります。

ECS EXEC方法は、下記記事を参考にしてください。

https://qiita.com/hirai-11/items/261d06c3fb0c39b014e0

タスク定義のコマンド変更前
```terminal
# service supervisor status
supervisord is  not running.
# service supervisor start 
Starting supervisor: supervisord.
# exit
```

タスク定義変更後
```terminal
# service supervisor status
supervisord is running
# supervisorctl status
laravel-worker:laravel-worker_00   RUNNING   pid 32, uptime 0:08:48
laravel-worker:laravel-worker_01   RUNNING   pid 33, uptime 0:08:48
```
laravel-workerを確認できました。

# 参考

https://readouble.com/laravel/9.x/ja/queues.html#supervisor-configuration

supervisordのコマンド

https://qiita.com/hirai-11/items/54f0b7aa9c11004bf096