リザーブドインスタンスをAWS CLIから購入してみる

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。望月です。
AWSは多数のAPI群から成立しており、AWSのリソースに対する操作は全てAPIから実施します。EC2インスタンスを停止するStopInstanceやスナップショットを作成するCreateSnapshotなどですね。
先日APIの一覧を眺めていたところ、ふとEC2のAPIの中にPurchaseReservedInstancesOfferingというものを見つけて「!?」となりました。当然といえば当然なのですが、リザーブドインスタンスの購入もAPI経由で実行できるんですね。
というわけで、今日はそれを試してみました。小ネタです。

リザーブドインスタンスについて

まず最初に、リザーブドインスタンスの仕組みについておさらいしておきます。
リザーブドインスタンスは、一定額の前払金を支払うことで、「時間あたりの利用料が割り引かれる」ことと「そのインスタンスに対するキャパシティが保証される」の2つの恩恵を受けることができます。リザーブドインスタンスは月々の利用頻度に応じて、「軽度(Light Utilization)」、「中度(Medium Utilization)」、「重度(Heavy Utilization)」の3種類が存在します。このなかでは重度のみ位置づけが異なっており、重度のリザーブドインスタンスを購入した場合は購入したリザーブドインスタンスの適用対象となるインスタンスが起動しているかどうかにかかわらず、時間あたりの料金が発生します。そのため、24時間動いている前提のインスタンスに対しては時間課金割引の恩恵が強く受けられるのですが、1日数時間しか起動しないインスタンスに対して重度のリザーブドインスタンスを購入した場合、結果的にオンデマンドよりも高くなるといったことも考えられます。

今回購入するリザーブドインスタンスは、テスト用なのでt1.microのLight Utilizationにします。Reserved InstanceにはOfferingIdというものが存在します。商品番号的なものだとお考え下さい。APIからリザーブドインスタンスを購入する際には、このOfferingIdを指定してあげる必要があるので、それを調査する必要があります。以下にスクリプトを書きました。

#!/bin/bash

instanceType=t1.micro
region=ap-northeast-1
availabilityZone=${region}b
productDescription=Linux/UNIX    # Amazon Linux/Ubuntu
offeringType="Light Utilization" # Light/Medium/Heavy
duration=$((60*60*24*365))       # 1 year in second

aws ec2 describe-reserved-instances-offerings \
    --instance-type ${instanceType} \
    --availability-zone ${availabilityZone} \
    --offering-type "${offeringType}" \
    --max-duration ${duration} \
    --product-description ${productDescription} \
| jq '.ReservedInstancesOfferings[].ReservedInstancesOfferingId'

前半部分で、購入したいリザーブドインスタンスの情報を指定し、AWS CLIとjqを使ってOfferingIdを取得しています。このスクリプトをlookup.shとして保存し、実行すると以下の様な出力が得られます。

$ sh lookup.sh
"026cea2b-1b0b-468c-b31c-c5327c455702"

OfferingIdが取得できたので、購入のAPIを実行してみましょう。

mochizukimasao@HL00044 $ aws ec2 purchase-reserved-instances-offering --reserved-instances-offering-id "b4defefb-7962-40a2-b4a9-ae48927d3126" --instance-count 1
{
    "ReservedInstancesId": "b847fa93-29c1-4015-aa3c-198ca21cb6d1"
}

あっさり購入出来ました。Management Console上から、購入できているか確認します。

ri_1

ステータスがpayment-pendingになっているので、少し時間が経つとavailableになります。これでAWS CLIから購入できることが確認できました。

で、何が言いたかったかというと・・・

今回確認したとおり、リザーブドインスタンスの購入はEC2のAPIに所属しています。つまり、EC2に対してFull Control権限をもったユーザ/アクセスキーを持っていれば、リザーブドインスタンスが自由に購入できてしまうことを意味しています。アクセスキーの漏洩などによりEC2に対する権限を第三者が取得した場合、オンデマンドインスタンスだけでなくリザーブドインスタンスの購入もできてしまうので、注意が必要です。課金攻撃を受けないためにも、くれぐれもキーの取り扱いには最新の注意を払いましょう。