如何設定 Lambda 函數在另一個 AWS 帳戶中擔任 IAM 角色?

2 分的閱讀內容
0

我希望 AWS Lambda 函數在另一個 AWS 帳戶中擔任 AWS Identity and Access Management (IAM) 角色。

簡短描述

若要讓 Lambda 函數在另一個帳戶中擔任 IAM 角色,請完成下列步驟:

  1. 設定 Lambda 函數的執行角色,以允許該函數在另一個 AWS 帳戶中擔任 IAM 角色。
  2. 修改跨帳戶 IAM 角色的信任政策,以允許 Lambda 函數擔任此角色。
  3. AWS Security Token Service (AWS STS) AssumeRole API 呼叫新增至 Lambda 函數的程式碼。

**注意:**Lambda 函數可以在另一個帳戶中擔任 IAM 角色以存取資源,例如 Amazon Simple Storage Service (Amazon S3) 儲存貯體。Lambda 函數也可以擔任執行任務 (例如啟動和停止執行個體) 的角色。

解決方法

**注意:**下列範例程序參考兩種類型的帳戶:

  • 託管 Lambda 函數的主帳戶 111111111111
  • 包含 Lambda 函數擔任的 IAM 角色的跨帳戶 222222222222

先決條件

建立您要在跨帳戶中使用的 IAM 角色。

設定 Lambda 函數的執行角色,以允許該函數在另一個帳戶中擔任 IAM 角色

新增下列政策陳述式至帳戶 111111111111 中您 Lambda 函數的 IAM 角色:

**注意:**將 222222222222 取代為您的函數擔任的跨帳戶角色帳戶 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 函數所在帳戶的帳戶 ID,將 my-lambda-execution-role 取代為您函數的 IAM 角色名稱。

{
    "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 呼叫新增至您函數的程式碼,請完成設定 Lambda 函數選項中的步驟。

**注意:**AWS STS AssumeRole API 呼叫會傳回您可以用來建立服務用戶端的憑證。在您使用服務用戶端時,您的 Lambda 函數具有擔任角色授予的許可。如需詳細資訊,請參閱 AWS 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 使用資源型政策

Lambda 資源存取許可

切換至 IAM 角色 (AWS API)

對 IAM 角色進行疑難排解

使用 Python 建置 Lambda 函數

AWS 官方
AWS 官方已更新 5 個月前