如何创建 AWS Lambda 函数以在 Amazon Redshift 中运行查询?

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

我正在尝试创建 AWS Lambda 函数以在 Amazon Redshift 中运行查询。我该如何操作?

解决方法

先决条件

在创建 Lambda 函数之前,您必须设置以下 VPC 终端节点:

1.    创建带有私有子网的 VPC

2.    创建子网组。添加您刚才创建的 VPC。

3.    选择您刚才创建的 VPC 和子网组,创建私有 Amazon Redshift 集群

4.    使用 AWS Secrets Manager 为 Amazon Redshift 创建新密钥。将您的密钥命名为“redshift”。

创建 Lambda 函数

创建 Lambda 函数以查询 Amazon Redshift 集群,请执行以下步骤:

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.    将“AmazonRedshiftDataFullAccess”和“SecretsManagerReadWrite”策略添加到您的 Lambda 执行角色

将 Python 代码添加到您的 Lambda 函数

1.    在 Lambda 控制台中,选择 Code (代码)

2.    将以下代码粘贴到代码框中:

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 表。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?