宜しくお願いします。
現在、AWSのEC2でwindows server 2016を作成しております。
複数台作成はできるのですが、そのscriptについて教えていただきたいです。
aws cliでは、コマンドを作れるのですが、スクリプトで書けず、止まっています。
~やりたい内容~
1.
インスタンス作成(original)
(大本となるインスタンスを完成させる)
2.
2-1
大本のインスタンスを作った、ボリュームからスナップショットを作成する。
2-2
そのスナップショットから複製に使うボリュームを作成する。
(必要分だけ、ボリュームを作成する)
3.
3-1.
新しくインスタンスを作成する(これは、複製するインスタンスになる)
(必要分だけ、インスタンスを作成する)
(*これに関しては、事前に手動での作成も考えている)
3-2.
全てボリュームをデタッチする。
4.
2.で作ったボリュームを新しい3.で作ったインスタンスにアタッチする。
5.
4.でアタッチした後、インスタンスを起動する。
6.
新インスタンスに接続する。
AWS cli のコマンドはありますが、.shのファイルにそのまま記載しても、当たり前ではありますが、実行はされず、
困っています。
纏めて、1つのファイル実行で、複数(~10数台)を起動させたい。
cronなどは使わず。
#!/usr/bin/env bash _INSTANCE_ID="${i-xxxxxxxxxxx}" _ROOT_DEVICE="/dev/sda1" _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 if [ -f tmp/snapshot_ids ];then rm tmp/snapshot_ids fi for ebs in $(aws ec2 describe-instances --filters Name=instance-id,Values=${_INSTANCE_ID} --query 'Reservations[].Instances[].BlockDeviceMappings[].Ebs.VolumeId' --output text); do _SNAPSHOT_ID=$(aws ec2 create-snapshot --volume-id ${ebs} | jq -r .SnapshotId) echo ${_SNAPSHOT_ID} >> tmp/snapshot_ids _DEVICE=$(aws ec2 describe-volumes --volume-ids ${ebs} --query Volumes[].Attachments[].Device --output text) if [ "${_DEVICE}" == "${_ROOT_DEVICE}" ];then aws ec2 create-tags --resources ${_SNAPSHOT_ID} --tags Key=device,Value=${_DEVICE} Key=Name,Value="OS" else aws ec2 create-tags --resources ${_SNAPSHOT_ID} --tags Key=device,Value=${_DEVICE} Key=Name,Value="DATA" fi done if [ `-f tmp/snapshot_ids -a $(wc -l tmp/snapshot_ids | awk '{print $1}') == 2` ];then
↑ここの行で
wc: tmp/snapshot_ids: そのようなファイルやディレクトリはありません
./snapshot.sh: 行 34: -f: コマンドが見つかりません
スナップショットの作成に失敗しました.処理を中断します.
このように表示されてしまいます。(2-1.解決済)
どうかご教示頂きたいです。
宜しくお願いします。
以下、参考にしているURLになります。
リンク内容
*1
<new ver> ``` #!/usr/bin/env bash _INSTANCE_ID="i-xxxxxxxxxxxx" _ROOT_DEVICE="/dev/sda1" _CHECK_INTERVAL="60" _OS1="OS1" _OS1_restore="OS1_restore"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
if [ -f tmp/snapshot_ids ];then
rm tmp/snapshot_ids
fi
for ebs in $(aws ec2 describe-instances --filters Name=instance-id,Values=${_INSTANCE_ID} --query 'Reservations[].Instances[].BlockDeviceMappings[].Ebs.VolumeId' --output text);
do
_SNAPSHOT_ID=$(aws ec2 create-snapshot --volume-id ${ebs} | jq -r .SnapshotId)
echo ${_SNAPSHOT_ID} >> tmp/snapshot_ids
_DEVICE=$(aws ec2 describe-volumes --volume-ids ${ebs} --query Volumes[].Attachments[].Device --output text)
if [ "${_DEVICE}" = "${_ROOT_DEVICE}" ];then
aws ec2 create-tags --resources ${_SNAPSHOT_ID} --tags Key=device,Value=${_DEVICE} Key=Name,Value=${_OS1}
else
aws ec2 create-tags --resources ${_SNAPSHOT_ID} --tags Key=device,Value=${_DEVICE} Key=Name,Value="DATA"
fi
done
#if [ -f tmp/snapshot_ids -a $(cat tmp/snapshot_ids | wc -l) = "2" ];then
echo ${_SLACK_CHANNEL} "スナップショットの作成を開始しました..."
#else
echo ${_SLACK_CHANNEL} "スナップショットの作成に失敗しました.処理を中断します."
exit 1
#fi
aws ec2 wait snapshot-completed --snapshot-ids $(cat tmp/snapshot_ids)
if [ $? == 0 ]; then
echo "スナップショットの作成が完了しました."
fi
tmp/snapshot_ids のチェック
if [ ! -f tmp/snapshot_ids ];then
echo "tmp/snapshot_ids が存在しません.マネジメントコンソールにて処理を継続して下さい."
exit 1
fi
ボリュームの作成
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=${_OS1_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
### *2 ```aws ec2 wait snapshot-completed --snapshot-ids $(cat tmp/snapshot_ids) if [ $? -eq 0 ]; then echo "スナップショットの作成が完了しました." fi # tmp/snapshot_ids のチェック if [ ! -f tmp/snapshot_ids ];then echo "tmp/snapshot_ids が存在しません.マネジメントコンソールにて処理を継続して下さい." exit 1 fi # ボリュームの作成 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=${_OS1_restore} [ $? -eq 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" [ $? -eq 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
*3
_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=${_OS1_restore} [ $? -eq 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" [ $? -eq 0 ] && _RESULT_2=0 || _RESULT_2=1 fi done < tmp/snapshot_ids #_RESULT=${_RESULT_1}${_RESULT_2} #if [ "${_RESULT}" = "00" ];then if [ _RESULT_1=0,_RESULT_2=0 ];then #~set により解読~ ++ aws ec2 describe-tags --filters Name=resource-id,Values=snap-xxx Name=key,Values=device --query 'Tags[].Value' --output text + _DEVICE=/dev/sda1 ++ aws ec2 create-volume --availability-zone ap-northeast-1a --snapshot-id snap-xxx --volume-type gp2 --query VolumeId --output text + _VOLUME_ID=vol-xxx + '[' /dev/sda1 = /dev/sda1 ']' + aws ec2 create-tags --resources vol-xxx --tags Key=device,Value=/dev/sda1 Key=Name,Value=OS1_restore + '[' 0 -eq 0 ']' + _RESULT_1=0 + read snapshot_id + '[' _RESULT_1=0,_RESULT_2=0 ']'
*4
#条件変更(インスタンス停止したいIDを_INSTANCE1_IDとしました) #!/usr/bin/env bash #original######################### _INSTANCE_ID="i-xxx" #create instance################## _INSTANCE1_ID="i-yyy" #tag############################## _OS="OS1" _OS_restore="OS1_restore" ###################################### _ROOT_DEVICE="/dev/sda1" _CHECK_INTERVAL="60" #~~~~~前回のresultの続きボリューム作成後になります。 # インスタンスの停止 echo "インスタンスを停止します..." aws ec2 stop-instances --instance-ids ${_INSTANCE1_ID} echo "インスタンスの停止まで待機します..." aws ec2 wait instance-stopped --instance-ids ${_INSTANCE1_ID} if [ $? -eq 0 ];then echo "インスタンスの停止が完了しました. 引続き処理を続行します." else echo "インスタンスの停止に失敗しました." exit 1 fi # インスタンスからボリュームをデタッチ echo "インスタンスからボリュームをデタッチします..." for ebs in $(aws ec2 describe-instances --filters Name=instance-id,Values=${_INSTANCE1_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 ${_INSTANCE1_ID} --device ${_DEVICE} done < tmp/volume_info IFS=${OLDIFS} # インスタンスにボリュームがアタッチされるまで待機する aws ec2 wait volume-in-use --volume-ids "${_VOLUME_IDS[@]}" if [ $? -eq 0 ];then echo "ボリュームのアタッチが完了しました. 引続き処理を続行します." else echo "ボリュームのアタッチに失敗しました. 処理を中断します." exit 1 fi
上記の続きをしました所、アタッチする部分で躓きました。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/09 13:14 編集
2019/01/09 15:22 編集
2019/01/09 16:45
2019/01/10 00:41
2019/01/10 13:20 編集
2019/01/10 13:53 編集
2019/01/11 02:38
2019/01/11 04:06
2019/01/11 10:44
2019/01/11 10:57 編集