やったこと
- Amazon S3を使って、オンプレのPHPアプリケーション(CakePHP3)の更新作業をリモートから行えるようにしました
メリット
- 訪問の回数が減る
- プログラムの修正反映が楽に行えるので開発効率も上がるはず。
デメリット
- S3にリクエストするため、この仕組みを維持するための料金がかかります。
※1分毎のリクエストで月2円とかでした。
前提条件
- Fusicはリモートから該当のサーバに接続不可
- S3が使えるAWSアカウントがある
- オンプレサーバがインターネットに接続可能である
- オンプレサーバにAWS CLIをインストール可能
- オンプレサーバにAWS IAM情報を配置可能
処理フロー
やっていることは愚直かつシンプルです。
※以下をcronにて1分毎に実行しています。(1分毎である必要はありません。
- 自動アップデートを行うかどうかチェック(ローカルに特定のファイルが存在したら自動アップデートする
- 行わない場合は終了
- 行う場合は、AWS CLIを使ってS3に該当のzipファイルが有るかチェックしにいく
- zipファイルがなかったら処理終了
- zipファイルがあったらローカルにダウンロードする
- ローカルにダウンロード後、S3上の該当ファイルは削除する(ストレージ料金削減+処理実行の検知のため
- zipファイルを解凍し、必要なフォルダ・ファイルを置き換える
コード
#!/bin/bash
###################
# リリース自動化用スクリプト
#
# cronから起動される。
# S3からapp-master.zipがあれば取ってきて/var/www/html配下に設置する
###################
APP_NAME='app'
BUCKET_NAME='bucket-name'
ZIP_NAME=$APP_NAME'-master'
ZIP=$ZIP_NAME'.zip'
KEY='folder-in-bucket/'$ZIP
# S3へのリクエストが料金が発生するため、ローカルのファイルが有るかどうかで制御できるようにする
if [ ! `sudo ls /hoge | grep update_on` ]; then
exit
fi
# S3から取得
aws s3api get-object --bucket $BUCKET_NAME --key $KEY /tmp/$ZIP
# zipがなければ何もし#ない
if [ ! -f /tmp/$ZIP ]; then
exit
fi
# S3から削除しておく
aws s3api delete-object --bucket $BUCKET_NAME --key $KEY
DOCROOT='/var/www/html/'$APP_NAME
# 解凍 & 削除
unzip -q -d /tmp /tmp/$ZIP && rm -r /tmp/$ZIP
# 既存のフォルダを置き換え
for i in config src webroot
do
rm -rf $DOCROOT/$i && cp -r /tmp/$ZIP_NAME/$i $DOCROOT/
done
# キャッシュの削除
rm -f $DOCROOT/tmp/cache/models/*
rm -f $DOCROOT/tmp/cache/persistent/*
# マイグレーションの実行
cd $DOCROOT/
/bin/php70 $DOCROOT/bin/cake.php migrations migrate
# npm install
cd $DOCROOT/webroot
/usr/bin/npm install
# 展開後のディレクトリを削除
rm -r /tmp/$ZIP_NAME