LoginSignup
1
1

More than 5 years have passed since last update.

オンプレのアプリケーションにリモート更新を導入した話

Last updated at Posted at 2018-02-20

やったこと

  • 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
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1