Lambda中调用getOpenIdTokenForDeveloperIdentity报PrincipalTags错误
问题触发原因
- 从错误堆栈的加载路径可以直接定位:报错触发时使用的AWS SDK是Lambda运行时目录(
/var/runtime/node_modules/aws-sdk/)下的预装版本,并非你本地项目打包上传的SDK版本 - 问题的核心是本地开发环境与Lambda运行时的AWS SDK版本存在明显代差:
- 本地环境使用的AWS SDK版本较新,
assumeRoleWithWebIdentity接口的参数校验规则已经将PrincipalTags纳入合法入参范围,本地运行时传参可正常通过校验 - Lambda内置的预装AWS SDK是较早的历史版本,该版本的接口参数定义中尚未收录
PrincipalTags字段(该参数是AWS SDK 2.825.0版本之后才正式加入STS接口支持范围的),SDK内置的参数校验器会将所有未在参数schema中声明的字段判定为非法入参,直接抛出UnexpectedParameter错误
- 本地环境使用的AWS SDK版本较新,
解决办法
- 方案1:部署时将项目依赖的AWS SDK和代码一同打包上传,强制覆盖Lambda内置的旧版SDK
- 操作要求:将aws-sdk声明在项目的
dependencies依赖项中,不要放在devDependencies分类下;打包部署包时完整包含项目依赖的node_modules目录,不要在打包配置中排除aws-sdk - 运行时效果:Lambda会优先加载项目包内的SDK版本,完全匹配本地开发环境的参数校验逻辑
- 操作要求:将aws-sdk声明在项目的
- 方案2:移除入参中的
PrincipalTags字段,适配Lambda内置旧版SDK的参数要求- 注意:该方案仅适用于业务逻辑未依赖PrincipalTags实现权限管控、操作溯源、资源标签隔离的场景,避免移除参数后破坏原有鉴权规则
- 方案3:升级Lambda函数的运行时版本
- 选择Node.js 18及以上的Lambda运行环境,其预装的AWS SDK版本已经覆盖
PrincipalTags的参数支持,可消除版本差导致的校验错误
- 选择Node.js 18及以上的Lambda运行环境,其预装的AWS SDK版本已经覆盖
内容的提问来源于stack exchange,提问作者Muqadar Ali
相关产品推荐
相关产品推荐

