[Shell Script] DBであるプロセスが走っている場合、デプロイ等の処理を中断させる

./process-check.sh

#!/bin/bash
set -Ceu

# Confirm Foo process
CONF_PROCESS=`mysql --defaults-extra-file=./.access-db.conf -h test.ap-northeast-1.rds.amazonaws.com -Be 'show processlist;' | grep foo | wc -l`
echo "fooのプロセス数は ${CONF_PROCESS} です。"

if [ ! ${CONF_PROCESS} -eq 0 ]; then
    echo 'fooのprocessが走っている為、デプロイを中断します。'
    exit 1
fi
    echo 'fooのプロセスが走っていない為、デプロイを行います。'

...{デプロイ処理}...

./.access-db.conf

[client]
user     = "{DB_USER_NAME}"
password = "{DB_USER_PASS}"

権限を変更する。

chmod 0600 ./.access-db.conf

実行する。

$ sh process-check.sh
fooのプロセス数は        0 です。
fooのプロセスが走っていない為、デプロイを行います。

[Shell Script] DBバックアップ、S3へアップロード

S3バックアップ用IAMユーザーの作成

Management Consoleより、IAMのポリシーを作成し、ユーザーをアタッチする。

S3バックアップ用ポリシー例

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1506579924000",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:ListBucket",
                "s3:ListBucketMultipartUploads",
                "s3:ListMultipartUploadParts",
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:PutObjectTagging",
                "s3:PutObjectVersionAcl",
                "s3:PutObjectVersionTagging",
                "s3:ReplicateDelete",
                "s3:ReplicateObject",
                "s3:RestoreObject"
            ],
            "Resource": [
                "arn:aws:s3:::{BUCKET_NAME}",
                "arn:aws:s3:::{BUCKET_NAME}/*"
            ]
        }
    ]
}
# AWS CLIからS3 APIへ接続
$ aws configure --profile s3-bk
AWS Access Key ID [None]:
AWS Secret Access Key [None]:
Default region name [None]: ap-northeast-1
Default output format [None]: text

# 確認
$ aws s3 ls s3://{BUCKET_NAME}/ --profile s3-bk

MySQL接続用ファイルの作成

mysql接続用のユーザー名/パスワードはスクリプト外のファイルで管理する。
./.access-db.conf

[client]
user     = "{DB_USER_NAME}"
password = "{DB_USER_PASS}"

権限を変更する。

chmod 0600 ./.access-db.conf

シェルスクリプト

変数は外部参照。
if文やエラー処理等は省略している。

#!/bin/bash
#
# Backup Database.
#
# Ex. sh database_backup.sh
#
###############################################

BK_PATH=/backups/databases
PROFILE=s3-bk
DB_NAME=test
DB_HOST=test.ap-northeast-1.rds.amazonaws.com
BUCKET_NAME_BACKUP="s3://{BUCKET_NAME}/"

if [ ! -e ${BK_PATH} ]; then
    mkdir -p ${BK_PATH}
fi

cd /root/scripts/backup_script

echo '~~~~~~~~~~~~ Start Backup ~~~~~~~~~~~~'

# MySQLdump DB server
mysqldump --defaults-extra-file=./.access-db.conf --databases ${DB_NAME} --default-character-set=utf8 --add-drop-database --host=${DB_HOST} > ${BK_PATH}/${DB_NAME}-dump.sql

# GZIP SQL files
# -C で絶対パスによるエラー出力を抑制
GZIP=-9 tar czf ${BK_PATH}/${DB_NAME}-dump-`date +%Y%m%d%H%M`.tar.gz -C / backups/databases/${DB_NAME}-dump.sql

echo '~~~~~~~~~~~~ Remove backup files more than 7 days ~~~~~~~~~~~~'
find ${BK_PATH}/ -name "*.tar.gz" -type f -mtime +7 | xargs rm -fv
rm -fv ${BK_PATH}/${DB_NAME}-dump.sql

# Sync S3
aws s3 sync ${BK_PATH}/ ${BUCKET_NAME_BACKUP} --acl private --profile=${PROFILE}

echo '~~~~~~~~~~~~ Finished Backup ~~~~~~~~~~~~'

exit 0
  • 外部ファイルから、DB(MySQL)接続ユーザーとパスワードは指定する。
  • 最高品質を保つ圧縮の”GZIP=-9″で”tar.gz”を作成。
  • 本日より7日前以上のファイルは削除。

Cronへ仕込み

$ crontab > /root/crontab
$ vim /root/crontab
$ crontab < /root/crontab
$ crontab -l
05 2 * * * /bin/sh /root/scripts/backup_script/contents_backup.sh 1> /dev/null 2> /dev/null
10 2 * * * /bin/sh /root/scripts/backup_script/database_backup.sh 1> /dev/null 2> /dev/null

参考サイト

関連記事

[Linux] “-f”オプションを付与してコマンドを実行しても、対話形式となってしまう場合がある

$ cp -f foo.conf bar.conf

サーバーによっては、例えばコマンド”cp”にエイリアス “alias cp=’cp -i'” (確認オプション)がデフォルト指定されている場合がある。
“-f”を利用する場合、コマンドの先頭に “\” もしくは “¥” を付けて実行させる。そうすることにより、エイリアスが無効になる。

$ ¥cp -f foo.conf bar.conf

