Localstack使用EndpointResolverWithOptions报AWS凭证验证失败问题
问题根因
该报错是AWS SDK for Go v2新旧版本端点解析器的默认行为差异导致的:
- 旧版已废弃的
EndpointResolverFunc处理用户返回的自定义端点时,会默认将域名标记为不可变,生成请求签名时直接使用自定义端点的域名计算签名,签名内容和LocalStack实际收到的请求域名匹配,可正常通过校验。 - 新版
EndpointResolverWithOptionsFunc返回的aws.Endpoint结构体默认HostnameImmutable字段值为false,SDK会自动将签名计算逻辑中使用的域名替换为AWS官方对应服务的默认域名,最终生成的签名携带的域名和实际请求的LocalStack域名不匹配。LocalStack收到请求后校验签名发现域名不匹配,就会返回AuthFailure凭证校验失败的报错。
部分SDK版本中,未显式指定SigningName字段导致签名使用了错误的服务标识,也会触发同类报错。
解决方法
修改自定义端点解析逻辑返回的aws.Endpoint结构体,补全两个缺失的配置项:
- 将
HostnameImmutable设为true,禁止SDK自动替换自定义端点域名 - 显式指定
SigningName为对应服务的签名标识,EC2服务对应值为ec2
修改后的端点解析代码如下:
rf := aws.EndpointResolverWithOptionsFunc(func(service, region string, options ...interface{}) (aws.Endpoint, error) { return aws.Endpoint{ PartitionID: "aws", URL: l.EndpointV2(s), SigningRegion: endpoints.UsEast1RegionID, SigningName: "ec2", HostnameImmutable: true, }, nil })
如果是对接其他LocalStack服务,只需将SigningName替换为对应服务的签名标识即可,例如S3服务对应s3、SQS服务对应sqs。
内容的提问来源于stack exchange,提问作者Sergey
相关产品推荐
相关产品推荐

