之前用的aliyun golang sdk 完成了STS的授权功能,今天因为要加短信的功能,就顺便升级了aliyun golang sdk的版本,编译没有任何问题,结果发布的时候发现之前sts的获取token接口报405:Method Not Allowed, 因为没有改任何code,知道是因为sdk升级带来的问题,但是不清楚是因为什么,于是debug了下,找到了原因记录下。
问题
debug发现新版本sdk的出现问题是因为sdk内部根据传入的regionId计算出来的endpoint错误,导致405错误, 所以修改了regionId即可正确访问。
上面找到问题后,就好奇为什么同样的配置旧版本的sdk就可以调用成功能,于是有切换了旧版sdk做了debug后发现,主要是旧版本的enpoint解析在几个分支都失败后,会有个全局默认的,所以最终可以得到一个正确的endpoint,但是新版的解析器逻辑修改了,导致了问题出现。
关于regionId这里要注意:
我用到的OSS有自己的regionId,会根据你买服务的地区不同而不同,设置错误无法访问
OSS的regionId(比如我用的:
oss-cn-beijing
)的格式和其他(比如STS和SMS的都是:cn-hangzhou
)都不同,我这边的错误就是因为要做OSS业务,看到sdk要regionId参数,就直接使用了(旧版本sdk还正确访问了- -!)STS没有自己的regionId,是在系统给的自己选(但是sdk里面不同的regionId还是都匹配到同一个host,不了解逻辑是做什么)
ps: sdk里面的endpoint解析逻辑有点复杂,不清楚业务背景不太懂为什么要这样做,比如外边设置了regionId,但里面都用EndpointMap被匹配到一个host,很奇怪。