目的
タイトルの通り。AutoScalingGroupのEC2へのWEBアプリケーションの展開にCodedeployを使おうとしたが上手くいかなかったため、スクリプトを作成することにした。展開前のファイル形式はzip,tar,tar.gz,tgzに対応。
ちなみに当方ネットワーク屋のため、スクリプト作成スキルは皆無。とりあえずif文を並べまくった。
app-deploy.sh
# !/bin/bash
# 環境に応じて入力する
TEMPDIR="一時ディレクトリ"
DOCUMENTROOT="ドキュメントルート"
S3BUCKET="S3バケット"
SOURCE_FILE_NAME="ソースファイル名"
# 一時ディレクトリの存在確認
echo "Temporary Directory: ${TEMPDIR}"
if [ ! -d ${TEMPDIR} ]; then
echo "ERROR: Temporary directory is not exist."
exit 1
fi
# ドキュメントルートの存在確認
echo "DocumentRoot: ${DOCUMENTROOT}"
if [ ! -d ${DOCUMENTROOT} ]; then
echo "ERROR: Document root is not exist."
exit 1
fi
# S3バケットにアップロードされているソースが一つであることの確認
echo "S3 Bucket: ${S3BUCKET}"
if [ `aws s3 ls s3://${S3BUCKET}/ | wc -l` != 1 ]; then
echo "ERROR: Only one source must be uploaded to S3 bucket."
exit 1
fi
# ソースの拡張子がスクリプトに対応していることの確認と拡張子に応じた解凍コマンドの選択
SOURCE_FILE_FORMAT=${SOURCE_FILE_NAME#*.}
echo "Extension: ${SOURCE_FILE_FORMAT}"
if [ ${SOURCE_FILE_FORMAT} != "zip" -a ${SOURCE_FILE_FORMAT} != "tar" -a ${SOURCE_FILE_FORMAT} != "tar.gz" -a ${SOURCE_FILE_FORMAT} != "tgz" ]; then
echo "ERROR: source file format is Incorrect."
exit 1
elif [ ${SOURCE_FILE_FORMAT} = "zip" ]; then
COMMAND="unzip"
OPTION1="-o"
OPTION2="-d"
elif [ ${SOURCE_FILE_FORMAT} = "tar" ]; then
COMMAND="tar"
OPTION1="-xvf"
OPTION2="-C"
elif [ ${SOURCE_FILE_FORMAT} = "tar.gz" -o ${SOURCE_FILE_FORMAT} = "tgz" ]; then
COMMAND="tar"
OPTION1="-zxvf"
OPTION2="-C"
else
echo "ERROR: Unknown error."
exit 1
fi
# ソースファイル名の確認
echo "Source File Name: ${SOURCE_FILE_NAME}"
if [ `aws s3 ls s3://${S3BUCKET}/| awk '{print $4}'` != ${SOURCE_FILE_NAME} ]; then
echo "ERROR: Source file name is incorrect."
exit 1
fi
# S3からソースの取得
aws s3 cp s3://${S3BUCKET}/${SOURCE_FILE_NAME} ${TEMPDIR}/ > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "ERROR: Failed to download source file."
exit 1
fi
# ソース展開確認用の仮ディレクトリ作成
DATE=`date +%Y%m%d_%H-%M-%S`
mkdir ${TEMPDIR}/codedeploy_${DATE}
# ソースを仮ディレクトリに展開
${COMMAND} ${OPTION1} \
${TEMPDIR}/${SOURCE_FILE_NAME} \
${OPTION2} ${TEMPDIR}/codedeploy_${DATE} > /dev/null 2>&1
# ソースが仮ディレクトリに展開されていることの確認
ls ${TEMPDIR}/codedeploy_${DATE}/*
if [ $? -ne 0 ]; then
rm -rf ${TEMPDIR}/codedeploy_${DATE}
rm -f ${TEMPDIR}/${SOURCE_FILE_NAME}
echo "ERROR: Failed to extract source file from ${TEMPDIR}."
exit 1
fi
rm -rf ${TEMPDIR}/codedeploy_${DATE}/*
# ドキュメントルートのバックアップ
if [[ -f ${DOCUMENTROOT} ]];then
cp -p ${DOCUMENTROOT}/* ${TEMPDIR}/codedeploy_${DATE}
fi
# ソースをドキュメントルートに展開
rm -rf ${DOCUMENTROOT}/*
${COMMAND} ${OPTION1} \
${TEMPDIR}/${SOURCE_FILE_NAME} \
${OPTION2} ${DOCUMENTROOT} > /dev/null 2>&1
# ソースがドキュメントルートに展開されていることの確認
ls ${DOCUMENTROOT}/*
if [ $? -ne 0 ]; then
cp -p ${TEMPDIR}/codedeploy_${DATE}/* ${DOCUMENTROOT}/
rm -rf ${TEMPDIR}/codedeploy_${DATE}
rm -f ${TEMPDIR}/${SOURCE_FILE_NAME}
echo "ERROR: Failed to extract source file from ${TEMPDIR} to ${DOCUMENTROOT}."
exit 1
fi
# 仮ディレクトリと一時ディレクトリのソースを削除
rm -rf ${TEMPDIR}/codedeploy_${DATE}
rm -f ${TEMPDIR}/${SOURCE_FILE_NAME}
# 正常終了メッセージ
echo "OK: Source deployment completed successfully."