7 日間を超える期間にわたって Amazon Aurora クラスターを停止するにはどうすればよいですか?

所要時間4分
0

7 日間を超える期間にわたって Amazon Relational Database Service (Amazon Aurora クラスター) を停止したいと考えています。

簡単な説明

Amazon Aurora クラスターは、数分以内に簡単に開始および停止できます。この機能は、常時実行している必要がないデータベースのコスト削減をサポートします。データベース (DB) クラスターは最大 7 日間まで停止できます。7 日間が経過した後に DB クラスターを手動で起動しない場合、DB クラスターは自動的に起動されます。これは、クラスターの必要なメンテナンス更新が遅れないようにするためです。

必要なメンテナンス更新を逃すことなく、Aurora クラスターを 7 日間を超える期間にわたって停止するには、次を実行します。

1.    AWS Identity Access Management (IAM) の許可を設定して、AWS Lambda が次のことを実行できるようにします。インスタンスを起動します。インスタンスを停止します。インスタンスに関する情報を取得します。

2.    自動的に開始および停止する Aurora クラスターのタグを追加します。

3.    Lambda 関数を作成してクラスターを起動します。

4.    Lambda 関数を作成してクラスターを停止します。

5.    次のことを実行するスケジュールを作成します。毎週のメンテナンスウィンドウの始めに Aurora クラスターを開始します。メンテナンスウィンドウの最後に Aurora クラスターを停止します。

解決方法

IAM 許可の設定

IAM ポリシーを作成して、Lambda がクラスターを開始および停止し、クラスターに関する情報を取得することを許可します。

1.    IAM コンソールを開きます。

2.    ナビゲーションペインで、[Policies] を選択します。

3.    [Create policy] (ポリシーを作成) を選択します。

4.    [JSON] タブを選択します。

5.    次のポリシーをコピーし、[JSON] タブの下にポリシーを貼り付けて、必要な IAM アクセス許可を付与します。

