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

2 分钟阅读
0

我想创建在 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.    将 AmazonRedshiftDataFullAccessSecretsManagerReadWrite 策略添加到您的 Lambda 执行角色

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

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

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

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

重要事项:

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