내용으로 건너뛰기

Amazon Redshift에서 쿼리를 실행하는 AWS Lambda 함수를 어떻게 만듭니까?

3분 분량
0

Amazon Redshift에서 쿼리를 실행하는 AWS Lambda 함수를 만들려고 합니다.

해결 방법

전제 조건: Amazon Virtual Private Cloud 엔드포인트를 설정하려면 다음 단계를 완료합니다.

  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. 다음 필드를 업데이트합니다.
    Function name(함수 이름)에서 사용자 지정 이름을 입력합니다.
    Runtime(런타임)에서 코드 환경을 입력합니다.
    참고: 이 해결 방법의 예는 Python 3.9와 호환됩니다.
    Architecture(아키텍처)에서 시스템 아키텍처를 입력합니다.
    참고: 이 해결 방법의 예는 x86_64와 호환됩니다.
    Permissions(권한)에서 Create a new role with basic Lambda permissions(기본 Lambda 권한으로 새 역할 생성)를 선택합니다.
  5. Create function(함수 생성)을 선택합니다.

Lambda 함수에 대한 권한 설정

다음 단계를 완료하십시오.

  1. Lambda 콘솔을 엽니다.
  2. Configuration(구성)을 선택합니다.
  3. Permissions(권한)를 선택합니다.
  4. Lambda 함수에 대해 만든 역할을 선택합니다.
  5. Add Permissions(권한 추가)를 선택합니다.
  6. Attach policies(정책 연결)를 선택합니다.
  7. Lambda 실행 역할AmazonRedshiftDataFullAccessSecretsManagerReadWrite 정책을 추가합니다.
    참고: 작업을 수행하는 데 필요한 권한에 대해서만 최소 권한을 부여하는 것이 좋습니다.

Lambda 함수에 Python 코드 추가

다음 예시에서는 Lambda가 Amazon Redshift 데이터베이스에 연결하여 퍼블릭 스키마에 lambda_func 테이블을 만듭니다.

다음 단계를 완료하십시오.

  1. Lambda 콘솔을 엽니다.

  2. Code(코드)를 선택합니다.

  3. 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를 데이터베이스의 이름으로 바꾸십시오.

  4. Lambda 함수의 구성 섹션에서 키 SecretIdsecret_name에 대하여 환경 변수를 추가합니다.

AWS 공식업데이트됨 6달 전
1 댓글

This article was reviewed and updated on 2026-03-31.

전문가

답글을 게시함 13일 전