🤖
AWS T系インスタンスのCPUクレジットを使い切る
概要
AWSのバースト可能パフォーマンスインスタンス のCPUcreditは徐々に回復していきますが、一定量以上は回復しません。
下記画像はcloudwatchのCPUCreditBalanceです。
このグラフを見たとき、貰えるはずのCPUcreditを捨てている気がして、なんとなく勿体ない気がしてきました。
という事で、CPUcreditBalanceの範囲で何か処理させて(今回は暗号資産マイニング)おこうかなと思ったのが今回のテーマです。
設定
必要パッケージのインストール
apt install jq awscli
cloudwatchが触れるようにIAMロールを設定します。
下記のようなスクリプトで、クレジットが50以下になるまでCPUを使います
スリープ時間や、打ち切る閾値は適宜調整します。
#!/bin/bash
set -eu
cd `dirname $0`
TOKEN=`curl -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 60"`
instance_id=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/instance-id)
function get_cpu_credit {
echo $(aws cloudwatch \
--output json \
get-metric-statistics \
--namespace AWS/EC2 \
--metric-name CPUCreditBalance \
--start-time `date -u -d "5 minutes ago" "+%Y-%m-%dT%H:%M:%SZ"` \
--end-time `date -u "+%Y-%m-%dT%H:%M:%SZ"` \
--period 300 --statistics Average \
--dimensions Name=InstanceId,Value=$instance_id |
jq .Datapoints[0].Average | cut -d. -f1)
}
# 何か重い処理をバックグラウンドで走らせる
./cpuminer ...(いろんなオプション) &
CPU_MINER_PID=$!
while [ $(get_cpu_credit) -gt "50" ];do
sleep 15m
done
kill -TERM $CPU_MINER_PID
あとは定期実行させます
curl -L https://git.io/Jkf7Z > /etc/systemd/system/cpuminer.service
curl -L https://git.io/Jkf7n > /etc/systemd/system/cpuminer.timer
systemctl enable cpuminer.timer
systemctl start cpuminer.timer
結果
うまくいきました
Discussion