Amazon Redshift에서 쿼리를 실행하는 AWS Lambda 함수를 만들려고 합니다.
해결 방법
전제 조건: Amazon Virtual Private Cloud 엔드포인트를 설정하려면 다음 단계를 완료합니다.
- 프라이빗 서브넷이 있는 VPC를 만듭니다.
- 서브넷 그룹을 만듭니다. 방금 만든 VPC 및 서브넷을 추가합니다.
- 프라이빗 Amazon Redshift 클러스터를 만듭니다. 방금 만든 VPC 및 서브넷 그룹을 선택합니다.
- AWS Secrets Manager를 사용해 Amazon Redshift의 새 시크릿을 만듭니다. 시크릿 이름으로 redshift를 입력합니다.
Lambda 함수 만들기
Amazon Redshift 클러스터를 쿼리하는 Lambda 함수를 만들려면 다음 단계를 완료하십시오.
- Lambda 콘솔을 엽니다.
- Create function(함수 생성)을 선택합니다.
- Author from Scratch(처음부터 새로 작성) 옵션을 선택합니다.
- 다음 필드를 업데이트합니다.
Function name(함수 이름)에서 사용자 지정 이름을 입력합니다.
Runtime(런타임)에서 코드 환경을 입력합니다.
참고: 이 해결 방법의 예는 Python 3.9와 호환됩니다.
Architecture(아키텍처)에서 시스템 아키텍처를 입력합니다.
참고: 이 해결 방법의 예는 x86_64와 호환됩니다.
Permissions(권한)에서 Create a new role with basic Lambda permissions(기본 Lambda 권한으로 새 역할 생성)를 선택합니다.
- Create function(함수 생성)을 선택합니다.
Lambda 함수에 대한 권한 설정
다음 단계를 완료하십시오.
- Lambda 콘솔을 엽니다.
- Configuration(구성)을 선택합니다.
- Permissions(권한)를 선택합니다.
- Lambda 함수에 대해 만든 역할을 선택합니다.
- Add Permissions(권한 추가)를 선택합니다.
- Attach policies(정책 연결)를 선택합니다.
- Lambda 실행 역할에 AmazonRedshiftDataFullAccess 및 SecretsManagerReadWrite 정책을 추가합니다.
참고: 작업을 수행하는 데 필요한 권한에 대해서만 최소 권한을 부여하는 것이 좋습니다.
Lambda 함수에 Python 코드 추가
다음 예시에서는 Lambda가 Amazon Redshift 데이터베이스에 연결하여 퍼블릭 스키마에 lambda_func 테이블을 만듭니다.
다음 단계를 완료하십시오.
-
Lambda 콘솔을 엽니다.
-
Code(코드)를 선택합니다.
-
Code(코드) 상자에 다음 코드를 입력합니다.+
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)
참고: dev를 데이터베이스의 이름으로 바꾸십시오.
-
Lambda 함수의 구성 섹션에서 키 SecretId 및 secret_name에 대하여 환경 변수를 추가합니다.