AWS T系インスタンスのCPUクレジットを使い切る


概要

AWSのバースト可能パフォーマンスインスタンス のCPUcreditは徐々に回復していきますが、一定量以上は回復しません。
下記画像はcloudwatchのCPUCreditBalanceです。
このグラフを見たとき、貰えるはずのCPUcreditを捨てている気がして、なんとなく勿体ない気がしてきました。

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

結果

うまくいきました
result