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

2분 분량
0

Amazon Redshift에서 쿼리를 실행하는 AWS Lambda 함수를 생성하고 싶습니다.

해결 방법

사전 요구 사항

Lambda 함수를 만들기 전에 다음 Amazon Virtual Private Cloud(VPC) 엔드포인트를 설정해야 합니다.

  1. 프라이빗 서브넷으로 VPC를 생성합니다.

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

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

  2. AWS Secrets Manager를 사용하여 Amazon Redshift에 대한 새 시크릿을 만듭니다. 시크릿 이름을 redshift로 지정합니다.

Lambda 함수 만들기

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

1.    Lambda 콘솔을 엽니다.

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

  1. 처음부터 작성 옵션을 선택합니다.

4.    다음 필드를 업데이트합니다.
**함수 이름:**사용자 지정 이름을 입력합니다.
**런타임:**코드 환경을 입력합니다. (이 해결 방법의 예는 Python 3.9와 호환됩니다.)

**아키텍처:**시스템 아키텍처를 입력합니다. (이 해결 방법의 예는 x86_64와 호환됩니다.)

권한: 기본 Lambda 권한으로 새 역할 생성을 선택합니다.

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

Lambda 함수에 대한 올바른 권한을 설정합니다.

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

2.    권한을 선택합니다.

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

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

5.    정책 첨부를 선택합니다.

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

참고: 작업을 수행하는 데 필요한 권한에 대해서만 최소 권한을 부여하는 것이 가장 좋습니다. 자세한 내용은 최소 권한 적용을 참조하세요.

Lambda 함수에 Python 코드 추가

  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 공식업데이트됨 일 년 전
댓글 없음

관련 콘텐츠