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

2 分的閱讀內容
0

我想建立在 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.   將 AmazonRedshiftDataFullAccessSecretsManagerReadWrite 政策新增至您的 Lambda 執行角色

**注意:**最佳實務是僅授予執行任務所需的最低權限許可。如需詳細資訊,請參閱套用最低權限許可

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

1.   在 Lambda 主控台,選擇程式碼

2.   將下列程式碼貼到程式碼方塊:

重要事項:

  • 將 "dev" 替換為您資料庫的名稱。
  • 在 Lambda 函數組態區段為索引鍵 SecretIdsecret_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 資料表。

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