PHP | さゆフィクション http://it.kensan.net/it aws wordpress などなどゆるーく書いてます Sat, 22 Apr 2023 01:53:43 +0000 ja hourly 1 https://wordpress.org/?v=6.5.2 https://it.kensan.net/wp-content/uploads/2023/03/cropped-icon-32x32.png PHP | さゆフィクション http://it.kensan.net/it 32 32 Docker上で動くLaravel(PHP)をAWS ECSにデプロイする https://it.kensan.net/docker%e4%b8%8a%e3%81%a7%e5%8b%95%e3%81%8flaravelphp%e3%82%92aws-ecs%e3%81%ab%e3%83%87%e3%83%97%e3%83%ad%e3%82%a4%e3%81%99%e3%82%8b.html Sat, 12 Sep 2020 05:54:19 +0000 https://itblog.verdy-it.xyz/?p=220

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

]]>
try-catch-finallyの挙動を調べてみる(JavaScript、PHP) https://it.kensan.net/try-catch-finally%e3%81%ae%e6%8c%99%e5%8b%95%e3%82%92%e8%aa%bf%e3%81%b9%e3%81%a6%e3%81%bf%e3%82%8bjavascript%e3%80%81php.html Sat, 28 Mar 2020 05:18:11 +0000 https://verdy-it.xyz/itblog/?p=118 try-catch-finallyの挙動を調べてみる

try-catch-finallyのcatchの中でreturnや例外発生をさせた場合の挙動を調べてみます。

対象言語はJavaScript、PHPです。

結論としては、JavaScriptとPHPで挙動は同じです。

結論
  • catch内のreturn文は動作しない
  • catch内で例外発生した場合
    • finallyが実行される
    • 例外も発生される

上記の動作となりました。

JavaScript

JavaScriptでcatchの中でreturnした場合

↓調査した際のプログラム↓

function test() {
  try {
    throw 'error'
  }catch(e){
    console.log('catch');
    return 'catch return';
  }finally{
    console.log('finally');
    return 'finally return';
  }
}
console.log(test());

↓出力結果↓

catch
finally
finally return

catchのあとにfinallyが実行されていることが分かる

→catch内のreturn文は動作していない。

JavaScriptでcatchの中で例外発生した場合

↓調査した際のプログラム↓

unction test() {
  try {
    try {
      throw 'error'
    }catch(e){
      console.log('catch');
      throw 'catch error'
    }finally{
      console.log('finally');
    }
  }catch(e){
    return 'catch error2'
  }
}
console.log(test());

↓出力結果↓

catch
finally
catch error2

catchのあとにfinallyが実行されていることが分かる。同時にcatchに投げ、例外も発生している。

PHP

PHPでcatchの中でreturnした場合

↓調査した際のプログラム↓

<?php
try {
    throw new Exception('error');
} catch(Exception $error) {
    print "catch\n";
    return;
} finally {
    print "finally\n";
    return;
}

↓出力結果↓

catch
finally

catchのあとにfinallyが実行されていることが分かる

→JavaScript同様、catch内のreturn文は動作していない。

PHPでcatchの中で例外発生した場合

↓調査した際のプログラム↓

<?php
try {
    try {
        throw new Exception('error');
    } catch(Exception $error) {
        print "catch\n";
        throw $error;
    } finally {
        print "finally\n";
    }
} catch(Exception $error) {
    print "catch2\n";
}

↓出力結果↓

catch
finally
catch2

JavaScriptと同様にcatchのあとにfinallyが実行されていることが分かる。同時にcatchに投げ、例外も発生している。

]]>