小さなことから始めるAWSコスト最適入門
序論
AWSをドル建てで支払う場合為替レート変更による料金の増減があります。
昨今円安の影響で何もしていないにも関わらずどんどんAWSのコストが上がっていき頭を悩ますエンジニアも多いと思います。
ドル円チャート[1]
AWSのベストプラクティスを定めたWell-Architected[2]フレームワークでも独立した章がある、AWSコスト最適に特化した書籍があるなどコスト最適化はAWS上でサービスを運用していく中で意識していかなければならない分野です。
とはいってもAWSコスト最適化の方法は多岐にわたり、どれから手を付けていけばいいかわからないこともあります。
まずは個人からでも気軽に始められる余剰コンピューティングリソースの自動起動停止に焦点を絞ったコスト削減方法について紹介していきます。
対象読者
- AWSコストについて関心がある
- EC2、RDS、ECSの稼働時間を楽に減らしたい
EC2のコスト最適化
EC2やRDS、ECSなどのコンピューティングリソースをプロビジョニングさせて課金させるリソースは、夜中や早朝の時間帯も起動させたままでは料金が発生してしまいます。
本番稼働させているものでしたら24時間稼働させ続けますが、業務時間中しか使わない検証環境のコンピューティングリソースも24時間稼働させたままにしておくのは非常にもったいないコストです。
しかし、毎日の業後に検証環境のコンピューティングリソースを一台一台停止するのも運用が辛く万が一誤って本番環境のリソースを停止させてしまっては大問題です。
以前Instance Scheduler[3]を使ったリソース稼働時間の自動起動停止の方法について紹介しましたが、その後Systems Managerでもっと簡単にEC2の自動起動停止を実現できるResource Schedulerが登場しました。
Resource SchedulerはInstance Scheduler程自由にカスタマイズはできませんが、シンプルに設定できるのでAWSを始めたばかりの人にもおススメのサービスになります。
Systems Managerのコンソール画面の左サイドバーから高速セットアップという項目がありますのでこちらをクリックします。
高速セットアップには運用業務を楽にしてくれるいくつかのソリューションが提供されており、その中にResource Schedulerも含まれています。
Resource Schedulerでは対象にしたいEC2のタグを指定し、EC2の起動時刻、停止時刻、適用曜日を設定できます。
作成するとResource Schedulerのデプロイが行なわれ、条件に一致したタグがついたEC2を対象に起動停止のスケジューリングが実行されます。
ただ残念ながら2023年11月時点ではタグは1つしか設定できず、複数タグによるAND条件やOR条件でのタグフィルタリングはできません。またInstance SchedulerはRDSも含めて自動起動停止が設定できましたが、Resource Schedulerは現状EC2のみを対象としています。
RDSについてはこの後紹介するEventBridge Schedulerを使うことでECSと同様のソリューションでコンピューティングリソースの最適化を図れます。
RDS/ECSのコスト最適化
EventBridge SchedulerはスケジュールをトリガーにAWSのAPIを実行できるサーバーレススケジューラです。よくあるユースケースとしてLambdaを定期実行したいときにEventBridgeでセットした時間になったら実行したいLambdaをターゲットにEventBridgeがLambdaを叩くというバッチ処理が簡単に設定できます。
EventBridge Schedulerを使うことで先のResource Schedulerと同じように深夜帯になったら停止APIを実行し、業務開始時間になったら起動APIを実行するといった定期処理を実現できます。
実際にEventBridge Schedulerで起動スケジューラーと停止スケジューラー2つを作る手順を紹介します。
RDSスケジューラー作成手順
スケジュールの作成を選択するとスケジュールパターンについて設定します。
例として月曜から金曜の20時になったらEventBridge Schedulerが起動するようにパターンを作ります。
次にAPIターゲットの選択です。すべてのAPIからAWSサービス別の大項目を選択し、そのサービス内のAPIから実行したいAPIを選択します。
例としてRDSからDBを停止したいAPIを選択します。
API選択後にそのAPIを渡したいDBリソースを指定します。ここはDB識別子の値しか入力できず、例えばタグ別による複数検索ができないか過去に問い合わせたことがあるのですが、残念ながらタグによる一括指定はできずDB識別子を1個ずつ指定する必要があります。
停止したいRDSインスタンスを指定
EventBridge Schedulerで一点気を付けなければならないのはアクセス許可設定です。
多くのAWSサービスでは新規リソース作成時にそのリソースが他のAWSサービスへのアクセスを許可するIAMロールの新規作成ができるのですが、EventBridge Schedulerはなぜか新しいロールの作成がグレーアウトされており事前にIAMロールを作成する必要があります。
IAMロールでEventBridge Schedulerにアクセス許可を付与するロールを作成しようとしてもコンソールからでは信頼されたエンティティにEventBridge Scheduler向けの選択肢がありません。
ここはJSON記法で直接記述する必要があります。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "scheduler.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
作成したロールにDB操作できるIAMポリシーをアタッチし、先ほどのアクセス許可で作成したIAMロールを付与すればEventBridge SchedulerがRDSに対して起動停止できるようになります。
ECSスケジューラー作成手順
ECSのスケジューラー作成もRDSとほとんど同じです。ECSのAPIからUpdateService APIを選択し、対象ECSクラスタ、サービス、実行希望数を入力します。
特定時間になったら対象サービスを0にする
後の流れはRDSのスケジューラー設定と同じです。[4]
所感
小さなことから始められるAWSコスト最適化について紹介しました。
テスト用に動かしたリソースを消し忘れて気が付いたら課金されていたという経験をされた人は多いと思います。
AWSコストの管理はユーザー自身の責任範囲ですので小規模からでも良いので是非AWSコストを最適化できるように意識してAWSを動かしてみてください。
LT資料
LTのスライド資料です。
参考文献
-
https://aws.amazon.com/jp/architecture/well-architected/?wa-lens-whitepapers.sort-by=item.additionalFields.sortDate&wa-lens-whitepapers.sort-order=desc&wa-guidance-whitepapers.sort-by=item.additionalFields.sortDate&wa-guidance-whitepapers.sort-order=desc ↩︎
-
https://aws.amazon.com/jp/solutions/implementations/instance-scheduler-on-aws/ ↩︎
-
IAMロール選択時にECSへのアクセス許可が付与されているEventBridge Scheduler向けIAMロールを用意することを忘れずに ↩︎
Discussion