我想创建在 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 表。