Lambda 함수가 다른 AWS 계정의 IAM 역할을 수임하도록 구성하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2022년 2월 17일

다른 AWS 계정의 AWS Identity and Access Management(IAM) 역할을 수임하려면 AWS Lambda 함수가 필요합니다. 어떻게 설정해야 하나요?

간략한 설명

Lambda 함수가 다른 AWS 계정의 IAM 역할을 수임하게 하려면 다음을 수행하세요.

  1. Lambda 함수가 다른 AWS 계정의 IAM 역할을 수임하도록 함수의 실행 역할을 구성합니다.
  2. Lambda 함수가 역할을 수임하도록 교차 계정 IAM 역할의 신뢰 정책을 수정합니다.
  3. AWS Security Token Service(AWS STS) AssumeRole API 호출을 Lambda 함수의 코드에 추가합니다.

참고: Lambda 함수는 다음 중 하나를 수행하기 위해 다른 AWS 계정의 IAM 역할을 수임할 수 있습니다.

해결 방법

참고: 다음 예제 절차에서는 서로 다른 두 가지 유형의 AWS 계정을 참조합니다.

  • Lambda 함수를 호스트하는 홈 계정(111111111111)
  • Lambda 함수가 수임하는 IAM 역할을 포함하는 교차 계정(222222222222)

이 절차에서는 다음을 가정합니다.

  • 교차 계정(222222222222)에서 사용할 IAM 역할을 생성했음

Lambda 함수가 다른 AWS 계정의 IAM 역할을 수임하도록 함수의 실행 역할 구성

IAM 자격 증명 권한 추가 및 제거의 지침에 따라 Lambda 함수의 실행 역할(111111111111 계정 내)에 다음 정책 문을 추가합니다.

중요: 222222222222를 함수가 수임하는 교차 계정 역할AWS 계정 ID로 교체합니다. role-on-source-account를 위임된 역할의 이름으로 바꿉니다.

{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Action": "sts:AssumeRole",
        "Resource": "arn:aws:iam::222222222222:role/role-on-source-account"
    }
}

Lambda 함수가 역할을 수임하도록 교차 계정 IAM 역할의 신뢰 정책을 수정합니다.

역할 신뢰 정책 수정(콘솔)의 지침에 따라 교차 계정 IAM 역할의 신뢰 정책(222222222222 계정 내)에 다음 정책 문을 추가합니다.

중요: 111111111111을 Lambda 함수가 있는 계정의 AWS 계정 ID로 교체합니다. my-lambda-execution-role을 사용자 함수의 실행 역할 이름으로 교체합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111111111111:role/my-lambda-execution-role"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

AWS STS AssumeRole API 호출을 Lambda 함수의 코드에 추가

Lambda 함수 옵션 구성 지침에 따라 AWS STS AssumeRole API 호출을 함수의 코드에 추가합니다.

참고: AWS STS AssumeRole API 호출은 서비스 클라이언트를 생성하는 데 사용할 수 있는 자격 증명을 반환합니다. 이 서비스 클라이언트를 사용하면 수임된 역할에 의해 부여된 권한이 Lambda 함수에 부여됩니다. 자세한 내용은 AWS SDK for Python(Boto 3) 설명서의 assume_role을 참조하세요.

AWS STS AssumeRole API 호출을 포함하는 Python 함수 코드 예제

중요: 222222222222를 함수가 수임하는 교차 계정 역할의 AWS 계정 ID로 교체합니다. role-on-source-account를 위임된 역할의 이름으로 바꿉니다.

import boto3

def lambda_handler(event, context):

    sts_connection = boto3.client('sts')
    acct_b = sts_connection.assume_role(
        RoleArn="arn:aws:iam::222222222222: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, e.g. S3
    client = boto3.client(
        's3',
        aws_access_key_id=ACCESS_KEY,
        aws_secret_access_key=SECRET_KEY,
        aws_session_token=SESSION_TOKEN,
    )

    return "Hello from Lambda"