如何创建在 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 表。
相关内容
- AWS 官方已更新 1 年前
- AWS 官方已更新 3 年前
- AWS 官方已更新 1 年前
- AWS 官方已更新 3 年前