S3からソースを取得して展開するbashスクリプト

#目的
タイトルの通り。AutoScalingGroupのEC2へのWEBアプリケーションの展開にCodedeployを使おうとしたが上手くいかなかったため、スクリプトを作成することにした。展開前のファイル形式はzip,tar,tar.gz,tgzに対応。
ちなみに当方ネットワーク屋のため、スクリプト作成スキルは皆無。とりあえずif文を並べまくった。


```bash: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."

```