kazu22002の技術覚書

PHPer, Golang, AWS エンジニアの日々

AWS CodeDeployを使う ( PHP + Laravel )

AWS Codedeployを使用してLaravelのアプリをリリースします。

appspec.yml

docs.aws.amazon.com

codebuildでdeploy管理のためのファイルです。

Laravelで必要なこと

  • composer install
  • php artisan migrate

パッケージの更新、データベースのカラム更新もdeploy時に必要なためどこかに書きたいです。

Laravelの設定例

version: 0.0
os: linux
files:
  - source: /
    destination: /var/www/app

hooks:
  BeforeInstall:
    - location: scripts/stopApp.sh
      runas: root
  AfterInstall:
    - location: scripts/preparation.sh
      runas: root
  ApplicationStart:
    - location: scripts/startApp.sh
      runas: root

permissions:
  - object: /var/www/app/scripts
    pattern: "**"
    owner: ec2-user
    group: nginx
    mode: 774
    type:
      - file
#!/bin/bash
find /var/www/app -type f -exec chmod 664 {} \;
find /var/www/app -type d -exec chmod 774 {} \;
chown -R ec2-user:nginx /var/www/app

chmod -R 775 /var/www/app/storage
chmod -R 775 /var/www/app/bootstrap/cache

# db migrate
cd /var/www/app
php artisan migrate

# composer
# cd /var/www/app
# composer install

stopApp.sh, startApp.shにはなにも書いてないです。

migrationも書いてしまっていますが、DBとアプリが同じサーバーにあり、まだ複数台での冗長構成にしていないためこの書き方で機能しています。

サーバーが複数台の構成になった場合はmigrationは別の方法にしたほうがいいです。

困ったこと

ファイルのpermissionを手動で変更してもcodedeployを行うとパーミッションが変更されるためstorageの設定をpreparation.shに記述しました。

appspec.ymlにてパーミッションを変更しようとすると、制限が多く同じフォルダや指定したフォルダ配下の変更ができないです。

コマンドをrootで実行するを使うしかなかったですね。

composer installエラー

ec2のインスタンスをmicroで行っているため、composer installを実行するとメモリ不足でエラーが発生します。

解消するためにインスタンスをあげて解決する必要があります。

最初のinstallは大量にメモリを消費しますが、それ以降は追加パッケージがすくなければメモリエラーも発生せずinstallできました。

まとめ

CI/CDがかなり浸透した世の中でサンプルも多いと思っていましたが、codedeployってあまりないですね。実際にはフレームワークを使う場合が多くもっとサンプルがあると思ってました。

次はcodebuildを使用して、codepipelineもあわせた記事を書きます。