2022년 3월 14일 월요일

[ Lambda ] 다른 계정의 IAM권한 사용


다른 계정의 IAM을 사용하여 

Lambda함수에서 다른계정의 S3, Athena, Glue 등을 컨트롤 

예제 : AAAA 계정의 람다함수를 통해 BBBB계정의 S3와 athena, glue테이블에 접근



[ 1 ] AAAA 계정에서 람다를 실행하는 iam role(my-lambda-etl-role)에 

AccessCrossIAMBBBB라는 정책을 생성한 후, 아래 스크립트 추가

(기존 role에 추가시 policy로 생성 후 연동)

{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Action": "sts:AssumeRole",
        "Resource": "arn:aws:iam::BBBB:role/bbbb-lambda-etl-role"
} }



[ 2 ] BBBB 계정에서 'bbbb-lambda-etl-role' im role에 

신뢰 관계 탭에서 아래 스크립트 추가

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::AAAA:role/service-role/aaaa-lambda-etl-role"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

권한 탭에서 AAAA계정이 접근할 서비스 추가 (S3, Athena, Glue)




[ 3 ] AAAA계정의 lambda에서 코드 작성

# 샘플코드

def lambda_handler(event, context):
    print('start function')

    sts_connection = boto3.client('sts')
    acct_b = sts_connection.assume_role(
        RoleArn="arn:aws:iam::BBBB:role/role-on-source-account",
        RoleSessionName="cross_acct_lambda"
    )

    ACCESS_KEY = acct_b['Credentials']['AccessKeyId']
    SECRET_KEY = acct_b['Credentials']['SecretAccessKey']
    SESSION_TOKEN = acct_b['Credentials']['SessionToken']


    # create service client using the assumed role credentials
    session = boto3.Session(
        aws_access_key_id=ACCESS_KEY,
        aws_secret_access_key=SECRET_KEY,
        aws_session_token=SESSION_TOKEN,
    )



[ 4 ] LakeFormation 사용시

각 계정에서 role에 대한 table/location 공유설정


[ 5 ] 참조하는 BBBB계정의 S3 권한 설정

버킷->권한->버킷정책

{ "Version": "2012-10-17", "Statement": [ { "Sid": "DelegateS3Access", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AAAA:root" }, "Action": "s3:*", "Resource": [ "arn:aws:s3:::my-bucket-name/*", "arn:aws:s3:::my-bucket-name" ] } ] }




참조 : 
https://aws.amazon.com/ko/premiumsupport/knowledge-center/lambda-function-assume-iam-role/?nc1=h_ls

댓글 없음:

댓글 쓰기