跳至内容

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

2 分钟阅读
0

我想创建在 Amazon Redshift 上运行查询的 AWS Lambda 函数。

解决方案

**先决条件:**在创建 Lambda 函数之前,必须设置以下 Amazon Virtual Private Cloud 端点:

  1. 创建带有私有子网的 VPC
  2. 创建子网组。添加您刚刚创建的 VPC 和子网。
  3. 创建私有 Amazon Redshift 集群。选择您刚刚创建的 VPC 和子网组。
  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 函数设置正确的权限

在 Lambda 控制台中,选择 Configuration(配置)。

  1. 选择 Permissions(权限)。
  2. 选择为您的 Lambda 函数创建的角色。
  3. 选择 Add Permissions(添加权限)。
  4. 选择 Attach policies(附加策略)。
  5. AmazonRedshiftDataFullAccessSecretsManagerReadWrite 策略添加到您的 Lambda 执行角色

**注意:**最佳做法是只为执行任务所需的权限授予最低权限。有关详细信息,请参阅应用最低权限许可

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

  1. 在 Lambda 控制台中,选择 Code(代码)。
  2. 将以下代码粘贴到 Code(代码)框中:

重要事项:

  • 将“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 官方已更新 1 年前