別の AWS アカウントで IAM ロールを引き受けるように Lambda 関数を設定するにはどうすればよいですか。

最終更新日: 2021 年 10 月 26 日

AWS Lambda 関数が別の AWS アカウントで AWS Identity and Access Management (IAM) ロールを引き受ける必要があります。設定するにはどうすればよいですか。

簡単な説明

Lambda 関数が別の AWS アカウントの IAM ロールを引き受けるようにするには、次の手順を実行します。

  1. 関数が別の AWS アカウントで IAM ロールを引き受けることを許可する Lambda 関数の実行ロールを設定します。
  2. クロスアカウントの IAM ロールのトラストポリシーを変更して、Lambda 関数がロールを引き受けられるようにします。
  3. AWS Security Token Service (AWS STS) AssumeRole API コールを Lambda 関数のコードに追加します。

注: Lambda 関数は、次のいずれかを実行するために、別の AWS アカウントで IAM ロールを引き受けることができます。

解決方法

注:以下の手順例では、2 つの異なるタイプの AWS アカウントを参照しています。

  • Lambda 関数 (111111111111) をホストするホームアカウントです。
  • Lambda 関数が想定する IAM ロール (222222222222) を含むクロスアカウントです。

関数が別の AWS アカウントで IAM ロールを引き受けることを許可する Lambda 関数の実行ロールを設定します。

IAM アイデンティティの許可の追加および削除の手順に従って、Lambda 関数の実行ロールに次のポリシーステートメントを追加します。

重要: 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"
    }
}

クロスアカウント IAM ロールの信頼ポリシーを変更して、Lambda 関数がロールを引き受けることを許可する

ロールの信頼ポリシーの変更 (コンソール) の手順に従って、クロスアカウント IAM ロールの信頼ポリシーに次のポリシーステートメントを追加します。

重要: 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 関数のコードに追加します。

コンソールでの関数の設定の手順に従って、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"