Amazon Redshift에서 쿼리를 실행하는 AWS Lambda 함수를 생성하고 싶습니다.
해결 방법
사전 요구 사항
Lambda 함수를 만들기 전에 다음 Amazon Virtual Private Cloud(VPC) 엔드포인트를 설정해야 합니다.
- 프라이빗 서브넷으로 VPC를 생성합니다.
2. 서브넷 그룹을 생성합니다. 방금 생성한 VPC와 서브넷을 추가합니다.
-
프라이빗 Amazon Redshift 클러스터를 생성합니다.
방금 생성한 VPC 및 서브넷 그룹을 선택합니다.
-
AWS Secrets Manager를 사용하여 Amazon Redshift에 대한 새 시크릿을 만듭니다.
시크릿 이름을 redshift로 지정합니다.
Lambda 함수 만들기
Amazon Redshift 클러스터를 쿼리하는 Lambda 함수를 생성하려면 다음 단계를 따르세요.
1. Lambda 콘솔을 엽니다.
2. 함수 생성을 선택합니다.
- 처음부터 작성 옵션을 선택합니다.
4. 다음 필드를 업데이트합니다.
**함수 이름:**사용자 지정 이름을 입력합니다.
**런타임:**코드 환경을 입력합니다. (이 해결 방법의 예는 Python 3.9와 호환됩니다.)
**아키텍처:**시스템 아키텍처를 입력합니다. (이 해결 방법의 예는 x86_64와 호환됩니다.)
권한: 기본 Lambda 권한으로 새 역할 생성을 선택합니다.
5. 함수 생성을 선택합니다.
Lambda 함수에 대한 올바른 권한을 설정합니다.
- Lambda 콘솔에서 구성을 선택합니다.
2. 권한을 선택합니다.
3. Lambda 함수에 대해 생성된 역할을 선택합니다.
4. 권한 추가를 선택합니다.
5. 정책 첨부를 선택합니다.
- Lambda 실행 역할에 AmazonRedshiftDataFullAccess 및 SecretsManagerReadWrite 정책을 추가합니다.
참고: 작업을 수행하는 데 필요한 권한에 대해서만 최소 권한을 부여하는 것이 가장 좋습니다.
자세한 내용은 최소 권한 적용을 참조하세요.
Lambda 함수에 Python 코드 추가
-
Lambda 콘솔에서 코드를 선택합니다.
-
다음 코드를 코드 상자에 붙여넣습니다.
중요:
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 테이블을 만듭니다.