6

我有一个使用 aws-sdk-go 与 dynamodb 对话的 Go 程序。依赖项是出售的。转到版本 1.7.1。aws-sdk-go 版本 1.6.24。该程序在以下所有环境中按预期工作:

  • 来自 shell 的开发盒(Arch Linux)
  • 在我的开发箱上运行的 docker 容器(Docker 1.13.1)
  • 来自 shell 的 Ec2 实例(Ubuntu 16.04)

当我在 kubernetes 上运行 docker 容器时(与我在开发盒上测试过的容器相同),我收到以下错误:

2017/03/02 22:30:13 调试错误:请求 dynamodb/GetItem:
---[请求转储错误]-----------------------------
net/http: 无效的标头字段值“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" 用于密钥授权
-------------------------------------------------- ---

2017/03/02 22:30:13 调试:响应 dynamodb/GetItem 详细信息:
- -[ 回复 ] -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  -  - 
HTTP/0.0 000 状态码 0
内容长度:0

基于:
https ://golang.org/src/net/http/transport.go
https://godoc.org/golang.org/x/net/lex/httplex#ValidHeaderFieldValue

看起来问题出在标头值验证上,但我不明白为什么它在除我的 k8s 集群之外的任何地方都有效。集群由运行最新 CoreOS stable ami(CoreOS stable 1235.8.0)的 Ec2 实例组成

在我的开发机器上运行的 docker 镜像是基于暂存的。为了排除故障,我使用一个单独的 go 程序创建了一个基于 Ubuntu latest 的图像,该程序只是从 dynamodb 执行一个简单的 get 项目。当这个图像在我的 k8s 集群上运行并且程序从交互式 shell 运行时,我得到了同样的错误。我已经确认我可以从这个环境 ping dynamodb 端点。

我很难解决这个问题:我在这里错过了什么愚蠢的东西吗?有人可以指出我正确的方向或知道发生了什么吗?

4

2 回答 2

8

执行此操作时请记住“-n”:echo -n key | base64

于 2017-07-07T06:33:12.750 回答
5

\n后面hidden肯定是无效的。不确定它是否真的存在或在您清理以发布时以某种方式插入。

考虑:

package main

import (
    "fmt"
    "golang.org/x/net/lex/httplex"
)

func main() {
    fmt.Println("Is valid (without new line)", httplex.ValidHeaderFieldValue("AWS4-HMAC-SHA256 Credential=hidden/20170302/us-east-1/dynamodb/aws4_request, SignedHeaders=accept-encoding;content-length;content-type;host;x-amz-date;x-amz-target, Signature=483f56dd0b17d8945d3c2f2044b7f97e531190602f132a4d5f828264b3a2cff2"))
    fmt.Println("Is valid (with new line)", httplex.ValidHeaderFieldValue("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"))
}

一种猜测是,从(配置文件等)中提取的真正隐藏值错误地存在\n于其中,并且很高兴将其拉入您的标题中,但仅在这种情况下。

于 2017-03-02T23:36:16.620 回答