Docker上で動くLaravel(PHP)をAWS ECSにデプロイするということをやっていきます!
Laravelプログラムをローカル開発環境で開発完了後、
AWS code4兄弟のcodecommit/codepipeline/codebuild/codepipelineとECRを使用して、
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です。
デプロイフローの作成
まず、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ビルドプロジェクトを作成
プロジェクト名:laravel-docker-build
ソースプロバイダ:CodeCommit
リポジトリ:laravel-docker
イメージ:「x86_64」を含むものを選ぶ
特権付与:チェックを入れる
後は設定を変えずに作成
ロール設定
ロール「codebuild-laravel-docker-service-role」に「AmazonEC2ContainerRegistryPowerUser」ポリシーをアタッチする
ECS
ECSクラスターの作成
クラスターを作成ボタンをクリックし、EC2 Linux + Networkingを選択する。
クラスター名:laravel-cluster
EC2インスタンスタイプ:t2.micro
後は設定を変えずに作成
ECSタスクの定義
タスク名:laravel-docker-task
「コンテナの追加」を押下し、以下の設定をする
コンテナ名:laravel-docker-container
イメージ:ECRのリポジトリURI
ホストポート:80
コンテナポート:80
後は設定を変えずにタスクを作成
次にタスクを実行する
ECSサービス
クラスタ:laravel-cluster
サービス名:laravel-docker-service
タスクの数:1
ロードバランサの設定をする
後は設定を変えずに作成
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作成
ソースプロバイダー:AWS CodeCommit
リポジトリ:laravel-docker
ブランチ名:master
プロバイダ:AWS CodeBuild
プロジェクト名:laravel-docker-build
プロバイダー:Amazon ECS
クラスタ名:laravel-cluster
サービス名:laravel-docker-service
後は設定を変えずに作成
Laravel動作確認
EC2インスタンスのIPをコピーして、ブラウザーに貼り付けアクセスしてみる
laravelのwelcome画面が表示されれば成功