Amazon Redshift에서 쿼리를 실행하는 AWS Lambda 함수를 생성하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2022년 3월 11일

Amazon Redshift에서 쿼리를 실행하는 AWS Lambda 함수를 생성하려고 합니다. 어떻게 해야 합니까?

해결 방법

사전 요구 사항

Lambda 함수를 생성하기 전에 다음 VPC 엔드포인트를 설정해야 합니다.

1.    프라이빗 서브넷을 가지는 VPC를 생성합니다.

2.    서브넷 그룹을 생성합니다. 방금 생성한 VPC를 추가합니다.

3.    방금 생성한 VPC와 서브넷 그룹을 선택하여 프라이빗 Amazon Redshift 클러스터를 생성합니다.

4.    AWS Secrets Manager를 사용하여 Amazon Redshift에 대한 새 시크릿을 생성합니다. 시크릿의 이름을 "redshift"라고 정하십시오.

Lambda 함수 생성

Amazon Redshift 클러스터를 쿼리하는 Lambda 함수를 생성하려면 다음 단계를 수행합니다.

1.    Lambda 콘솔을 엽니다.

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

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 실행 역할에 "AmazonRedshiftDataFullAccess" and "SecretsManagerReadWrite" 정책을 추가합니다.

Lambda 함수에 Python 코드 추가

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

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

import json
import urllib.parse
import boto3
import botocore.session as bc

print('Loading function')

s3 = boto3.client('s3')


def lambda_handler(event, context):
    print("Entered lambda_handler")

    secret_name='redshift' ## HERE add the secret name created.
    session = boto3.session.Session()
    region = session.region_name
    
    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']
    
    
    bc_session = bc.get_session()
    
    session = boto3.Session(
            botocore_session=bc_session,
            region_name=region,
        )
    
    # Setup the client
    client_redshift = session.client("redshift-data")
    print("Data API client successfully loaded")
    
    query_str = "create table public.lambda_func (id int);"
                      
    print(query_str)
    
    res = client_redshift.execute_statement(Database= 'dev', SecretArn= secret_arn, Sql= query_str, ClusterIdentifier= cluster_id)
    id=res["Id"]

참고: 이름이 “redshift”가 아닌 시크릿을 생성한 경우 시크릿 이름을 secret_name으로 바꿔야 합니다.

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


이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요하세요?