aws-cdk-lib跨栈获取Cognito userPoolId返回Token如何解决
问题原因
${Token[TOKEN.317]}是CDK的延迟解析占位符:CDK在合成CloudFormation模板阶段,自动生成的Cognito用户池ID这类资源物理属性还没有实际值,会先用Token占位,如果你在同步代码逻辑里强行把Token当普通字符串读取、拼接,就会拿到这个占位文本,无法得到实际的ID值。
解决方案
根据你的使用场景选对应处理方式:
- 跨栈引用场景:不要提前把
userPoolId取出来当普通字符串传递,直接把cognitoUserPool实例作为构造参数传给其他栈即可,CDK会自动处理跨栈引用的权限和值映射,不需要手动传ID字符串。 - 获取issuerUrl不要自己手动拼接:UserPool实例内置了已经做好延迟解析的provider URL属性,直接调用即可:
const issuerUrl = cognitoUserPool.userPoolProviderUrl; - 如果需要自己拼接URL、或者把URL传给其他CDK资源(比如Lambda环境变量、API Gateway授权器配置):直接用CDK支持的字符串插值语法传入带Token的属性即可,不要尝试在synth阶段解析Token的实际值:
// 这种写法CDK会自动识别Token做延迟解析,传给其他资源时会被正确替换为CloudFormation引用 const issuerUrl = `https://cognito-idp.${Stack.of(this).region}.amazonaws.com/${cognitoUserPool.userPoolId}`;禁止在代码里用JSON序列化、正则匹配等方式尝试读取Token的实际内容,CDK不支持在本地合成阶段拿到资源的物理属性值,这类值只有CloudFormation部署阶段才会确定。
- 如果需要在部署完成后拿到实际的issuerUrl值:把该值定义为CDK Output,等部署完成后就可以在输出结果、CloudFormation控制台看到实际值;如果是给运行时代码(比如Lambda函数逻辑)用,直接把URL作为环境变量传入即可,运行时会拿到实际的字符串值。
内容的提问来源于stack exchange,提问作者GuillaumeC
相关产品推荐
相关产品推荐