AWS Elastic Beanstalkの拡張機能 “ebextensions” で “commands” (若しくはcontainer_commands)を利用する場合は、”¥” もしくは “\” を付与してはならない。Deploy自体が失敗してしまう為である。Amazon Linuxの場合は、エイリアスを無効にせずとも、”-f” オプションは有効となる。

[AWS][Beanstalk][Shell Script] デプロイスクリプト

AWS Elastic Beanstalk へのデプロイ

殴り書きです。

  • Gitからリポジトリを取得
  • 環境毎に設定を上書き
  • コンパイル
  • EB CLIでデプロイ

シェルスクリプト

sedで環境設定ファイルを書き換えている部分は引数渡しへ変更下さい。

#!/bin/bash
## Example of Beanstalk deploy
##
set -Ceu
PATH=/root/.local/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin:/root/bin

# Path
doc_path=/var/www/vhosts/
deploy_path=/var/www/vhosts/xxx
branch=develop

# Beanstalk Environment
prod_env=prod-xxx
stg_env=stg-xxx
dev_env=dev-xxx

# Beanstalk application
prod_app=xxx
stg_app=xxx
dev_app=xxx

# Beanstalk Keyname
prod_key=xxx
stg_key=xxx
dev_key=xxx

# AWS profile
prod_profile=prod
stg_profile=stg
dev_profile=dev

# Domain
prod_domain=xxx.com
stg_domain=xxx.com
dev_domain=xxx.com

# Internal ELB
prod_elb=internal-prod-xxx.com
sgc_elb=internal-stg-xxx.com
dev_elb=internal-dev-xxx.com

# Confirm Git CLI
if ! type 'git' > /dev/null 2>&1; then
  echo 'Git CLI not found.'
  exit 1
fi

cd ${doc_path}

# Confirm Deploy PATH
if [ -e "${deploy_path}" ]; then
  echo 'Remove existing Working copy.'
  rm -rf {woking copy}
fi

git clone https://github.com/xxx.git
cd ${deploy_path}

git checkout ${branch}

cd ${deploy_path}

git status

echo '~~~~~~~~~~~~ Overwrite conf file ~~~~~~~~~~~~'

# 00_application.conf
sed -i -e "s@${prod_elb}@${dev_elb}@g" ./src/main/ebextensions/httpd/conf.d/elasticbeanstalk/00_application.conf

# config.yml
sed -i -e "s@${prod_env}@${dev_env}@g" ./.elasticbeanstalk/config.yml
sed -i -e "s@${stg_env}@${dev_env}@g" ./.elasticbeanstalk/config.yml
sed -i -e "s@application_name: ${prod_app}@application_name: ${dev_app}@g" ./.elasticbeanstalk/config.yml
sed -i -e "s@default_ec2_keyname: ${prod_key}@default_ec2_keyname: ${dev_key}@g" ./.elasticbeanstalk/config.yml
sed -i -e "s@profile: ${prod_profile}@profile: ${dev_profile}@g" ./.elasticbeanstalk/config.yml

# httpd.conf ServerName
sed -i -e "s@${prod_domain}@${dev_domain}@g" ./src/main/ebextensions/httpd/conf/httpd.conf

# 00-basic-setting.config HOSTNAME
sed -i -e "s@${prod_domain}@${dev_domain}@g" ./src/main/ebextensions/00-basic-setting.config

if grep "${prod_elb}" "./src/main/ebextensions/httpd/conf.d/elasticbeanstalk/00_application.conf" >/dev/null; then
  echo 'failed to overwrite in 00_application.conf.'
  exit 1
elif grep "${prod_profile}" "./.elasticbeanstalk/config.yml" >/dev/null; then
  echo 'failed to overwrite in config.yml.'
  exit 1
elif grep "${prod_domain}" "./src/main/ebextensions/httpd/conf/httpd.conf" >/dev/null; then
  echo 'failed to overwrite in httpd.conf.'
  exit 1
else
  echo 'overwrite ok'
fi

echo '~~~~~~~~~~~~ Compile ~~~~~~~~~~~~'
mvn clean package

# Confirm EB CLI
if ! type 'eb' > /dev/null 2>&1; then
  echo 'EB CLI not found...'
  exit 1
fi

echo '~~~~~~~~~~~~ eb status ~~~~~~~~~~~~'
eb status ${dev_env}

echo '~~~~~~~~~~~~ Start deploy ~~~~~~~~~~~~'
eb deploy ${dev_env} --process --timeout 10

sleep 60s

echo '~~~~~~~~~~~~ eb logs ~~~~~~~~~~~~'
eb logs ${dev_env}

echo '~~~~~~~~~~~~ Deployment success ! ~~~~~~~~~~~~'

exit 0

関連記事

chkconfig

“Chkconfig”を利用し、サービス起動/停止の挙動を設定できる。

Run Levelの確認

$ /sbin/chkconfig --list {service_name}
{service_name}        	0:off	1:off	2:on	3:on	4:on	5:on	6:off
  • 0: システムの停止
  • 1: シングルユーザモード
  • 2: マルチユーザモード
  • 3: マルチユーザモード(コンソールログイン)
  • 4: 未使用
  • 5: マルチユーザモード(ディスプレイマネージャ使用)
  • 6: システム再起動

起動設定を全て有効にする

$ chkconfig {service_name} on
$ /sbin/chkconfig --list {service_name}

サービス設定の追加

/sbin/chkconfig --add {service_name}

サービス設定の削除

/sbin/chkconfig --del {service_name}

変更の反映

/sbin/service {service_name} start [stop, restart]