如何建立在 Amazon Redshift 執行查詢的 AWS Lambda 函數?
我想建立在 Amazon Redshift 執行查詢的 AWS Lambda 函數。
解決方案
先決條件
在建立 Lambda 函數之前,您必須先設定下列 Amazon Virtual Private Cloud (Amazon VPC) 端點:
1. 建立具有私有子網路的 VPC。
2. 建立子網路群組。新增您剛才建立的 VPC 和子網路。
3. 建立私有 Amazon Redshift 叢集。選取您剛才建立的 VPC 和子網路群組。
4. 使用 AWS Secrets Manager 為 Amazon Redshift 建立新的祕密。將您的祕密命名為 redshift。
建立您的 Lambda 函數
若要建立 Lambda 函數以查詢 Amazon Redshift 叢集,請依照下列步驟執行:
1. 開啟 Lambda 主控台。
2. 選擇建立函數。
3. 選擇從頭開始撰寫選項。
4. 更新下列欄位:
**函數名稱:**輸入自訂名稱。
**執行期:**輸入您的程式碼環境。(此解決方案的範例與 Python 3.9 相容。)
**架構:**輸入您的系統架構。(此解決方案的範例與 x86_64 相容。)
許可:選擇使用基本 Lambda 許可建立新角色。
5. 選擇建立函數。
為您的 Lambda 函數設定正確的許可
1. 在 Lambda 主控台,選擇組態。
2. 選擇許可。
3. 選擇為您的 Lambda 函數建立的角色。
4. 選擇新增許可。
5. 選擇連接政策。
6. 將 AmazonRedshiftDataFullAccess 和 SecretsManagerReadWrite 政策新增至您的 Lambda 執行角色。
**注意:**最佳實務是僅授予執行任務所需的最低權限許可。如需詳細資訊,請參閱套用最低權限許可。
將 Python 程式碼新增到您的 Lambda 函數
1. 在 Lambda 主控台,選擇程式碼。
2. 將下列程式碼貼到程式碼方塊:
重要事項:
- 將 "dev" 替換為您資料庫的名稱。
- 在 Lambda 函數組態區段為索引鍵 SecretId 和 secret_name 新增環境變數。
import os import json import boto3 import botocore import botocore.session as bc from botocore.client import Config print('Loading function') secret_name=os.environ['SecretId'] # getting SecretId from Environment varibales session = boto3.session.Session() region = session.region_name # Initializing Secret Manager's client 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'] # Initializing Botocore client bc_session = bc.get_session() session = boto3.Session( botocore_session=bc_session, region_name=region ) # Initializing Redshift's client config = Config(connect_timeout=5, read_timeout=5) client_redshift = session.client("redshift-data", config = config) def lambda_handler(event, context): print("Entered lambda_handler") query_str = "create table public.lambda_func (id int);" try: result = client_redshift.execute_statement(Database= 'dev', SecretArn= secret_arn, Sql= query_str, ClusterIdentifier= cluster_id) print("API successfully executed") except botocore.exceptions.ConnectionError as e: client_redshift_1 = session.client("redshift-data", config = config) result = client_redshift_1.execute_statement(Database= 'dev', SecretArn= secret_arn, Sql= query_str, ClusterIdentifier= cluster_id) print("API executed after reestablishing the connection") return str(result) except Exception as e: raise Exception(e) return str(result)
在此範例,Lambda 連線至 Amazon Redshift 資料庫,並在公有結構描述建立 lambda_func 資料表。
相關內容
- 已提問 8 個月前lg...
- 已提問 2 個月前lg...
- 已提問 8 個月前lg...
- 已提問 9 個月前lg...
- AWS 官方已更新 1 年前
- AWS 官方已更新 3 年前
- AWS 官方已更新 3 年前
- AWS 官方已更新 1 年前