如何创建 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 表。