다른 계정의 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"
]
}
]
}
참조 :
'Platform > AWS' 카테고리의 다른 글
AWS - Lakeformaiton 설정 (0) | 2023.03.31 |
---|---|
AWS - 다른 계정의 S3로 Lambda trigger 설정 (0) | 2023.03.27 |
AWS - CloudWatch Event를 통한 Lambda Trigger 생성 (0) | 2023.03.27 |
AWS - Shell Script로 EC2 생성 후 코드 실행 (0) | 2023.03.26 |
AWS - S3 수명주기 관리 (0) | 2023.03.26 |