如何讓 Amazon RDS 執行個體停止超過七天?

上次更新日期:2021-10-18

我想讓 Amazon Relational Database Service (Amazon RDS) 停止超過為期七天的時間。

簡短描述

只要幾分鐘的時間,就可以輕鬆地啟動和停止 Amazon RDS 執行個體。此功能可讓您從不需要一直執行的資料庫省下成本。您最多可以讓資料庫執行個體停止七天。七天之後,如果您未手動啟動資料庫執行個體,該執行個體便會自動啟動。正因如此,所以執行個體不會錯過硬體、基礎作業系統或資料庫引擎版本的任何必要維護更新。

若要讓 RDS 執行個體停止超過七天又不會錯過必要的維護更新,請執行下列動作:

  1. 設定 AWS Identity Access Management (IAM) 許可,允許 AWS Lambda 執行以下作業:啟動執行個體。停止執行個體。擷取執行個體的相關資訊。
  2. 為您要自動啟動和停止的 RDS 執行個體新增標籤。
  3. 建立用來啟動資料庫執行個體的 Lambda 函數。
  4. 建立用來停止資料庫執行個體的 Lambda 函數。
  5. 建立排程以執行下列作業:在每週維護時段開始時啟動資料庫執行個體。在維護時段結束時停止資料庫執行個體。

解決方案

設定 IAM 許可

建立 IAM 政策以允許 Lambda 啟動和停止執行個體,並擷取執行個體的相關資訊。

1.    開啟 IAM 主控台

2.    在導覽窗格中,選擇政策

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.    選擇 Next: Review (下一步:檢閱)

9.    在 Review policy (檢閱政策) 頁面上,於 Name (名稱) 中輸入政策的名稱。檢閱 Summary (摘要) 區段,以查看政策所授與的許可。

10.    選擇 Create policy (建立政策)

如需詳細資訊,請參閱在 JSON 標籤上建立政策

建立 IAM 角色,然後連接所需政策

  1. 開啟 IAM 主控台
  2. 在導覽窗格中,選擇 Roles (角色)
  3. 選擇 Create role (建立角色)
  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 服務的角色 (主控台)

新增資料庫執行個體的標籤

  1. 開啟 Amazon RDS 主控台
  2. 在導覽窗格中,選擇 Databases (資料庫)
  3. 選擇您要自動啟動和停止的資料庫執行個體。
  4. 在詳細資料區段中,向下捲動至 Tags (標籤) 區段。
  5. Tags (標籤) 標籤下,選擇 Add (新增)。在 Tag key (標籤鍵) 中,輸入自動啟動。在 Value (值) 中,輸入。選擇 Add (新增) 以儲存變更。
  6. 再次選擇 Add (新增)。在 Tag key (標籤鍵) 中,輸入自動停止。在 Value (值) 中,輸入。選擇 Add (新增) 以儲存變更。

如需詳細資訊,請參閱新增、列出和移除標籤

建立用來啟動已加上標籤的資料庫執行個體的 Lambda 函數

1.    開啟 Lambda 主控台

2.    在導覽窗格中,選擇 Functions (函數)

3.    選擇 Create function (建立函數)

4.    選擇 Author from scratch (從頭編寫)

5.    在 Function name (函數名稱) 中,輸入函數的名稱。

6.    在 Runtime (執行時間) 中,選取 Python 3.7

7.    在 Architecture (架構) 中,保留預設選取的 x86_64

7.    展開 Change default execution role (變更預設執行角色)

8.    在 Execution role (執行角色) 中,選擇 Use an existing role (使用現有的角色)

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 Instances
    dbs = rds.describe_db_instances()
    for db in dbs['DBInstances']:
        #Check if DB instance stopped. Start it if eligible.
        if (db['DBInstanceStatus'] == 'stopped'):
            doNotStart=1
            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']))
                if(doNotStart == 1):
                    doNotStart=1
            except Exception as e:
                print ("Cannot start instance {0}.".format(db['DBInstanceIdentifier']))
                print(e)
                

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

13.    選擇 File (檔案)、選擇 Save (儲存),然後選擇 Deploy (部署)

15.    選擇 Configuration (組態) 標籤、選擇 General configuration (一般組態),然後選擇 Edit (編輯)

16.    在 Timeout (逾時) 下,執行下列作業:於 min (分) 中選取 0。於 sec (秒) 中選取 10。17.    選擇 Save (儲存)

建立用來停止已加上標籤的資料庫執行個體的 Lambda 函數

若要建立用來停止已加上標籤的資料庫執行個體的 Lambda 函數,請使用上一節建立用來啟動已加上標籤的資料庫執行個體的 Lambda 函數中的指示,並進行下列變更:

Code source (程式碼來源) 編輯器中,刪除範例程式碼並貼上下列程式碼:

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'):
            DoNotStop=1
            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']))
                if(DoNotStop == 1):
                    DoNotStop=1
            except Exception as e:
                print ("Cannot stop instance {0}.".format(db['DBInstanceIdentifier']))
                print(e)
                
if __name__ == "__main__":
    lambda_handler(None, None)

執行函數測試

假設已加上標籤的資料庫執行個體處於 Stopped (已停止) 狀態。若要執行函數測試,請執行下列作業:

  1. 開啟 Lambda 函數清單。
  2. 選擇您所建立來啟動資料庫執行個體的函數
  3. 選擇 Actions (動作),然後選擇 Test (測試)
  4. Test (測試) 標籤下,於 Name (名稱) 中輸入事件的名稱。
  5. 選擇 Save changes (儲存變更),然後選擇 Test (測試)

建立排程

假設已加上標籤的資料庫執行個體每週維護時段為星期日 22:00 - 22:30。您可以為下列事件建立兩個規則來設定排程:

  • 在維護時段開始前 30 分鐘自動啟動資料庫執行個體
  • 在維護時段結束後 30 分鐘自動停止資料庫執行個體

若要建立規則以在維護時段開始前 30 分鐘自動啟動資料庫執行個體,請執行下列步驟:

  1. 開啟 Lambda 函數清單。
  2. 選擇您所建立來啟動資料庫執行個體的函數。
  3. Function overview (函數概觀) 下,選擇 Add trigger (新增觸發)
  4. 選取 EventBridge (CloudWatch Events) EventBridge (CloudWatch 事件),然後選取 Create a new rule (建立新規則)
  5. Rule name (規則名稱) 中,輸入所要建立規則的名稱。
  6. Schedule Expression (排程表達式) 中,為自動的排程新增 cron 表達式 (範例:cron(30 21 ? * SUN *))。
  7. 選擇 Add (新增)

使用相同指示建立另一個規則,以便在維護時段結束 30 分鐘後自動停止資料庫執行個體。請務必相應地變更自動排程的規則名稱和 cron 運算式 (範例:cron(00 23 ? * SUN *))。