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

最終更新日: 2020 年 2 月 6 日

特定のタスクを実行するために、別の AWS アカウントからロールを引き受けるには、AWS Lambda 関数が必要です。どうすれば設定できますか?

簡単な説明

あるアカウント (「アカウント A」) で作成した Lambda 関数に、別のアカウント (「アカウント B」) からロールを引き受けて Amazon Simple Storage Service (Amazon S3) バケットなどのリソースにアクセスする権限、またはインスタンスの起動や停止などのタスクを実行する権限を付与できます。詳細については、リソースベースのポリシーおよび AWS Lambda のリソースベースポリシーの使用を参照してください。

解決方法

まだ設定していない場合は、これらの 2 つの AWS Identity and Access Management (IAM) ロールを設定します。

  • 実行ロール – Lambda 関数にその作業を実行する権限を与える、アカウント A のプライマリロール。
  • 引き受けたロール – アカウント A の Lambda 関数がクロスアカウントリソースへのアクセスを取得すると、引き受けるアカウント B のロール。

その後、これらの指示通りに実行します。

1.    アカウント A の Lambda 関数の実行ロールに次の IAM ポリシーを添付して、アカウント B のロールを引き受けます。

注意: 222222222222 をアカウント B の 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"
    }
}

2.    アカウント B で引き受けたロールの信頼ポリシーを次のように変更します。

注意: 111111111111 をアカウント A の 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"
        }
    ]
}

3.    Lambda 関数コードを更新して AWS Security Token Service (AWS STS) の AssumeRole API 呼び出しを追加します。この呼び出しは、サービスクライアントの作成に使用できる一連の資格情報を返します。このクライアントを使用する場合、関数は引き受けたロールによって付与された権限を持ち、アカウント B に属しているかのように機能します。詳細については、AWS SDK for Python (Boto 3) ドキュメントの assume_role を参照してください。

次の Python 関数コードを、独自のユースケース例として使用できます。このコードは現状のまま提供されます。

注意: 222222222222 をアカウント B の AWS アカウント ID に置き換えます。role-on-source-account を引き受けるロールの名前に置き換えます。

import boto3

def lambda_handler(context, event):

    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"