Closed5
スポットインスタンスの中断通知を受けてスクリプトを実行する(インスタンスメタデータ編)
EC2インスタンスメタデータを用いて、中断通知をうけたらスクリプトを実行する
簡素なスクリプトを使用するが、これを応用することで中断通知からのバックアップなどに使用することが出来る
インスタンスメタデータ
インスタンスメタデータのinstance-action
を確認する
中断通知なし
中断通知なしのため、何も表示されない
$ TOKEN=`curl -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` && curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/spot/instance-action
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>404 - Not Found</title>
</head>
<body>
<h1>404 - Not Found</h1>
</body>
</html>
中断通知あり
この場合2023年6月9日10時27分17秒にスポットインスタンスが中断される
$ TOKEN=`curl -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` && curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/spot/instance-action
{"action":"terminate","time":"2023-06-09T01:27:17Z"}
cloudtrail
- SendSpotInstanceInterruptions:2分前通知
- BidEvictedEvent:スポットインスタンス終了
なので概ねあってます。4秒オーバーかな?
中断通知からアクションをする
中断通知を受けたら、停止予定時間をs3に投げるシェルスクリプト
中断通知を5秒間隔で確認し、ステータスコードが404(中断通知がない)であれば続行、200であればs3にファイルコピー
#!/bin/bash
export s3bucket="testbucket-20230609"
while true; do
TOKEN=`curl -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
response=$(curl -s -w "%{http_code}" -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/spot/instance-action)
http_code=${response:(-3)}
if [ "$http_code" == "200" ]; then
instance_action=${response:0:${#response}-3}
echo $instance_action > /tmp/instance-action.txt
aws s3 cp /tmp/instance-action.txt s3://${s3bucket}/
break
fi
sleep 5
done
結果
簡素なものであるが、中断通知からのアクションが出来たのでOK
このスクラップは2023/06/09にクローズされました