我希望 AWS Lambda 函數在另一個 AWS 帳戶中擔任 AWS Identity and Access Management (IAM) 角色。
簡短描述
若要讓 Lambda 函數在另一個帳戶中擔任 IAM 角色,請完成下列步驟:
- 設定 Lambda 函數的執行角色,以允許該函數在另一個 AWS 帳戶中擔任 IAM 角色。
- 修改跨帳戶 IAM 角色的信任政策,以允許 Lambda 函數擔任此角色。
- 將 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 函數