開発用クラウドコンポーネントの管理
今まで結構おおらかな開発組織に属していた事でテストサーバーは常時稼働させていたのだが、コストがバカにならない状況になってきた。
事業系開発エンジニアだったので、基本的には開発組織=金食い虫と言われ続けていた。
チリツモにはなるが「使わない時間」に稼働を止める事が目的。
特にRDSは高い。個人のアカウントでもそうだが稼働している時間以外(平日19時以降と土日祝日)は停止させる事でコスト削減を図る。
起動と停止スケジュール
- 平日: 09:00 起動 / 19:00 停止
- 土日: 終日停止
19時以降テスト環境で試す事はあまりない。自動停止して接続できないよーって時は手運用で起動。
個人レベルのサーバーはルールや運用でカバーする
方法
- IAMロールの作成
- Amazon EventBridgeの設定
1. IAMロールの作成
RDSの停止用のIAMロールを作成する
IAMポリシーの作成
IAM > ポリシー > ポリシーの作成
以下のポリシーを作成する
サービスを選択: RDS
アクション: 以下を選択
- StopDBInstance
アクション:以下を選択
- StartDBInstance
リソース: 全てを選択
ポリシー名:RDSStartStopPolicyとか自分で覚えやすい名前
IAMロールの作成
IAM > ロール > ロールの作成
信頼されたエンティティの種類を選択: カスタム信頼ポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Statement1",
"Effect": "Allow",
"Principal": {
"Service": "scheduler.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
具体的にはPrincipalのServiceにscheduler.amazonaws.comを指定し次へ
許可ポリシーに先程作ったポリシーを選択し、ロールを作成する。
ロール名:RDSStartStopRoleとか自分で覚えやすい名前
2. Amazon EventBridgeの設定
RDS停止用のルール作成
EventBridge > スケジュール > スケジュールの作成
ルール名:RDSStopRuleとか自分で覚えやすい名前
スケジュールパターン
頻度:定期的なスケジュール
スケジュールの種類:cronベースのスケジュール
cron式は月曜〜金曜の19時に設定
0 19 ? * MON-FRI *
フレックスタイムウィンドウ:オフ
ターゲットの選択
ターゲットAPI:すべてのAPIを選択
全てのAWSサービスからRDSを検索し、AmazonRDSを選択
検索ボックスに「StopDBInstance」と入力し、StopDBInstanceを選択
入力欄のDbInstanceIdentifierに停止させたいRDSのインスタンスIDを入力
スケジュール完了後のアクション
スケジュール完了後のアクション:Noneを選択
アクセス許可を指定
実行ロール: 既存のロールを使用
既存の役割を選択: ロール作成で作成したRDSStartStopRoleを選択
これでRDSインスタンス停止用のアクションが作成される。
同様に起動ルールも作った後にやることは19時以降にアクセスして接続出来ないかと言う事を確認する。
凄く細かい事だけど19時ー09時と14時間停止している事になるので1日約60%は稼働していない。
1ヶ月で約17.5日分の稼働時間が削減される。
RDSを開発者個々でインスタンスを持つ事はそうそうないが、自動化をしてコスト削減を徹底は課題になるだろうし、ちょっと手間を掛ければ出来る事なので遂行していく。
追記
9:00 RDS起動処理開始
9:11 利用可能
db.t4g.micro だと起動に結構かかる。