다른 계정의 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" ] } ] }
댓글 없음:
댓글 쓰기