如何使用 Lambda 函數停止 Amazon RDS 執行個體超過七天?

3 分的閱讀內容
0

我想要使用 AWS Lambda 停止 Amazon Relational Database Service (Amazon RDS) 超過七天持續時間。

簡短說明

依預設,您一次最多可停止 Amazon RDS 資料庫執行個體七天。七天後,執行個體會重新啟動,因此不會錯過任何維護更新

若要停止執行個體超過七天,您可以使用 Step Functions 自動化工作流程,而不會錯過維護時段。

**注意:**如需替代解決方案,請參閱如何使用 Step Functions 停止 Amazon RDS 執行個體超過七天?

解決方法

設定 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 服務建立角色 (主控台)

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

1.    開啟 Amazon RDS 主控台

2.    在導覽窗格中,選擇資料庫

3.    選擇您想要自動啟動和停止的資料庫執行個體。

4.    在詳細資訊區段中,向下捲動至標籤區段。

5.    在標籤索引標籤下,選擇新增。針對標籤索引鍵,輸入自動啟動。針對,輸入。選擇新增以儲存變更。

6.    再次選擇新增。針對標籤索引鍵,輸入自動停止。針對,輸入。選擇新增以儲存變更。

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

建立 Lambda 函數以啟動已標記的資料庫執行個體

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.    選擇儲存

建立 Lambda 函數以停止已標記的資料庫執行個體

若要建立 Lambda 函數以停止已標記的資料庫執行個體,請參閱上一節建立 Lambda 函數以啟動已標記的資料庫執行個體。請遵循相同的步驟,但在步驟 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)

執行函數測試

對處於已停止狀態的已標記資料庫執行個體,請完成下列步驟以執行函數測試:

1.    開啟 Lambda 函數清單。

2.    選擇您建立的函數以啟動資料庫執行個體。

3.    選擇動作,然後選擇測試

4.    在測試索引標籤下,針對名稱,輸入事件的名稱。

5.    選擇儲存變更,然後選擇測試

建立排程

您可以建立規則來設定排程。例如,如果已標記資料庫執行個體的每週維護時段為星期日 22:00-22:30,則可以建立下列規則:

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

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

1.    開啟 Lambda 函數清單。

2.    選擇您建立的函數以啟動資料庫執行個體。

3.    在函數概觀下,選擇新增觸發器

4.    選擇 EventBridge (CloudWatch 事件),然後選取建立新規則

5.    針對規則名稱,輸入您想要建立之規則的名稱。

6.    針對排程運算式,請為自動化排程新增 Cron 運算式 (範例:cron(30 21 ? * SUN *))。

7.    選擇新增

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

相關資訊

在 Amazon RDS 中停止和啟動資料庫執行個體

使用 Amazon RDS 停止自動啟動的資料庫執行個體

如何停止 Amazon Aurora 叢集超過七天?

AWS 官方
AWS 官方已更新 1 年前