Lambda 関数を使用して Amazon RDS インスタンスを 7 日以上停止する方法を教えてください。
AWS Lambda を使用して、Amazon リレーショナルデータベースサービス (Amazon RDS) を 7 日間以上停止したいと考えています。
簡単な説明
デフォルトでは、Amazon RDS データベースインスタンスを一度に最大 7日間停止できます。7 日後、インスタンスはメンテナンスの更新を見逃さないように再起動します。
インスタンスを 7 日以上停止する場合は、Step Functions を使用してメンテナンス期間を逃さずにワークフローを自動化できます。
**注:**別の解決策については、「ステップ機能を使用して Amazon RDS インスタンスを 7 日以上停止する方法を教えてください」を参照してください。
解決策
IAM 権限の設定
AWS ID およびアクセス管理 (IAM) ポリシーを作成して、Lambda がインスタンスを起動および停止し、インスタンスの情報を取得できるようにします。
1. [IAM コンソール] を開きます。
2. ナビゲーションペインで、[ポリシー] を選択します。
3. [ポリシーを作成] を選択します。
4. [JSON] タブを選択します。
5. 必要な IAM アクセス権限を付与するには、[JSON] タブに次のポリシーを入力します。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": [ "rds:StartDBCluster", "rds:StopDBCluster", "rds:ListTagsForResource", "rds:DescribeDBInstances", "rds:StopDBInstance", "rds:DescribeDBClusters", "rds:StartDBInstance" ], "Resource": "*" } ] }
6. [次へ: タグ] を選択します。
7. (オプション) タグを追加するには、[タグを追加] を選択し、[キー] フィールドと [値 - オプション] フィールドに適切な値を入力します。
8. [次へ: レビュー] を選択します。
9. [ポリシーの確認] ページの [名前] に、ポリシーの名前を入力します。概要セクションを確認して、ポリシーによって付与されている権限を確認してください。
10. [ポリシーを作成] を選択します。
詳細については、「JSON エディターを使用したポリシーの作成」を参照してください。
IAM ロールを作成し、必要なポリシーをアタッチします
1. [IAM コンソール] を開きます。
2. ナビゲーションペインで、[ロール] を選択します。
3. [ロールを作成] を選択します。
4. 「信頼できるエンティティタイプを選択」で、[AWS サービス] を選択します。
5. 「またはさーびうを選択してユースケースを表示」で、[Lambda] を選択します。
6. [次へ: 権限] を選択します。
7. **「フィルターポリシー」には、前のセクションで作成したポリシーの名前を入力します。表示されたら、ポリシーを選択します。「フィルターポリシー」**には、AWSLambdaBasicExecutionRole を入力します。表示されたら、AWSLambdaBasicExecutionRole 管理ポリシーを選択します。
8. [次へ: タグ] を選択します。
9. (オプション) タグを追加するには、[キー] フィールドと [値 - オプション] フィールドに適切な値を入力します。
10. [次へ: レビュー] を選択します。
11. [ロールを作成] ページの、[ロール名] に、作成するロールの名前を入力します。
12. [ロールを作成] を選択します。
詳細については、「AWS のサービス用ロールの作成 (コンソール)」を参照してください。
DB インスタンスにタグを追加
1. Amazon RDS コンソールを開きます。
2. ナビゲーションペインで、[データベース] を選択します。
3. 自動的に起動および停止する DB インスタンスを選択します。
4. 詳細セクションで、[タグ] セクションまでスクロールします。
5. [タグ] タブで、[追加] を選択します。タグキーには、autostart と入力します。[値] には、yes と入力します。[追加] を選択して変更を保存します。
6. 再度**[追加]** を選択します。[タグキー] に autostop と入力します。[値] には、yes と入力します。[追加] を選択して変更を保存します。
詳細については、「タグの追加、一覧表示、削除」を参照してください。
Lambda 関数を作成して、タグ付けされた DB インスタンスを起動する
1. Lambda コンソールを開きます。
2. ナビゲーションペインで、[関数] を選択します。
3. [関数を作成] を選択します。
4. [Author from scratch] を選択します。
5. [関数名] に、関数の名前を入力します。
6. ランタイムには、[Python 3.7] を選択します。
7. アーキテクチャについては、デフォルトの選択である x86_64 のままにします。
8. [デフォルトの実行ロールの変更] を展開します。
9. [実行ロール] で、[既存のロールを使用する] を選択します。
10. **[既存のロール]**で、作成した IAM ロール を選択します。
11. [関数を作成] を選択します。
12. [コード] タブを選択します。
13. コードソースエディタで、サンプルコードを削除し、次のコードを入力します。
import boto3 rds = boto3.client('rds') def lambda_handler(event, context): #Start DB Instances dbs = rds.describe_db_instances() for db in dbs['DBInstances']: #Check if DB instance stopped. Start it if eligible. if (db['DBInstanceStatus'] == 'stopped'): try: GetTags=rds.list_tags_for_resource(ResourceName=db['DBInstanceArn'])['TagList'] for tags in GetTags: #if tag "autostart=yes" is set for instance, start it if(tags['Key'] == 'autostart' and tags['Value'] == 'yes'): result = rds.start_db_instance(DBInstanceIdentifier=db['DBInstanceIdentifier']) print ("Starting instance: {0}.".format(db['DBInstanceIdentifier'])) except Exception as e: print ("Cannot start instance {0}.".format(db['DBInstanceIdentifier'])) print(e) if __name__ == "__main__": lambda_handler(None, None)
14. [ファイル] を選択し、[保存] を選択して [展開] を選択します。
15. [設定] タブを選択し、[一般設定] を選択し、[編集] を選択します。
16. [タイムアウト] で、次のフィールドに値を入力します。
最小値として 0 を選択します。
秒単位では、10 を選択します。
17. [保存] を選択します。
タグ付けされた DB インスタンスを停止する Lambda 関数を作成する
タグ付き DB インスタンスを停止する Lambda 関数を作成するには、前のセクション「** Lambda 関数を作成してタグ付き DB インスタンスを起動する**」を参照してください。同じ手順を実行しますが、手順 12 には別のコードを使用します。
コードソースエディタで、サンプルコードを削除し、次のコードを入力します。
import boto3 rds = boto3.client('rds') def lambda_handler(event, context): #Stop DB instances dbs = rds.describe_db_instances() for db in dbs['DBInstances']: #Check if DB instance is not already stopped if (db['DBInstanceStatus'] == 'available'): try: GetTags=rds.list_tags_for_resource(ResourceName=db['DBInstanceArn'])['TagList'] for tags in GetTags: #if tag "autostop=yes" is set for instance, stop it if(tags['Key'] == 'autostop' and tags['Value'] == 'yes'): result = rds.stop_db_instance(DBInstanceIdentifier=db['DBInstanceIdentifier']) print ("Stopping instance: {0}.".format(db['DBInstanceIdentifier'])) except Exception as e: print ("Cannot stop instance {0}.".format(db['DBInstanceIdentifier'])) print(e) if __name__ == "__main__": lambda_handler(None, None)
機能テストを実行
停止状態のタグ付き DB インスタンスについては、次の手順を実行して機能テストを実行します。
1. [Lambda 関数] リストを開きます。
2. DB インスタンスを起動するために作成した関数を選択します。
3. [アクション] を選択して、[テスト] を選択します。
4. [テスト] タブの、[名前] のに、イベントの名前を入力します。
5. [変更を保存] を選択し、[テスト] を選択します。
スケジュールの作成
ルールを作成してスケジュールを設定できます。たとえば、タグ付けされた DBインスタンスの毎週のメンテナンス時間枠が日曜日 22:00 ~ 22:30 の場合、次のルールを作成できます。
- メンテナンスウィンドウが開始する 30 分前に DB インスタンスを自動的に起動します。
- メンテナンスウィンドウが終了してから 30 分後に DB インスタンスを自動的に停止します。
メンテナンス時間の 30 分前に DB インスタンスを自動的に起動するルールを作成するには、次の手順を実行します。
1. [Lambda 関数] リストを開きます。
2. DB インスタンスを起動するために作成した関数を選択します。
3. [関数の概要] で、[トリガーを追加] を選択します。
4. EventBridge (CloudWatch Events) を選択し、[新しいルールを作成] を選択します。
5. [ルール名] に、作成するルールの名前を入力します。
6. [スケジュール式] には、自動スケジュール用の cron 式を追加します (例: cron(30 21 ? * SUN *)).
7. [追加] を選択します。
同じ手順を使用して、メンテナンス時間の 30 分後に DB インスタンスを自動的に停止する別のルールを作成します。自動スケジュールのルール名とcron式を適宜変更してください (例:cron (00 23? \ * SUN *))。
関連情報
Amazon RDS に DB インスタンスの停止と起動を実装する

関連するコンテンツ
- 質問済み 5年前lg...
- 質問済み 4年前lg...
- AWS公式更新しました 7ヶ月前
- AWS公式更新しました 5ヶ月前