2017-03-02 1 views
3

나는 aws-sdk-go를 사용하여 dynamodb와 통신하는 Go 프로그램을 가지고 있습니다. 종속성이 판매됩니다. 1.7.1 버전으로 이동하십시오. aws-sdk-go 버전 1.6.24. 이 프로그램은 다음의 모든 환경에서 예상 작품과 같이 쉘에서kubernetes/CoreOS에서만 유효하지 않은 헤더 필드 값

  • dev에 상자 (아치 리눅스)
  • 고정 표시기 용기 내 dev에 상자에서 실행 (도커 1.13.1) 쉘에서
  • EC2 인스턴스 (우분투 16.04)

내가는 Kubernetes에 고정 표시기 용기 (나는 내 ​​dev에 상자에서 테스트 같은 것), 나는 다음과 같은 오류 얻을 실행하면 :

 

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

문제가 헤더 값 유효성 검사입니다, 그러나 나는 그것이 내 K8S 클러스터를 제외하고 모든 곳에서 작동하는 이유를 이해하기 위해 딱하다 것 같습니다. 클러스터는 최신 CoreOS stable ami (CoreOS stable 1235.8.0)를 실행하는 Ec2 인스턴스로 구성됩니다.

내 dev 컴퓨터에서 작동하는 고정 이미지는 스크래치 기반입니다. 문제를 해결하기 위해 나는 우분투 기반의 이미지를 만들어 냈습니다. 그냥 dynamodb에서 간단한 아이템을 얻는 별도의 go 프로그램을 사용했습니다. 이 이미지가 k8s 클러스터에서 실행되고 프로그램이 대화 형 셸에서 실행되면 동일한 오류가 발생합니다. 이 env에서 dynamodb 엔드 포인트를 ping 할 수 있음을 확인했습니다.

이 문제를 해결하는 데 어려움을 겪고 있습니다. 여기에 바보가 있습니까? 누군가가 올바른 방향으로 나를 가르키거나 무슨 일이 일어나고 있는지 생각할 수 있습니까?

답변

2

hidden 이후의 \n은 확실히 유효하지 않습니다. 게시를 위해 클렌징 할 때 실제로 삽입되었거나 삽입 된 것이 확실하지 않습니다.

고려 :

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이 있고 행복하게 만이, 귀하의 헤더에 당겨지고있어 케이스.

+1

게시를 위해 정리되기 전에 '\ n'이 헤더에있었습니다. 나는 그것이 k8s 환경에서만 삽입되었다는 것이 이상하다는 것을 알았지 만 다른 것들은 모두 같아야한다 (특히 docker가 배포 된 경우). 그러나 그것은 내가 추적 할 리드입니다! – SjB

+1

파일에서 k8s 비밀을 생성하는 것은 비밀 데이터 뒤에 \ n을 추가하는 것이고, 그 다음 비밀 데이터는 헤더에 삽입됩니다. – SjB

1

이 작업을 수행 할 때 "-n"을 기억하십시오. echo -n key | base64

+0

질문과 관련이없는 것 같습니다. – Efren

+0

이것은 관련되어 있으며 문제의 기원 일 가능성이 높습니다. -n 플래그없이 echo를 사용하면 출력에 새 행이 추가되고 (터미널에 꽤 표시됨) base64에 대한 다른 데이터 – SjB

관련 문제