Lambda 関数を使用して Amazon RDS インスタンスを 7 日以上停止する方法を教えてください。
AWS Lambda を使用して、Amazon Relational Database Service (Amazon RDS) を 7 日以上停止したいと考えています。
簡単な説明
デフォルトでは、Amazon RDS データベースインスタンスを一度に最大 7日間停止することができます。7 日後、インスタンスはメンテナンスの更新を見逃さないように再起動します。
インスタンスを 7 日以上停止する場合は、Step Functions を使用してメンテナンス時間を逃さずにワークフローを自動化できます。
注: 別の解決策については、「ステップ機能を使用して Amazon RDS インスタンスを 7 日以上停止する方法を教えてください」を参照してください。
解決策
IAM アクセス許可を設定する
AWS Identity and Access Management (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 Aurora と RDS コンソールを開きます。
2. ナビゲーションペインで [データベース] をクリックします。
3. 自動的に起動および停止する DB インスタンスを選択します。
4. 詳細セクションで、[タグ] セクションまでスクロールします。
5. [タグ] タブで、[追加] をクリックします。[タグキー] に、autostart と入力します。[値] に、yes と入力します。[追加] をクリックして変更を保存します。
6. 再度**[追加]** をクリックします。[タグキー] に autostop と入力します。[値] に、yes と入力します。[追加] をクリックして変更を保存します。
詳細については、「Adding, listing, and removing tags」(タグの追加、一覧表示、削除) を参照してください。
Lambda 関数を作成してタグ付けされた DB インスタンスを起動する
1. Lambda コンソールを開きます。
2. ナビゲーションペインで、[関数] をクリックします。
3. [関数を作成] をクリックします。
4. [一から作成] をクリックします。
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 *))。
関連情報
Implementing DB instance stop and start in Amazon RDS (Amazon RDS に DB インスタンスの停止と起動を実装する)
Stopping an automatically started database instance with Amazon RDS (Amazon RDS で自動的に起動されたデータベースインスタンスを停止する)
This article was reviewed and updated on 2023-01-26.
関連するコンテンツ
質問済み 1年前
質問済み 2年前
AWS公式更新しました 10ヶ月前