Docker上で動くLaravel(PHP)をAWS ECSにデプロイする

Docker上で動くLaravel(PHP)をAWS ECSにデプロイするということをやっていきます!

Laravelプログラムをローカル開発環境で開発完了後、

AWS code4兄弟のcodecommit/codepipeline/codebuild/codepipelineとECRを使用して、

ECSへのデプロイする方法を記載していきます。

ECSへのデプロイ

<デプロイ対象の環境構成>
apache
laravel(PHP)
docker
<使用するAWSサービス>
codepipeline
codecommit
codebuild
ECR
ECS
<やること>
codecommitへpushした後のECSへのデプロイを自動化する

スポンサーリンク

どんな環境?

以下で構成された環境をECSへデプロイします!

  • apache
  • laravel(PHP)
  • docker

どんなAWSサービスを使うの?

以下でAWSサービスを使用してECSへデプロイします!

  • codepipeline
  • codecommit
  • codebuild
  • ECR
  • ECS

デプロイフロー

ローカル開発環境で開発後、codecommitへpushした後のECSへのデプロイを自動化していきます!

デプロイフロー

①ローカル開発環境で開発
②codecommitへpush
③codepipelineが動き出し、codebuildを実行
④ビルドが終わったらdockerイメージをECRへ格納
⑤codepipelineに処理が戻りECSへのデプロイを実行

では、ローカル開発環境の作成から始めていきます

Laravelローカル開発環境の作成

以下のことをやっていきます!

ローカル開発環境構築

①Laravelプロジェクト作成
②dockerファイルの作成
③dockerコンテナ立ち上げ
④動作確認

 

Laravelプロジェクト作成

以下のコマンドでLaravelプロジェクトを作成します

composer create-project --prefer-dist laravel/laravel .

dockerファイルの作成

以下のDockerファイルを作成します。

vi Dockerfile
FROM php:7.3.2-apache-stretch

COPY --chown=www-data:www-data . /srv/app

COPY ./vhost.conf /etc/apache2/sites-available/000-default.conf

WORKDIR /srv/app

RUN docker-php-ext-install mbstring pdo pdo_mysql \
   && a2enmod rewrite negotiation \
   && docker-php-ext-install opcache

apacheのconfファイル作成

apacheのconfファイルを作成します。

vi vhost.conf
<VirtualHost *:80>
   
   DocumentRoot /srv/app/public
   
   <Directory "/srv/app/public">
       AllowOverride all
       Require all granted
   </Directory>

   ErrorLog ${APACHE_LOG_DIR}/error.log
   CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

docker立ち上げ

dockerコンテナを立ち上げます

docker build -t laravel-docker-aws .
docker run -it -p 80:80 laravel-docker

動作確認

ブラウザで「http://localhost/」にアクセスし、以下の画面が表示されればOKです。

Laravvel welcome

デプロイフローの作成

まず、codecommitの設定から始めていきます。

codecommit

リポジトリ作成

Codecommit

リポジトリ名:laravel-docker

後は設定を変えずに作成

ECR

リポジトリ名:laravel-dockerで作成する

codebuild

buildspec.ymlの作成

vi buildspec.yml
version: 0.2

phases:
 install: 
   runtime-versions:
     php: 7.3
 pre_build: # commands to be run before build
   commands:
   - echo Logging in to Amazon ECR....
   - aws --version
   # login to Elastic container registry
   - $(aws ecr get-login --no-include-email --region ${AWS_DEFAULT_REGION})
   - REPOSITORY_URI=<リポジトリURI>
 build:
   commands:
   - echo Build started on `date`
   - echo installing composer..
   - composer install
   - echo creating .env file..
   - cp .env.example .env
   - echo generating app key
   - php artisan key:generate
   - echo Building the Docker image...
   - docker build -t laravel-docker .
   - docker tag laravel-docker:latest $REPOSITORY_URI:latest
 post_build:
   commands:
     - echo Build completed on `date`
     - echo Pushing the Docker image...
     - docker image ls -a
     - docker push $REPOSITORY_URI:latest
     - echo Writing image definitions file...
     - printf '[{"name":"laravel-docker-container","imageUri":"%s"}]' $REPOSITORY_URI:latest > imagedefinitions.json
artifacts:
  files: imagedefinitions.json

codebuildビルドプロジェクトを作成

Codebuild

プロジェクト名:laravel-docker-build

Codebuild

ソースプロバイダ:CodeCommit

リポジトリ:laravel-docker

イメージ:「x86_64」を含むものを選ぶ

CodeCommit

特権付与:チェックを入れる

後は設定を変えずに作成

ロール設定

ロール「codebuild-laravel-docker-service-role」に「AmazonEC2ContainerRegistryPowerUser」ポリシーをアタッチする

ECS

ECSクラスターの作成

クラスターを作成ボタンをクリックし、EC2 Linux + Networkingを選択する。

ECS cluster

クラスター名:laravel-cluster

EC2インスタンスタイプ:t2.micro

後は設定を変えずに作成

ECSタスクの定義

ECS task define

タスク名:laravel-docker-task

「コンテナの追加」を押下し、以下の設定をする

ECS task define

 

コンテナ名:laravel-docker-container

イメージ:ECRのリポジトリURI

ECS task define

ホストポート:80

コンテナポート:80

後は設定を変えずにタスクを作成

 

次にタスクを実行する

ECS task

ECSサービス

ECS service

クラスタ:laravel-cluster

サービス名:laravel-docker-service

タスクの数:1

ECS service

ロードバランサの設定をする

後は設定を変えずに作成

codepipeline

まずはcodecommitへpush

git init
git add --all
git commit -m "initial"
git remote add origin <リポジトリURI>
git config --global credential.helper "!aws.cmd codecommit credential-helper $@"
git config --global credential.UseHttpPath true
aws configure
AWS Access Key ID [None]:              
AWS Secret Access Key [None]: 
Default region name [None]: 
Default output format [None]:
git push origin master

codepipeline作成

codepipeline

ソースプロバイダー:AWS CodeCommit

リポジトリ:laravel-docker

ブランチ名:master

codecommit

プロバイダ:AWS CodeBuild

プロジェクト名:laravel-docker-build

codebuild

プロバイダー:Amazon ECS

クラスタ名:laravel-cluster

サービス名:laravel-docker-service

後は設定を変えずに作成

Laravel動作確認

EC2インスタンスのIPをコピーして、ブラウザーに貼り付けアクセスしてみる

laravelのwelcome画面が表示されれば成功

Laravel welcome