关于从AWS CloudFormation模板获取Cognito用户池应用客户端托管UI登录URL及自动化集成的技术问询
当然可以实现!我来给你拆解两种靠谱的方式,不管是在CloudFormation里直接输出,还是后续用CLI查询,都能完美适配你SPA流水线的自动化需求。
一、在CloudFormation模板中直接输出登录URL
Cognito托管UI的登录URL是有固定格式的:https://<用户池域名>/login?client_id=<客户端ID>&response_type=<响应类型>&scope=<权限范围>&redirect_uri=<回调地址>
你可以在CloudFormation模板的Outputs部分,用Fn::Sub(YAML里是!Sub)来动态拼接这个URL,这样堆栈部署完成后,直接就能拿到现成的登录地址。示例代码如下:
Outputs: CognitoLoginUrl: Description: Cognito托管UI登录URL Value: !Sub 'https://${UserPoolDomainResource}/login?client_id=${UserPoolClientResource}&response_type=code&scope=openid&redirect_uri=${SPAOrigin}/callback' Export: Name: !Sub "${AWS::StackName}-CognitoLoginUrl"
这里的UserPoolDomainResource是你定义的Cognito用户池域名资源(AWS::Cognito::UserPoolDomain)的逻辑ID,UserPoolClientResource是应用客户端资源(AWS::Cognito::UserPoolClient)的逻辑ID,SPAOrigin是你的SPA域名参数或资源引用,按需替换即可。
二、通过CLI在SPA流水线中获取URL
如果已经在CloudFormation里配置了输出,那么用CLI就能轻松提取这个URL,注入到你的SPA编译流程中:
方式1:用aws cloudformation describe-stacks查询堆栈输出
# 替换成你的CloudFormation堆栈名称 STACK_NAME="your-aws-stack-name" COGNITO_LOGIN_URL=$(aws cloudformation describe-stacks --stack-name $STACK_NAME --query "Stacks[0].Outputs[?OutputKey=='CognitoLoginUrl'].OutputValue" --output text)
执行这个命令后,COGNITO_LOGIN_URL变量就会存储登录地址,你可以把它写入SPA的环境变量文件(比如.env),或者直接传递给编译命令。
方式2:用aws cloudformation list-exports查询导出的输出
如果在模板里配置了Export,也可以通过导出名称来查询:
# 替换成你的导出名称(就是模板里Export.Name的值) EXPORT_NAME="your-stack-name-CognitoLoginUrl" COGNITO_LOGIN_URL=$(aws cloudformation list-exports --query "Exports[?Name=='$EXPORT_NAME'].Value" --output text)
备选方案:直接查询Cognito资源拼接URL
如果因为某些原因没法在CloudFormation里输出,也可以直接通过CLI查询Cognito的资源信息来拼接URL:
# 替换成你的用户池名称 USER_POOL_NAME="your-user-pool-name" # 替换成你的应用客户端名称 CLIENT_NAME="your-app-client-name" # 替换成你的SPA回调地址 REDIRECT_URI="https://your-spa-domain.com/callback" USER_POOL_ID=$(aws cognito-idp list-user-pools --max-results 10 --query "UserPools[?Name=='$USER_POOL_NAME'].Id" --output text) USER_POOL_CLIENT_ID=$(aws cognito-idp list-user-pool-clients --user-pool-id $USER_POOL_ID --query "UserPoolClients[?ClientName=='$CLIENT_NAME'].ClientId" --output text) USER_POOL_DOMAIN=$(aws cognito-idp describe-user-pool-domain --domain "your-user-pool-domain" --query "DomainDescription.Domain" --output text) COGNITO_LOGIN_URL="https://$USER_POOL_DOMAIN/login?client_id=$USER_POOL_CLIENT_ID&response_type=code&scope=openid&redirect_uri=$REDIRECT_URI"
不过这种方式不如堆栈输出可靠,因为用户池或客户端名称可能存在重复,而堆栈输出是和你的部署直接绑定的,一致性更强。
你的思路完全正确!在SPA流水线编译前通过CLI获取这个URL,既避免了硬编码配置的维护麻烦,又能保证不同环境(开发/测试/生产)的配置一致性,是非常合理的自动化实践。
备注:内容来源于stack exchange,提问作者fudo

