はじめまして。
今年の5月に入社した、エンジニアリンググループの佐藤です。前職ではメディア関連の会社で就業していて、WebサイトやWebシステムの開発チームでインフラ構築・運用・保守を担当してきました。この度、自分自身の技術力向上を目的にハートビーツに入社しました。
今回は、業務の中でAWSのリザーブドインスタンスを購入する機会があったので関連するTipsをご紹介します。
リザーブドインスタンスとは
AWSのリザーブドインスタンスとは、1年もしくは3年の長期間利用を予約することで、通常のオンデマンド料金に対して割引が適用され、オプションによってはキャパシティーを予約できるサービスです。その他様々な購入オプションがありますが、今回はそのオプションについて詳細は触れません。 詳細については AWSの公式サイトをご確認ください。
高額決済ってこわい
リザーブドインスタンスの購入手続きは、先述の通り長期利用を予約するものになるため、前払いを選択する場合は1年分もしくは3年分を一括で前払いすることになります。このため、「前払いなし」の購入オプションを選択しない限り、普段より大きめな金額の決済が発生します。AWSを利用中の方はご存知のことでしょうが、マネージメントコンソールのユーザインターフェースは不定期かつ予告なく変更になることがあります。このため手順書が再利用できないこともありますし、そもそも画面での操作には再現性がなく、ミスの温床となってしまうことが多々あります。もちろんダブルチェックでの購入でミスを低減できますが、リモートワークでのダブルチェックにはやはり不安がつきまといます。そのような環境で高額な決済手続きをエンジニアが行うことは、「気をつけて操作する」以外の解決策がないのでストレスと言わざるをえません。
決済オペレーションにもレビューと再現性を
AWSには豊富なAPIと比較的かんたんに使えるコマンドラインツールが用意されています。リザーブドインスタンスの購入オペレーションももれなく対応しています。コマンドラインツールを利用することで、購入手続きを事前にレビューすることが可能になり、高額決済のストレス緩和に大いに貢献してくれます。
コマンド例
リザーブドインスタンスの購入手続きは大きく分けて2段階の手順を踏みます。リザーブドインスタンスにはOffering IDという購入パターンごとにユニークなIDが割り当てられています。1段階目としてまずはこのOffering IDを特定することが必要になります。検索する際は、各種条件を絞り込んで最終的にOffering IDがひとつになるまで絞りきるのがポイントです。その後、1段階目で取得したOffering IDを指定して購入コマンドを実行します。
それではさっそく購入までの実行例をいくつか見ていきましょう。
Amazon EC2
購入例
- インスタンスタイプ:c5.large
- リザーブドインスタンスクラス:スタンダード
- 支払いオプション:全額前払い(All Upfront)
- 期間:1年
- テナンシー:共有(default)
- プラットフォーム:Linux/UNIX
- スコープ:リージョナル(東京リージョン)
- マーケットプレースからの購入:しない
- 購入台数:2台
Offering IDの取得
aws ec2 describe-reserved-instances-offerings \
--region ap-northeast-1 \
--instance-type c5.large \
--product-description "Linux/UNIX" \
--instance-tenancy default \
--no-include-marketplace \
--offering-class standard \
--offering-type "All Upfront" \
--filters Name=duration,Values=31536000 Name=scope,Values=Region \
--query 'ReservedInstancesOfferings[*].ReservedInstancesOfferingId' \
--output text
結果にはe5d34a92-3b69-4392-bffc-da70920bf9d4というOffering IDが返ってきました。期間とスコープについては絞り込むためのオプションがないのでfiltersオプションを利用しています。また、queryオプションとoutputオプションを使うことで出力結果がOffering IDだけになるように調整しています。filtersで指定しているdurationの値31536000は、365日を秒になおした値です。このコマンドでは決済は行われないので何度確認しても大丈夫です。レビュアーにもしっかり確認してもらいましょう。
リザーブドインスタンス購入
先ほど取得したOffering IDを指定してリザーブドインスタンスを購入します。購入するインスタンスの数はここで指定しています。このコマンドを実行すると決済が実行されるので注意してください。社内で決裁が承認されてから実行しましょう。また、ヒストリーバック等で複数回実行しないように注意してください。
aws ec2 purchase-reserved-instances-offering \
--region ap-northeast-1 \
--reserved-instances-offering-id <取得したOffering ID> \
--instance-count 2
以上でEC2のリザーブドインスタンス購入手続きが完了しましたが、まだこの時点では支払いのステータスがpendingになっています。翌日もステータスがactiveにならない場合、なんらかの理由で決済が滞っているのでサポートに確認してみましょう。
ちなみに、EC2のリザーブドインスタンスには以下のように日時を指定して購入予約をするオプションがあります。リザーブドインスタンスには更新という概念がないので、リザーブドインスタンスの有効期間を切れ目なく購入したい場合などに活用します。
aws ec2 purchase-reserved-instances-offering \
--region ap-northeast-1 \
--reserved-instances-offering-id <取得したOffering ID> \
--instance-count 2 \
--purchase-time "2022-11-01T00:00:00+00:00"
Amazon RDS
RDSでのリザーブドインスタンスの購入も大まかな流れは同じです。ただ、RDSの場合は指定できるオプションに違いがあり、EC2でできた予約購入ができません。このあたりはぜひAWSに機能追加をしていただきたいものです。
購入例
- インスタンスタイプ:db.m5.xlarge
- 支払いオプション:全額前払い(All Upfront)
- 期間:3年
- マルチAZの適用:あり
- DBエンジン:PostgreSQL
- リージョン:東京リージョン
- 購入台数:1台
Offering IDの取得
aws rds describe-reserved-db-instances-offerings \
--region ap-northeast-1 \
--db-instance-class db.m5.xlarge \
--duration 94608000 \
--multi-az \
--product-description postgresql \
--offering-type "All Upfront" \
--query 'ReservedDBInstancesOfferings[].ReservedDBInstancesOfferingId' \
--output text
結果には58c38f23-2849-4da0-8718-1bb241059421というOffering IDが返ってきました。EC2と違ってRDSでは期間の絞り込みオプションが存在します。EC2のときと同様、queryオプションとoutputオプションを使うことで出力結果がOffering IDだけになるように調整しています。durationの値94608000は、365日×3を秒になおした値です。なお、期間内にうるう年をふくむ場合も365日で計算されるので、実際に購入すると有効期限が3年後の1日前になったように見えます。このコマンドでは決済は行われないので何度確認しても大丈夫です。レビュアーにもしっかり確認してもらいましょう。
リザーブドインスタンス購入
先ほど取得したOffering IDを指定してリザーブドインスタンスを購入します。このコマンドを実行すると決済が実行されるので注意してください。
aws rds purchase-reserved-db-instances-offering \
--region ap-northeast-1 \
--reserved-db-instances-offering-id <取得したOffering ID> \
--db-instance-count 1
EC2と違って予約購入のオプションはありません。リクエストが通った時間から適用されます。支払いのステータスについてはEC2と同様です。以上でRDSのリザーブドインスタンスが購入できました。
Amazon ElastiCache
ElastiCacheはインスタンスではありませんが、リザーブドインスタンスと同様のサービスとしてリザーブドキャッシュノードが存在します。基本的な考え方はEC2やRDSのリザーブドインスタンスと変わりません。
購入例
- インスタンスタイプ:cache.t2.small
- 支払いオプション:全額前払い(All Upfront)
- 期間:3年
- 使用度:重度
- キャッシュエンジン:Redis
- リージョン:東京リージョン
- 購入台数:2台
Offering IDの取得
aws elasticache describe-reserved-cache-nodes-offerings \
--region ap-northeast-1 \
--cache-node-type cache.t2.small \
--duration 94608000 \
--product-description redis \
--offering-type "Heavy Utilization" \
--query "ReservedCacheNodesOfferings[].ReservedCacheNodesOfferingId" \
--output text
結果にはef0a2a44-f33d-4c61-aa40-958265d246f0というOffering IDが返ってきました。オプションの使用感はRDSと近いです。これまで同様、queryオプションとoutputオプションを使うことで出力結果がOffering IDだけになるように調整しています。このコマンドでは決済は行われないので何度確認しても大丈夫です。レビュアーにもしっかり確認してもらいましょう。
リザーブドキャッシュノード購入
先ほど取得したOffering IDを指定してリザーブドキャッシュノードを購入します。このコマンドを実行すると決済が実行されるので注意してください。
aws elasticache purchase-reserved-cache-nodes-offering \
--region ap-northeast-1 \
--reserved-cache-nodes-offering-id <取得したOffering ID> \
--cache-node-count 2
支払いのステータスについてはEC2やRDSと同様です。以上でElastiCacheのリザーブドキャッシュノードが購入できました。
まとめ
EC2、RDS、ElastiCacheのリザーブドインスタンスをコマンドラインツールを使用して購入する方法をご紹介しました。コマンドラインツールを使用することで事前の手間は増えるようにも感じますが、レビューを通すことで実行者は安心して購入作業をすすめることができました。ぜひコマンドラインツールを活用しましょう。
最後に
ハートビーツでは、AWS代行サービスをメニューとして取り扱っています。お客様とAWSの間に弊社が入ることで、AWSとの契約からサービス環境の構築、監視、運用、支払いに至るまで全て弊社にお任せいただけるサービスとなります。ハートビーツのマネージドサービスと組み合わせることで、AWSにおける様々な手続きを我々が対応します。もちろん今回紹介したリザーブドインスタンスの購入も対応します。AWSを使いたいけど運用に不安がある、といったお客様はぜひご相談ください。
AWS代行サービスについてはこちら