AWS re:Postを使用することにより、以下に同意したことになります 利用規約

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

所要時間2分
0

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) を含むクロスアカウントです。

この手順では、以下を前提としています。

  • クロスアカウントで使用する IAM ロールが作成されていること (222222222222)

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

IAM アイデンティティの許可の追加および削除」の手順に従って、(アカウント 111111111111 で) 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 関数がロールを引き受けることを許可する

ロールの信頼ポリシーの変更 (コンソール)」の手順に従って、(アカウント 222222222222 で) クロスアカウント 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 関数のコードに追加する

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"

関連情報

AWS Lambda のリソースベースのポリシーを使用する

AWS Lambda 許可

IAM ロール (AWS API) に切り替える

IAM ロールのトラブルシューティング

Python による Lambda 関数のビルド

AWS公式
AWS公式更新しました 1年前
コメントはありません

関連するコンテンツ