교차 계정 Lambda 함수를 생성하여 다른 계정의 Amazon Redshift에 액세스하려면 어떻게 해야 합니까?

4분 분량
0

교차 계정 AWS Lambda 함수를 생성하여 다른 AWS 계정에 있는 Amazon Redshift에 액세스하려고 합니다.

해결 방법

Amazon Redshift 계정에 VPC, 서브넷 그룹, 프라이빗 Amazon Redshift 클러스터 생성

Amazon Redshift 계정에서 다음 단계를 완료하십시오.

  1. 프라이빗 서브넷을 사용하여 가상 프라이빗 클라우드(VPC)를 생성합니다.
  2. 클러스터 서브넷 그룹을 생성한 다음, VPC와 서브넷을 해당 클러스터 서브넷 그룹에 추가합니다.
  3. 프라이빗 Amazon Redshift 클러스터를 생성한 다음, VPC와 클러스터 서브넷 그룹을 해당 클러스터에 추가합니다.
  4. Amazon Redshift 함수에 대해 AWS Secrets Manager 콘솔을 사용하여 암호를 생성한 다음, 암호에 이름을 지정합니다.
  5. Lambda가 Amazon Redshift에 액세스할 수 있도록 AWS Identity and Access Management(IAM) 역할을 생성합니다. 다음 예에서 역할의 이름은 cross-account-child로 지정되었습니다.
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "VisualEditor0",
                "Effect": "Allow",
                "Action": [
                    "secretsmanager:*",
                    "redshift-data:*",
                    "kms:*",
                    "redshift:*",
                    "sts:*"
                ],
                "Resource": "*"
            }
        ]
    }
    중요: IAM 정책을 만들 때는 특정 작업을 수행하는 데 필요한 권한만 부여하는 것이 좋습니다. 자세한 내용은 최소 권한 적용을 참조하십시오.
  6. Lambda 계정의 역할이 Amazon Redshift 계정에서 해당 역할을 맡을 수 있도록 신뢰 관계를 생성합니다.
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::Account_B:role/lambdaArticle"
                },
                "Action": "sts:AssumeRole"
            },
            {
                "Effect": "Allow",
                "Principal": {
                    "Service": "redshift.amazonaws.com"
                },
                "Action": "sts:AssumeRole"
            }
        ]
    }
    참고: 위 예제에서 Account_B를 Lambda 계정 번호로 바꾸십시오. 또한 신뢰 관계를 사용하면 Lambda가 동일한 계정에서 Amazon Redshift에 액세스할 수 있습니다.

Lambda 계정에서 신뢰 관계 및 IAM 정책 생성

Lambda 계정에서 다음 단계를 완료하십시오.

  1. Lambda 계정의 역할이 Amazon Redshift 계정에서 역할을 맡을 수 있도록 신뢰 관계를 생성합니다.

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Service": [
                        "redshift.amazonaws.com",
                        "lambda.amazonaws.com"
                    ]
                },
                "Action": "sts:AssumeRole"
            },
            {
                "Sid": "AssumeRole",
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::Account_A:role/cross-account-child"
                },
                "Action": "sts:AssumeRole"
            }
        ]
    }

    참고: Account_A를 Amazon Redshift 계정 번호로 바꾸십시오. 또한 신뢰 관계를 사용하면 Lambda가 Amazon Redshift에 액세스할 수 있습니다.

  2. 다음 권한을 가진 IAM 정책을 생성합니다.

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "VisualEditor0",
                "Effect": "Allow",
                "Action": [
                    "secretsmanager:*",
                    "redshift-data:*",
                    "kms:*",
                    "redshift:*",
                    "sts:*"
                ],
                "Resource": "*"
            }
        ]
    }
  3. AWSLambdaVPCAccessExecutionRole 관리형 정책을 Lambda 역할에 추가합니다.

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. **Code(코드)**를 선택합니다.
  6. Code(코드) 상자에 다음 Lambda 코드를 입력합니다.
    Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
    
    Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so.
    
    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR APARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTIONOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    
    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']
    
    def lambda_handler(event, context):
        sts_connection = boto3.client('sts')
        acct_b = sts_connection.assume_role(
            RoleArn="arn:aws:iam::Account_A:role/cross-account-child",  
            RoleSessionName="cross_acct_lambda"
        )
    
        ACCESS_KEY = acct_b['Credentials']['AccessKeyId']
        SECRET_KEY = acct_b['Credentials']['SecretAccessKey']
        SESSION_TOKEN = acct_b['Credentials']['SessionToken']
    
        client = boto3.client(
            'secretsmanager',
            aws_access_key_id=ACCESS_KEY,
            aws_secret_access_key=SECRET_KEY,
            aws_session_token=SESSION_TOKEN,
        )
    
        get_secret_value_response = client.get_secret_value(
            SecretId=secret_name
         )
    
        secret_arn=get_secret_value_response['ARN']
        print(secret_arn)
        secret = get_secret_value_response['SecretString']
        print(secret)
        secret_json = json.loads(secret)
        cluster_id=secret_json['dbClusterIdentifier']
        print(cluster_id)
    
        rsd = boto3.client(
            'redshift-data',
            aws_access_key_id=ACCESS_KEY,
            aws_secret_access_key=SECRET_KEY,
            aws_session_token=SESSION_TOKEN,
        )
        resp = rsd.execute_statement(
        SecretArn=secret_arn,
        ClusterIdentifier=cluster_id,
        Database="dev",          
        Sql="create table public.lambda_func (id int);")
        return "Hello from Lambda"
    참고: dev를 데이터베이스 이름으로 바꿉니다. Lambda 함수의 구성 섹션에 SecretId 환경 변수를 추가합니다. RoleArn에는 Amazon Redshift 계정의 암호 ARN을 추가합니다. create table public.lambda_func는 응답을 받기 위해 실행하려는 쿼리로 바꿉니다.
AWS 공식
AWS 공식업데이트됨 일 년 전