Skip to content

Instantly share code, notes, and snippets.

@inokappa
Last active January 22, 2017 02:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save inokappa/793e999d4a33519a05ccdb46fe87275e to your computer and use it in GitHub Desktop.
Save inokappa/793e999d4a33519a05ccdb46fe87275e to your computer and use it in GitHub Desktop.
EBS が二つぶら下がった EC2 のスナップショットを取得するシェルスクリプトの例のアンサーソング(レストアするシェルスクリプトの例)
#!/usr/bin/env bash
_INSTANCE_ID="${YOUR_INSTANCE_ID}"
_CHECK_INTERVAL=60
echo "処理を続行しますか? [Y/n]"
read ANSWER
case ${ANSWER} in
[yY]) echo "処理を続行します..."
;;
[nN]) echo "$(date '+%Y-%m-%d %H:%M:%S') 処理を終了します..."
exit 0 ;;
*) echo "$(date '+%Y-%m-%d %H:%M:%S') 処理を終了します..."
exit 0 ;;
esac
# tmp/snapshot_ids のチェック
if [ ! -f tmp/snapshot_ids ];then
echo "tmp/snapshot_ids が存在しません.マネジメントコンソールにて処理を継続して下さい."
exit 1
fi
# 過去の *_restore ボリュームのチェック、存在していたら削除
echo "過去の *_restore ボリュームのチェック、存在していたら削除します..."
for volume_id in $(aws ec2 describe-volumes --filters Name=tag-key,Values=Name Name=tag-value,Values=*_restore --query 'Volumes[].VolumeId' --output text);
do
aws ec2 delete-volume --volume-id ${volume_id} > /dev/null
done
echo "過去の *_restore ボリュームのチェックが完了しました. 引続き処理を続行します."
# ボリュームの作成
echo "スナップショットからボリュームを作成します..."
while read snapshot_id
do
_DEVICE=$(aws ec2 describe-tags --filters "Name=resource-id,Values=${snapshot_id}" "Name=key,Values=device" --query Tags[].Value --output text)
_VOLUME_ID=$(aws ec2 create-volume --availability-zone ap-northeast-1a --snapshot-id ${snapshot_id} --volume-type gp2 --query VolumeId --output text)
if [ "${_DEVICE}" == "/dev/sda1" ];then
aws ec2 create-tags --resources ${_VOLUME_ID} --tags Key=device,Value=${_DEVICE} Key=Name,Value="OS_restore"
[ $? == 0 ] && _RESULT_1=0 || _RESULT_1=1
else
aws ec2 create-tags --resources ${_VOLUME_ID} --tags Key=device,Value=${_DEVICE} Key=Name,Value="DATA_restore"
[ $? == 0 ] && _RESULT_2=0 || _RESULT_2=1
fi
done < tmp/snapshot_ids
_RESULT=${_RESULT_1}${_RESULT_2}
if [ "${_RESULT}" == "00" ];then
echo "ボリュームを作成しました. 引続き処理を続行します."
else
echo "ボリュームの作成に失敗しました."
fi
# インスタンスの停止
echo "インスタンスを停止します..."
aws ec2 stop-instances --instance-ids ${_INSTANCE_ID}
echo "インスタンスの停止まで待機します..."
aws ec2 wait instance-stopped --instance-ids ${_INSTANCE_ID}
if [ $? == 0 ];then
echo "インスタンスの停止が完了しました. 引続き処理を続行します."
else
echo "インスタンスの停止に失敗しました."
exit 1
fi
# インスタンスからボリュームをデタッチ
echo "インスタンスからボリュームをデタッチします..."
for ebs in $(aws ec2 describe-instances --filters Name=instance-id,Values=${_INSTANCE_ID} --query 'Reservations[].Instances[].BlockDeviceMappings[].Ebs.VolumeId' --output text);
do
aws ec2 detach-volume --volume-id ${ebs}
done
echo "インスタンスからボリュームをデタッチしました. 引続き処理を続行します."
# インスタンスに付与するボリュームの情報を取得
echo "インスタンスに付与するボリュームの情報を取得します..."
if [ -f tmp/volume_info ];then
rm tmp/volume_info
fi
for _NAME in OS_restore DATA_restore
do
aws ec2 describe-volumes \
--filters Name=tag-key,Values="Name" Name=tag-value,Values="${_NAME}" \
| jq -r '[.Volumes[]|.VolumeId,(.Tags[] | select(.Key=="device").Value)]|@csv' >> tmp/volume_info
done
echo "インスタンスに付与するボリュームの情報を取得しました. 引続き処理を続行します."
echo "インスタンスにボリュームをアタッチします..."
_VOLUME_IDS=()
OLDIFS=${IFS}
while read volume_info
do
IFS=','
set -- $volume_info
_VOLUME_ID=$(echo $1 | tr -d '"')
_DEVICE=$(echo $2 | tr -d '"')
echo ${_VOLUME_ID}
_VOLUME_IDS=("${_VOLUME_IDS[@]}" ${_VOLUME_ID})
aws ec2 attach-volume --volume-id ${_VOLUME_ID} --instance-id ${_INSTANCE_ID} --device ${_DEVICE}
done < tmp/volume_info
IFS=${OLDIFS}
# インスタンスにボリュームがアタッチされるまで待機する
aws ec2 wait volume-in-use --volume-ids "${_VOLUME_IDS[@]}"
if [ $? == 0 ];then
echo "ボリュームのアタッチが完了しました. 引続き処理を続行します."
else
echo "ボリュームのアタッチに失敗しました. 処理を中断します."
exit 1
fi
# インスタンスにボリュームがアタッチされるまで待機する
# while :
# do
# _STATUS=$(aws ec2 describe-instances --instance-ids ${_INSTANCE_ID} --query Reservations[].Instances[].BlockDeviceMappings[].Ebs.Status --output text)
# # attached(tab space)attached
# if [ "${_STATUS}" == "attached attached" ]; then
# echo "ボリュームのアタッチが完了しました. 引続き処理を続行します."
# break
# fi
# echo "ボリュームのアタッチ中です."
# sleep ${_CHECK_INTERVAL}
# done
# インスタンスを起動する
echo "インスタンスを起動します..."
aws ec2 start-instances --instance-ids ${_INSTANCE_ID}
echo "インスタンスの起動まで待機します..."
aws ec2 wait instance-status-ok --instance-ids ${_INSTANCE_ID}
if [ $? == 0 ];then
echo "インスタンスの起動が完了しました."
else
echo "インスタンスの起動に失敗しました."
exit 1
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment