如何建立在 Amazon Redshift 中執行查詢的 AWS Lambda 函數?

上次更新日期:2022 年 3 月 11 日

我正在嘗試建立在 Amazon Redshift 中執行查詢的 AWS Lambda 函數。該如何進行?

解決方案

先決條件

在建立 Lambda 函數之前,必須設定以下 VPC 端點:

1.    建立具有私有子網路的 VPC

2.    建立子網路群組。新增剛建立的 VPC。

3.    建立私有 Amazon Redshift 叢集,選擇您剛建立的 VPC 和子網路群組。

4.    使用 AWS Secrets Manager 為 Amazon Redshift 建立新的密碼。命名您的密碼 "redshift"。

建立您的 Lambda 函數

若要建立用於查詢 Amazon Redshift 叢集的 Lambda 函數,請執行以下步驟:

1.    開啟 Lambda 主控台

2.    選擇 Create function (建立函數)。

3.    選擇 Author from scratch (從頭編寫) 選項。

4.    更新以下欄位:
函數名稱:輸入自訂名稱。
執行時間:輸入您的程式碼環境。(本文中的範例與 "Python 3.9" 相容。)
架構:進入您的系統架構。(本文中的範例與 "x86_64" 相容。)
權限:選擇 Create a new role with basic Lambda permissions (建立具有基本 Lambda 許可的新角色)。

5.    選擇 Create function (建立函數)。

為您的 Lambda 函數設定正確的許可

1.    在 Lambda 主控台中,選擇 Configuration (組態)。

2.    選擇 Permissions (許可)。

3.    選擇為 Lambda 函數建立的角色。

4.    選擇 Add Permissions (新增許可)。

5.    按一下 Attach policies (連接政策)。

6.    向您的 Lambda 執行角色新增 "AmazonRedshiftDataFullAccess" 和 "SecretsManagerReadWrite" 政策。

將 Python 程式碼新增到您的 Lambda 函數

1.    在 Lambda 主控台中,選擇 Code (程式碼)。

2.    將下面的程式碼黏貼到 Code (程式碼) 方塊中:

import json
import urllib.parse
import boto3
import botocore.session as bc

print('Loading function')

s3 = boto3.client('s3')


def lambda_handler(event, context):
    print("Entered lambda_handler")

    secret_name='redshift' ## HERE add the secret name created.
    session = boto3.session.Session()
    region = session.region_name
    
    client = session.client(
            service_name='secretsmanager',
            region_name=region
        )
    
    get_secret_value_response = client.get_secret_value(
            SecretId=secret_name
        )
    secret_arn=get_secret_value_response['ARN']
    
    secret = get_secret_value_response['SecretString']
    
    secret_json = json.loads(secret)
    
    cluster_id=secret_json['dbClusterIdentifier']
    
    
    bc_session = bc.get_session()
    
    session = boto3.Session(
            botocore_session=bc_session,
            region_name=region,
        )
    
    # Setup the client
    client_redshift = session.client("redshift-data")
    print("Data API client successfully loaded")
    
    query_str = "create table public.lambda_func (id int);"
                      
    print(query_str)
    
    res = client_redshift.execute_statement(Database= 'dev', SecretArn= secret_arn, Sql= query_str, ClusterIdentifier= cluster_id)
    id=res["Id"]

注意:如果您建立了名稱與 "redshift" 不同的密碼,請確保將 secret_name 取代為您的密碼名稱。

在此範例中,Lambda 連接到 Amazon Redshift 資料庫,並在公有結構描述中建立 lambda_func 資料表。


此文章是否有幫助?


您是否需要帳單或技術支援?