【AWS】 リザーブドインスタンスの購入を拒否する方法


:::note warn
一部のサービスについては調査中ですが、現時点での一覧を公開します。
:::

リザーブドインスタンスは、クラウドサービスにおいて事前にリソースを予約し、コスト最適化を図る方法の一つです。しかし、リザーブドインスタンスの購入は高額になる可能性があり、予期しない支出を引き起こすリスクも伴います。

この問題に対処する一つの方法は、IAM ポリシーを利用してリザーブドインスタンスの購入を明示的に拒否することです。具体的には、以下のアクションを拒否する IAM ポリシーの設定を検討してください。


## リザーブドインスタンスの対象サービス

過去のブログで **10** のサービスを調査しました。一覧を再掲します。 [1]

https://qiita.com/uechi-shingo/items/54cd342a9aee1f7ec3f8


| リザーブドの種類       | AWS サービス                                              | 
| ---------------------- | --------------------------------------------------------- | 
| リザーブドインスタンス | EC2, RDS, OpenSearch Service                                | 
| リザーブドノード       | ElastiCache, Redshift, MemoryDB                             | 
| リザーブドキャパシティ | DynamoDB, CodeBuild, CloudFront | 
| その他   | Elemental MediaLive                                   | 

## 上記サービスの購入に関するアクション

`*ReservedInstances*`などと幅広く指定する事も可能ですが、以下のアクションを明確に拒否する事も効果的と考えます。
以下のアクションを IAM ポリシーで Deny することで、各サービスにおける購入を制限することが可能です。

- ec2:PurchaseReservedInstancesOffering [2]
- ec2:CreateCapacityReservation [2]
- rds:PurchaseReservedDBInstancesOffering [3]
- es:PurchaseReservedInstanceOffering [4]
- elasticache:PurchaseReservedCacheNodesOffering [5]
- redshift:PurchaseReservedNodeOffering [6]
- memorydb:PurchaseReservedNodesOffering [7]
- dynamodb:PurchaseReservedCapacityOfferings [8]
- codebuild:CreateFleet [9]
- (CloudFront 調査中) [10]
- medialive:PurchaseOffering [11]

### 【補足 1 】アクション名に含まれる Offering とは？
以下の情報の組み合わせで一意の Offering ID が決まります。[12]
リザーブドインスタンスを購入する際には、この Offering ID を指定する必要があります。

- インスタンスタイプ
- 支払オプション
- 期間
- 購入台数
- (その他)

したがって、Offering を拒否することで、リザーブドインスタンスを購入することが出来なくなります。
言い換えると、`リザーブドインスタンスを購入する許可`を拒否する必要があります。

### 【補足 2 】CodeBuild のリザーブドキャパシティについて
DyanamoDB や CloudFront とは位置付けが異なる様です。[13]
他の RI や Savings Plans のように、特定の期間を指定して購入するものではなさそうです。

##  Savings Plans の購入に関するアクション
リザーブドインスタンスと異なり、 Savings Plans は以下のアクションで指定が可能です。
- cloudfront:CreateSavingsPlan [14]
- savingsplans:CreateSavingsPlan [15]

## 参考資料

[1] [【AWS】 リザーブドインスタンスの対象サービスを全部言えますか？](https://qiita.com/uechi-shingo/items/54cd342a9aee1f7ec3f8)

[2] [Amazon EC2 のアクション、リソース、および条件キー](https://docs.aws.amazon.com/ja_jp/service-authorization/latest/reference/list_amazonec2.html)

[3] [Amazon RDS のアクション、リソース、および条件キー](https://docs.aws.amazon.com/ja_jp/service-authorization/latest/reference/list_amazonrds.html)

[4] [Amazon OpenSearch Service のアクション、リソース、および条件キー](https://docs.aws.amazon.com/ja_jp/service-authorization/latest/reference/list_amazonopensearchservice.html)

[5] [Amazon ElastiCache のアクション、リソース、および条件キー](https://docs.aws.amazon.com/ja_jp/service-authorization/latest/reference/list_amazonelasticache.html)

[6] [Amazon Redshift のアクション、リソース、および条件キー](https://docs.aws.amazon.com/ja_jp/service-authorization/latest/reference/list_amazonredshift.html)

[7] [Amazon MemoryDB のアクション、リソース、および条件キー](https://docs.aws.amazon.com/ja_jp/service-authorization/latest/reference/list_amazonmemorydb.html)

[8] [Amazon DynamoDB のアクション、リソース、および条件キー](https://docs.aws.amazon.com/ja_jp/service-authorization/latest/reference/list_amazondynamodb.html)

[9] [AWS CodeBuild のアクション、リソース、条件キー](https://docs.aws.amazon.com/ja_jp/service-authorization/latest/reference/list_awscodebuild.html)

[10]


[11] [AWS Elemental のアクション、リソース、および条件キー MediaLive](https://docs.aws.amazon.com/ja_jp/service-authorization/latest/reference/list_awselementalmedialive.html)

[12][リザーブドインスタンスの購入 - Amazon Elastic Compute Cloud](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ri-market-concepts-buying.html#ri-buying-standard)

[13] [AWS CodeBuild のリザーブドキャパシティを使ってみました | DevelopersIO](https://dev.classmethod.jp/articles/codebuild-reserved-capacity/)

[14] [Amazon CloudFront のアクション、リソース、および条件キー](https://docs.aws.amazon.com/ja_jp/service-authorization/latest/reference/list_amazoncloudfront.html)

[15] [AWS Savings Plans のアクション、リソース、および条件キー](https://docs.aws.amazon.com/ja_jp/service-authorization/latest/reference/list_awssavingsplans.html)