LoginSignup
19
22

More than 3 years have passed since last update.

LaradockをAWS Elastic Beanstalkで使用する

Last updated at Posted at 2017-12-30

LaravelではLaradockを使うことによって簡単にDockerで環境を構築できます。

「Laradockを本番/開発環境でも使いたい」という方のために、今回はLaradockをAWS Elastic Beanstalkで使用する方法をご紹介します。

概要

  • Elastic Beanstalkは複数コンテナ環境(Multi-Container Docker)を使用
  • LaradockからはNginxとPHP-FPMを利用

今回はLaradockのv5.85を使用しますが、基本的にどのバージョンでも実現可能です。
最終的な構成はGitHub (hareku/laradock-aws-elastic-beanstalk)で公開しています。

実装方法

AWS ECR にイメージを保存

まずは使用するイメージをAWS ECRに保存します。

NginxとPFP-FPMをビルドしましょう。

docker-compose build nginx php-fpm

次にAWS ECSのコンソール画面からそれぞれのリポジトリを作成します。(nginx、php-fpm)
作成後、ビルドしたイメージにタグを付けプッシュします。

docker tag nginx:latest 123456789.dkr.ecr.ap-northeast-1.amazonaws.com/nginx:latest
docker push 123456789.dkr.ecr.ap-northeast-1.amazonaws.com/nginx:latest

(プッシュなどの操作はECSコンソール画面にも説明があるので省略します)

Dockerrun.aws.jsonの作成

以下のように記述します。

Dockerrun.aws.json
{
    "AWSEBDockerrunVersion": 2,
    "volumes": [
        {
            "name": "application",
            "host": {
                "sourcePath": "/var/app/current/laravel"
            }
        },
        {
            "name": "php-ini",
            "host": {
                "sourcePath": "/var/app/current/php-fpm/php71.ini"
            }
        },
        {
            "name": "nginx-sites",
            "host": {
                "sourcePath": "/var/app/current/nginx/sites"
            }
        }
    ],
    "containerDefinitions": [
        {
            "name": "php-fpm",
            "image": "123456789.dkr.ecr.ap-northeast-1.amazonaws.com/php-fpm:latest",
            "essential": true,
            "memory": 128,
            "mountPoints": [
                {
                    "sourceVolume": "application",
                    "containerPath": "/var/www"
                },
                {
                    "sourceVolume": "php-ini",
                    "containerPath": "/usr/local/etc/php/php.ini"
                }
            ]
        },
        {
            "name": "nginx",
            "image": "123456789.dkr.ecr.ap-northeast-1.amazonaws.com/nginx:latest",
            "essential": true,
            "memory": 128,
            "mountPoints": [
                {
                    "sourceVolume": "application",
                    "containerPath": "/var/www"
                },
                {
                    "sourceVolume": "nginx-sites",
                    "containerPath": "/etc/nginx/sites-available"
                }
            ],
            "links": [
                "php-fpm"
            ],
            "portMappings": [{
                "hostPort": 80,
                "containerPort": 80
            }]
        }
    ]
}

Volumesのファイルを作成

次にDockerrun.aws.jsonのvolumesで指定されているファイル等を作成していきます。

Laravelフォルダを作成

applicationボリューム(/var/app/current/laravel)を作成します。/var/app/current/というのはDockerrun.aws.jsonがあるディレクトリです。

その階層にlaravelフォルダ(composer.jsonなどがあるアプリ本体)を設置します。
フォルダ名はlaravelとなっていますが、任意なので変更しても構いません。

php-iniとnginx-sites を作成

Laradockのdocker-compose.ymlには、php-fpmのvolumeに以下が指定されています。
./php-fpm/php${PHP_VERSION}.ini:/usr/local/etc/php/php.ini

build時に環境変数のPHP_VERSIONが71である場合は、「./php-fpm/php71.ini」が必要です。
そのため「/var/app/current/php-fpm/php71.ini」というファイルを作成します。このファイルはLaradockからそのままコピーします。

nginxも同様で「/var/app/current/nginx/sites」フォルダを作成し、そこにdefault.confを設置します。
設定は以上です。

Elastic Beanstalkへアップロード

作成したDockerrun.aws.jsonやlaravelフォルダを1つのzipファイルにまとめ、Elastic Beanstalkへアップロードすれば完了です。
ただデプロイ毎に圧縮するのは面倒なので、CircleCIなどを利用して自動デプロイを行うことをおすすめします

注意点など

Queueや定期タスクが必要な場合

Elastic Beanstalkではcronをインストールできないため、Laradockのphp-workerなどは利用できません。
Queueや定期タスクが必要な場合は、laravel-aws-workerというパッケージを使用します。このパッケージをインストールしてWorker環境を別に作成することで、Queueや定期タスクを処理してくれます。

php-fpmのmemory_limitを変更する場合

php-fpmの.iniファイル(laravel.iniなど)でmemory_limitを128Mから256Mに変更する際は、Dockerrun.aws.jsonのphp-fpmにある「memory」も256へ変更しておきましょう。

Dockerrun.aws.jsonだけが128のままであると、メモリーエラー時に502エラーとなってしまいます。

19
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
22