{
  "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.    [Next: Tags] (次のステップ: タグ) を選択します。

7.    (オプション) タグを追加するには、[Add tag] を選択し、[Key] および [Value - optional] フィールドに適切な値を入力します。

8.    [次へ: レビュー] を選択します。

9.    [ポリシーの確認] ページで、[名前] に ポリシーの名前を入力します。[Summary] セクションで、ポリシーによって付与されているアクセス許可を確認します。

10.    [Create policy] (ポリシーを作成) を選択します。

詳細については、「JSON タブでのポリシーの作成」を参照してください。

IAM ロールを作成し、必要なポリシーをアタッチする

1.    IAM コンソールを開きます。

2.    ナビゲーションペインで [Roles] を選択します。

3.    [ロールの作成] を選択します。

4.    [Select type of trusted entity] (信頼されたエンティティの種類を選択) で、[AWS service] (AWS のサービス) を選択します。

5.    [Or select a service to view its use cases] (または、サービスを選択してそのユースケースを表示) で、[Lambda] を選択します。

6.    [Next: Permissions] を選択します。

7.    [Filter-policies] で、前のセクションで作成したポリシーの名前を入力します。作成したポリシーが表示されたら、ポリシーを選択します。[Filter-policies] に、「AWSLambdaBasicExecutionRole」を入力します。作成した管理ポリシー「AWSLambdaBasicExecutionRole」が表示されたら、ポリシーを選択します。

8.    [Next: Tags (次の手順: タグ)] を選択します。

9.    (オプション) タグを追加するには、[Key] (キー) および [Value (optional)] (値 (オプション)) フィールドに適切な値を入力します。

10.    [Next: Review (次のステップ : レビュー)] を選択します。

11.    [Create role] (ロールの作成) ページの [Role name] (ロール名) で、作成するロールの名前を入力します。

12.    [Create role] (ロールの作成) を選択します。

詳細については、「AWS のサービス用ロールの作成 (コンソール)」を参照してください。

DB クラスターのタグを追加する

1.    Amazon RDS コンソールを開きます。

2.    ナビゲーションペインで、[Databases] (データベース) を選択します。

3.    自動的に開始および停止する DB クラスターを選択します。

4.    詳細セクションで、[Tags] (タグ) セクションまでスクロールします。

5.    [Tags] (タグ) タブで、[Add] (追加) を選択します。[Tag key] に「autostart」と入力します。[Value] に「yes」と入力します。[Add] (追加) を選択して変更を保存します。

6.    再度 [Add] (追加) を選択します。[Tag key] に「autostop」と入力します。[Value] に「yes」と入力します。[Add] を選択して変更を保存します。

詳細については、「タグの追加、一覧表示、および削除」をご参照ください。

Lambda 関数を作成してタグ付けされた DB インスタンスを起動する

1.    Lambda コンソールを開きます。

2.    ナビゲーションペインで [Functions] を選択します。

3.    [Create function] を選択します。

4.    [Author from scratch] を選択します。

5.    [Function-name] に関数の名前を入力します。

6.    [Runtime] で Python 3.7 を選択します。

7.    [アーキテクチャ] は、デフォルトの選択である「x86_64」のままにします。

7.    [Change default execution role] を展開します。

8.    [実行ロール] で [既存のロールを使用する] を選択します。

9.    [Existing role] で、前に作成した IAM ロールを選択します。

10.    [Create function] を選択します。

11.    [Code] タブを選択します。

12.    [Code source] エディタで、サンプルコードを削除し、次のコードを貼り付けます。

import boto3
rds = boto3.client('rds')

def lambda_handler(event, context):

    #Start DB clusters
    dbs = rds.describe_db_clusters()
    for db in dbs['DBClusters']:
        #Check if DB cluster stopped. Start it if eligible.
        if (db['Status'] == 'stopped'):
            doNotStart=1
            try:
                GetTags=rds.list_tags_for_resource(ResourceName=db['DBClusterArn'])['TagList']
                for tags in GetTags:
                #if tag "autostart=yes" is set for cluster, start it
                    if(tags['Key'] == 'autostart' and tags['Value'] == 'yes'):
                        result = rds.start_db_cluster(DBClusterIdentifier=db['DBClusterIdentifier'])
                        print ("Starting cluster: {0}.".format(db['DBClusterIdentifier']))
                if(doNotStart == 1):
                    doNotStart=1
            except Exception as e:
                print ("Cannot start cluster {0}.".format(db['DBClusterIdentifier']))
                print(e)
                

if __name__ == "__main__":
    lambda_handler(None, None)

13.    [File]、[Save] を選択した後、[Deploy] を選択します。

15.    [Configuration] タブ、[General configuration] を選択し、その後 [Edit] を選択します。

16.    [タイムアウト] で、次の操作を行います。[] に [0] を選択します。[] は [10] を選択します。17.    [保存] を選択します。

Lambda 関数を作成してタグ付けされた DB インスタンスを停止する

前のセクション「タグ付けされた DB クラスターを開始する Lambda 関数を作成する」で説明した手順に従って、タグ付き DB クラスターを停止します。次の変更を行う必要があります。

[Code source] (コードソース) エディタで、サンプルコードを削除し、次のコードを貼り付けます。

import boto3
rds = boto3.client('rds')

def lambda_handler(event, context):

    #Stop DB clusters
    dbs = rds.describe_db_clusters()
    for db in dbs['DBClusters']:
        #Check if DB cluster started. Stop it if eligible.
        if (db['Status'] == 'available'):
            doNotStop=1
            try:
                GetTags=rds.list_tags_for_resource(ResourceName=db['DBClusterArn'])['TagList']
                for tags in GetTags:
                #if tag "autostop=yes" is set for cluster, stop it
                    if(tags['Key'] == 'autostop' and tags['Value'] == 'yes'):
                        result = rds.stop_db_cluster(DBClusterIdentifier=db['DBClusterIdentifier'])
                        print ("Stopping cluster: {0}.".format(db['DBClusterIdentifier']))
                if(doNotStop == 1):
                    doNotStop=1
            except Exception as e:
                print ("Cannot stop cluster {0}.".format(db['DBClusterIdentifier']))
                print(e)
                

if __name__ == "__main__":
    lambda_handler(None, None)

関数テストを実行する

タグ付けされた DB クラスターが [Stopped] (停止) 状態であるとします。関数テストを実行するには、次を実行します。

1.    [Lambda functions] (Lambda 関数) リストを開きます。

2.    DB クラスターを起動するために作成した関数を選択します。

3.    [Actions]、[Test] の順にクリックします。

4.    [Test] (テスト) タブの [Name] (名前) で、イベントの名前を入力します。

5.    [Save changes] (変更を保存) を選択し、その後 [Test] (テスト) を選択します。

スケジュールを作成する

タグ付けされた DB クラスターの毎週のメンテナンスウィンドウが日曜日の午後 10 時~午後 10 時 30 分であるとします。スケジュールを設定するには、次についての 2 つのルールを作成します。

  • メンテナンスウィンドウが開始する 30 分前に DB クラスターを自動的に起動する
  • メンテナンスウィンドウが終了してから 30 分後に DB クラスターを自動的に停止する

メンテナンスウィンドウの 30 分前に DB インスタンスを自動的に起動するルールを作成するには、次を実行します。

1.    [Lambda functions] (Lambda 関数) リストを開きます。

2.    DB インスタンスを起動するために作成した関数を選択します。

3.    [Function overview] (関数の概要) で、[Add trigger] (トリガーを追加) を選択します。

4.    [EventBridge (CloudWatch Events)] を選択し、[Create a new rule] (新しいルールを作成) を選択します。

5.    [Rule name] (ルール名) で、作成するルールの名前を入力します。

6.    [Schedule Expression] (スケジュール式) で、自動スケジュールの cron 式を追加します (例: cron(30 21 ? * SUN *))。

7.    [Add] (追加) を選択します。

同じ手順を使用して、メンテナンスウィンドウの 30 分後に DB クラスターを自動的に停止する別のルールを作成します。必ず自動スケジュールのルール名と cron 式を適宜変更してください (例: cron(00 23 ? * SUN *))。


関連情報

How can I stop an Amazon RDS instance for longer than seven days? (7 日間を超える期間にわたって Amazon RDS インスタンスを停止する方法を教えてください)

AWS公式
AWS公式更新しました 2年前
コメントはありません