如何在dev账户的自定义授权Lambda中集成跨AWS账户的两个Cognito用户池?
问题描述
我有一个AWS dev账户,已部署Cognito用户池和自定义授权Lambda,该Lambda通过客户端凭证授予流使用此用户池完成用户认证,当前运行正常。
现在需要将另一个AWS test账户中的Cognito用户池与dev账户的自定义授权Lambda集成,使test账户的用户也能通过dev账户的授权Lambda完成认证与授权。
我的计划是在test账户创建一个跨账户IAM角色,允许dev账户的授权Lambda扮演该角色,从而调用test账户Cognito服务的describe_user_pool_client接口获取client_name,相关代码如下:
app_client_details = cognito_idp_client.describe_user_pool_client( UserPoolId = cognito_user_pool_id, ClientId = client_id ) client_name = app_client_details['UserPoolClient']['ClientName'] client_name = client_name.split(' ')[0].lower()
补充说明:必须同时使用dev和test账户的用户池,因此合并两个用户池并非可行选项。
回答
方案可行性判断
你的方案是可行的,但需要确保以下关键配置正确:
- 跨账户IAM角色信任策略:在test账户创建的角色中,信任策略需明确允许dev账户中授权Lambda的执行角色ARN(或dev账户ID+Lambda服务主体)作为可信实体,确保只有指定的Lambda能扮演该角色。
- 角色权限配置:test账户的IAM角色需添加
cognito-idp:DescribeUserPoolClient权限,且资源需限定为目标用户池和客户端ID(遵循最小权限原则),示例权限策略:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "cognito-idp:DescribeUserPoolClient", "Resource": "arn:aws:cognito-idp:<test-region>:<test-account-id>:userpool/<user-pool-id>/client/<client-id>" } ] } - Lambda内角色切换逻辑:dev账户的授权Lambda在调用test账户的Cognito API前,需通过STS服务调用
AssumeRole获取test账户角色的临时凭证,再用该凭证初始化Cognito IDP客户端,而非使用Lambda自身的执行角色凭证。
替代方案
test账户部署代理Lambda
在test账户部署一个代理Lambda,该Lambda拥有调用本地CognitoDescribeUserPoolClient的权限。dev账户的授权Lambda通过跨账户Lambda调用(需配置test账户Lambda的资源策略允许dev账户访问)获取所需的client_name,无需直接跨账户扮演角色,权限管控更清晰。预同步客户端信息
如果test账户的Cognito客户端信息(如client_name)不频繁变动,可将这些信息提前同步到dev账户的存储服务(如DynamoDB)。dev账户的授权Lambda直接从本地存储读取数据,避免实时跨账户API调用,提升性能同时降低权限复杂度。Cognito联合身份池(按需评估)
虽然不能合并用户池,但可通过Cognito联合身份池将两个账户的用户池配置为身份提供者,实现用户身份的统一认证。不过该方案更偏向用户身份认证场景,若你的需求聚焦于客户端凭证流的授权,需结合实际业务场景评估适用性。
内容的提问来源于stack exchange,提问作者Naxi

