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 함수 생성

Amazon Redshift 클러스터를 쿼리하는 Lambda 함수를 생성하려면 다음 단계를 따르세요.

1.    Lambda 콘솔을 엽니다.

2.    **Create function(함수 생성)**을 선택합니다.

3.    Author from Scratch 옵션을 선택합니다.

4.    다음의 필드를 작성합니다.
함수 이름: 사용자 지정 이름을 입력합니다.
런타임: 코드 환경을 입력합니다. (이 해결 방법의 예제는 Python 3.9와 호환됩니다.)
아키텍처: 시스템 아키텍처를 입력합니다. (이 해결 방법의 예제는 x86_64와 호환됩니다.)
권한: **기본 Lambda 권한으로 새 역할 생성(Create a new role with basic Lambda permissions)**을 선택합니다.

5.    함수 생성을 선택합니다.

Lambda 함수에 대한 올바른 권한 설정

1.    Lambda 콘솔에서 구성을 선택합니다.

2.    권한을 선택합니다.

3.    Lambda 함수에 대해 생성된 역할을 선택합니다.

4.    권한 추가를 선택합니다.

5.    정책 연결을 선택합니다.

6.    Lambda 실행 역할AmazonRedshiftDataFullAccessSecretsManagerReadWrite 정책을 추가합니다.

Lambda 함수에 Python 코드 추가

1.    Lambda 콘솔에서 코드를 선택하십시오.

2.    다음 코드를 코드 상자에 붙여 넣습니다.

import os
import json
import boto3
import botocore.session as bc
from botocore.client import Config

print('Loading function')

# Fetching SecretId from Environment variables
secret_name=os.environ['SecretId'] 
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 restablshing the connection")
        return str(result)
        
    except Exception as e:
        raise Exception(e)
        
    return str(result)

참고: Lambda 함수의 구성 섹션에 키 SecretIDsecret_name에 대한 환경 변수를 추가해야 합니다.

이 예시에서 Lambda는 Amazon Redshift 데이터베이스에 연결하고 퍼블릭 스키마에 lambda_func 테이블을 생성합니다.


AWS 공식
AWS 공식업데이트됨 2달 전