13
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ローコードで始めるインフラコスト削減

Last updated at Posted at 2022-01-07

はじめに

Futureアドベントカレンダー20日目です。(遅れてごめんなさい)
19日は @orangekame3 さんの「量子コンピュータとジャンケンする」でした。
Futureのアドベントカレンダーを書くのは3年目で、毎年この時期になると時が経つのが早いのを感じます。

さて、私が所属しているプロジェクトでは継続的にインフラコストの見直しを実施しており、リザーブドインスタンスの適用やECSタスク数の削減、不要なリソースの削除等を行ってきました。

その結果月に約$1,000程度、年換算で約$120,000(※日本円で140万円)のコスト削減に成功しました。(※$1=115円)

そして、次の対応として総コストの中で多くの割合を占めるRDSのコスト削減を行なっていきたいと考えており、今回はその"検証"をしたいと思います。
内容としては平日は検証環境のRDSを自動で稼働させ、土日祝はRDSを自動で停止させるというものです。当社は土日祝休みなので、開発環境に関しては利用していないのに稼働している状態(= 無駄にコストが発生している)となっており、ここの無駄を削減したいと考えています。

削減コスト

ちなみにRDSを停止させることにより、削減できる費用はDBインスタンスの起動時間に対する課金です。(インスタンスが停止されている間でもプロビジョニングされたストレージとバックアップストレージに対する請求は行われます。)

■参考

一時的なテストや毎日の開発作業のために、断続的に DB インスタンスを使用する場合、コスト削減のため、Amazon RDS DB インスタンスを一時的に停止できます。DB インスタンスが停止している間は、プロビジョニングされたストレージ (プロビジョニングされた IOPS を含む) とバックアップストレージ (指定された保存期間内の手動スナップショットと自動バックアップを含む) は請求されますが、DBインスタンス時間は課金されません
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_StopInstance.html

要件整理

実現したい要件を簡単に整理します。

  • 土日祝になったら自動的にRDSを停止させる。 (★今回の検証対象)
  • 土日祝明けはRDSを自動で起動させる。

利用サービス

以前はLambda関数を使用してカスタムロジックを記述したり、CloudWatchのイベントルールを作成したりする必要がありましたが、人員リソース・工数がそこまでかからないよう、今回はローコードで対応できるところはローコードで対応して、RDSを土日祝は自動で停止してコスト削減させるようにしていきたいと思います。

利用するサービスを以下に記載します。

RDS起動

今回の停止対象となるRDSを起動します。

RDS作成後、リソースグループを作成するため、タグを付与します。
今回は、KeyをAction、ValueをStartStop とします。

image.png

リソースグループの作成

次に、タグ付けされたAmazon RDS DBインスタンスのリソースグループを作成します。

image.png

AWS Systems Manager Change Calendar とは

次に、Change Calendarから設定をしていきます。

Change Calendarは、簡単に説明すると、指定したアクションが実行できる日時とできない日時の範囲を設定することができるもので、イメージとしてはGoogleカレンダーに近いものになります。

Change Calendarにスケジュールを設定する

祝日の設定

まず、RDSを停止させる祝日のイベント設定から行います。

Change Calendar(変更カレンダー)ではデフォルトでは日本の祝日のデータが含まれていないため、Googleカレンダーのics形式の祝日データを利用して祝日のイベント設定を行います。

AWS Systems Managerのサイドバーより、「カレンダーの変更」「変更カレンダーの作成」の順にクリックし、以下画面にアクセスします。

下画像の Import calendar.ics形式のカレンダーファイルを読み込むことができます。

image.png

祝日のデータを取得するため、GoogleカレンダーからiCal形式のデータをダウンロードします。

image.png

ダウンロードした、 basic.ics をImport calendarにセットし、カレンダーを作成します。

image.png

作成されたカレンダーを確認すると、祝日のデータが取り込まれたカレンダーが表示されていることがわかります。

image.png

土日の設定

次に土日の設定を行います。
作成されたカレンダーにはまだ土日の イベント が設定されていないため、コンソール画面から設定していきます。

イベントを作成 をクリック

image.png

image.png

これで土日のイベントを作成することができ、RDSを起動しない時間帯を設定することができました。

image.png

オートメーションの作成

次に行うのは、オートメーションの作成を行います。
AWS SystemsManagerには、オートメーションをすぐに開始できるように、事前定義された雛形を用意してくれています。今回は要件に合致する、AWS-StopRdsInstance を利用したいと思います。

AWS-StopRdsInstance 選択して、アクション -> ドキュメントのクローン作成 を押下します。

image.png

AWS-StopRdsInstance の内容は以下のとおりです。
まず最初に、RDSのインスタンスが起動中かどうかを確認し、起動中だった場合にはインスタンスを停止させます。その後、正常にRDSが停止されたか確認をするメソッドを呼び出します。

image.png

土日祝日の判定を追加

作成したオートメーションに土日祝日の判定を追加します。

ステップを追加を押下し、ChangeCalendarのStateを確認するようなステップを追加します。

ここで呼び出すGetCalendarStateというAPIの仕様は以下に記載されています。
レスポンスのStateは「OPEN」と「CLOSED」の二種類があり、カレンダー上の有無によってでStateが変わります。

*get_calendar_state(kwargs)
Gets the state of a Amazon Web Services Systems Manager change calendar at the current time or a specified time. If you specify a time, GetCalendarState returns the state of the calendar at that specific time, and returns the next time that the change calendar state will transition. If you don't specify a time, GetCalendarState uses the current time. Change Calendar entries have two possible states: OPEN or CLOSED .
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ssm.html#SSM.Client.get_calendar_state より引用

image.png

最終的なフローは以下の通りです。

image.png

メンテナンスウィンドウの設定

このRDSの停止処理は定期的に実行することになるため、Maintenance Windowを設定します。

日次で午前00:05に起動するようにします。

image.png

次にメンテナンスウィンドウのターゲットを指定します。

image.png

リソースグループを選択 を押下し、先ほど作成したリソースグループを指定します。

image.png

次に、すでに作成しているオートメーションを作成したMaintenance Windowに登録します。

image.png

作成したオートメーションの名前を入力し、検索すると、先ほど作成した stop-rds-instance が検索結果として表示されるので、これを選択し、必要なパラメータを入力します。

image.png

image.png

以下のようにタスクがMaintenance Windowに紐づいていればOKです。

image.png

停止処理の確認

設定が完了し、処理の成功とRDSが停止していることを確認しました。

image.png

image.png

起動

これで土日祝はDBが停止するようになりましたが、平日になった時に自動で起動する処理が必要です。
ただ、起動の処理も今回利用したオートメーションが用意されていますので、上述した内容に沿って設定を行うことで、起動も自動化することが可能です。

image.png

最後に

今回は1行もコードを書くことなく、リソースの自動起動・停止の処理を検証することができました。一方で、ローコードはITの知識が浅い人でも使いやすいということが謳われている場面もありますが、今回のケースはAWSの基本的な知識(IAM)やITスキルが一定程度ないと厳しいなと感じます。

今回はどのように動かすことができるのかを確認することが目的だったため、検証環境のRDSに適用する場合はもう少し検証や設計を行いたいと考えています。

これからも引き続き、AWSの新しいサービスに注目しながら触っていきたいと思います。

21日は @uhey22e さんの「スクワットが浅いと怒られる」です。

参考

13
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?