如何建立在 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 資料表。