Last active
January 22, 2017 02:43
-
-
Save inokappa/793e999d4a33519a05ccdb46fe87275e to your computer and use it in GitHub Desktop.
EBS が二つぶら下がった EC2 のスナップショットを取得するシェルスクリプトの例のアンサーソング(レストアするシェルスクリプトの例)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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