我有一个使用 aws-sdk-go 与 dynamodb 对话的 Go 程序。依赖项已出售。转到版本 1.7.1。 aws-sdk-go 版本 1.6.24。该程序在以下所有环境中都按预期工作:
- 来自 shell (Arch Linux) 的开发框
- 在我的开发箱上运行的 docker 容器 (Docker 1.13.1)
- 来自 shell (Ubuntu 16.04) 的 Ec2 实例
当我在 kubernetes 上运行 docker 容器时(我在我的开发箱上测试过的那个容器),我收到以下错误:
2017/03/02 22:30:13 DEBUG ERROR: Request dynamodb/GetItem: ---[ REQUEST DUMP ERROR ]----------------------------- net/http: invalid header field value "AWS4-HMAC-SHA256 Credential=hidden\n/20170302/us-east-1/dynamodb/aws4_request, SignedHeaders=accept-encoding;content-length;content-type;host;x-amz-date;x-amz-target, Signature=483f56dd0b17d8945d3c2f2044b7f97e531190602f132a4d5f828264b3a2cff2" for key Authorization ----------------------------------------------------- 2017/03/02 22:30:13 DEBUG: Response dynamodb/GetItem Details: ---[ RESPONSE ]-------------------------------------- HTTP/0.0 000 status code 0 Content-Length: 0
基于:
https://golang.org/src/net/http/transport.go
https://godoc.org/golang.org/x/net/lex/httplex#ValidHeaderFieldValue
看起来问题出在 header 值验证上,但我无法理解为什么它在除我的 k8s 集群之外的所有地方都能正常工作。集群由运行最新CoreOS stable ami (CoreOS stable 1235.8.0)的Ec2实例组成
在我的开发机器上运行的 docker 镜像是基于 scratch 的。为了进行故障排除,我创建了一个基于 Ubuntu 最新版本的图像,该图像带有一个单独的 go 程序,该程序仅从 dynamodb 执行简单的获取项目。当这个图像在我的 k8s 集群上运行并且程序从交互式 shell 运行时,我得到了同样的错误。我已经确认我可以从这个环境中 ping dynamodb 端点。
我很难解决这个问题:我是不是遗漏了什么愚蠢的东西?有人能给我指出正确的方向或知道发生了什么事吗?
最佳答案
执行此操作时请记住“-n”: echo -n 键 | base64
关于go - 仅在 kubernetes/CoreOS 上的 Go 中无效的 header 字段值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42567606/