EC2,RDSの起動時間を設定する


はじめに

AWS無料枠の関係でEC2、RDSの起動時間を制限したいなと思った時の備忘録。
どちらもCloudWatchを使用して対応します。

EC2の起動時間設定

EC2インスタンス停止

IAMロールの作成

①IAMコンソールからロールを作成

②AWSサービス>EC2を選択>次のステップ

③AWS 管理ポリシーの AmazonSSMAutomationRole をアタッチ

④ロール名を入力し作成

⑤作成したロールを選択し、「信頼関係」のタブから「信頼関係の編集」をクリックし、以下を入力

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "events.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

CloudWatchのイベントルールを作成

①CloudWatchコンソールのイベントから「ルールの作成」ボタンをクリック

②イベントソースをスケジュールに設定し、Cron式を入力
今回の場合、日本時間で毎日23時に停止となる
参考:cron式

③ターゲット画面にて、"EC2 StopInstances API 呼び出し"を選択し、対象のインスタンスIDを設定。
既存のロールで先程作成したロールを選択

④ルールの名前を入力し、作成して完了

EC2インスタンス開始

CloudWatchのイベントルールを作成

①CloudWatchコンソールのイベントから「ルールの作成」ボタンをクリック

②イベントソースをスケジュールに設定し、Cron式を入力
今回の場合、日本時間で毎日8時に停止となる

③ターゲット画面にて、"AWS-StartEC2Instance"を選択し、対象のインスタンスIDを設定。
既存のロールで先程作成したロールを選択

④ルールの名前を入力し、作成して完了

RDSの起動時間設定

ちなみに以下の記載があります。
DB インスタンスは最大 7 日間停止できます。
7 日後に DB インスタンスを手動で起動しなかった場合、DB インスタンスは自動的に起動されるため・・・

RDS停止の最大は7日間のようです。

参考:一時的に Amazon RDS DB インスタンスを停止する

RDSインスタンス停止

Lambdaの作成

①AWS Lambda>関数>関数の作成

②適当な関数名を入力し、ランタイムはPython3.7を選択、
アクセス権限:基本的な Lambda アクセス権限で新しいロールを作成 →関数の作成

③作成後、トリガーを追加を押下

④EventBridge(CloudWatch Events)を選択し、新規ルールの作成を選択
ルールタイプをスケジュール。スケジュール式にcronを設定。
画像の場合、毎日23時にインスタンスを停止となる。

⑤追加を押下

⑥作成した関数のコードソースを開き、以下の内容に書き換え →Deployを押下

import boto3

def lambda_handler(event, context):
dbinstances = [RDS DB インスタンス識別子,RDS DB インスタンス識別子] rds = boto3.client(rds)
result = rds.stop_db_instance(DBInstanceIdentifier = dbinstance)
print(result)
return 0

IAMロールの設定

①IAM管理画面>ロール にて、Lambdaの作成②で作成したロールを選択

②管理ポリシーに以下をアタッチ
・CloudWatchFullAccess
・AmazonRDSFullAccess

③これにてRDSインスタンスの停止設定が完了

RDSインスタンス開始

RDSインスタンス停止の設定手順と以下が異なるのみです。
④スケジュールのcron式の内容
⑥開始コードの内容

Lambdaの作成

①AWS Lambda>関数>関数の作成

②適当な関数名を入力し、ランタイムはPython3.7を選択、
アクセス権限:基本的な Lambda アクセス権限で新しいロールを作成 →関数の作成

③作成後、トリガーを追加を押下

④EventBridge(CloudWatch Events)を選択し、新規ルールの作成を選択
ルールタイプをスケジュール。スケジュール式にcronを設定。

⑤追加を押下

⑥作成した関数のコードソースを開き、以下の内容に書き換え →Deployを押下

import boto3

def lambda_handler(event, context):
dbinstances = [RDS DB インスタンス識別子,RDS DB インスタンス識別子] rds = boto3.client(rds)
result = rds.start_db_instance(DBInstanceIdentifier = dbinstance)
print(result)
return 0

IAMロールの設定

①IAM管理画面>ロール にて、Lambdaの作成②で作成したロールを選択

②管理ポリシーに以下をアタッチ
・CloudWatchFullAccess
・AmazonRDSFullAccess

③これにてRDSインスタンスの開始設定が完了

参考

【Lambda】EC2インスタンスやRDSの自動起動/停止設定を実現する
[AWS]Lambda で RDS の自動起動・自動停止を実装する
EC2インスタンスのスケジュール起動がお手軽に実現できるようになっていた!
EC2 インスタンスの起動と停止を自動化することは出来ますか?