2017-03-02 3 views
3

Ich habe ein Go-Programm, das aws-sdk-go verwendet, um mit dynamodb zu sprechen. Abhängigkeiten werden verwaltet. Go Version 1.7.1. aws-sdk-go Version 1.6.24. Das Programm arbeitet wie in allen folgenden Umgebungen zu erwarten:Ungültiger Header-Feldwert in Go NUR auf kubernetes/CoreOS

  • Dev-Box von Shell (Arch Linux)
  • Docker-Container auf meine Dev-Box (Docker 1.13.1)
  • EC2-Instanz von Shell läuft (Ubuntu 16,04)

Wenn ich laufen die docker-Container auf Kubernetes (gleiche ich auf meine dev-Box getestet), erhalte ich folgende Fehlermeldung:

 

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 

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

Es sieht aus wie das Problem mit der Header-Wert Validierung ist, aber ich bin an einem Verlust zu verstehen, warum es überall, außer auf meinem K8S Cluster funktioniert. Der Cluster besteht aus Ec2-Instanzen, auf denen das neueste CoreOS stable ami läuft (CoreOS stable 1235.8.0)

Das Docker-Image, das auf meinem Dev-Computer funktioniert, basiert auf Scratch. Zur Fehlerbehebung habe ich ein Image erstellt, das auf Ubuntu basiert, und zwar mit einem separaten Go-Programm, das einfach ein Element von dynamodb holt. Wenn dieses Image auf meinem k8s-Cluster ausgeführt wird und das Programm von einer interaktiven Shell ausgeführt wird, erhalte ich die gleichen Fehler. Ich habe bestätigt, dass ich die dynamodb Endpunkte von diesem env anpingen kann.

Ich habe eine schwere Zeit, dieses Problem zu beheben: Verpasse ich hier etwas dummes? Kann mir jemand in die richtige Richtung zeigen oder eine Vorstellung davon haben, was vor sich geht?

Antwort

2

Die \n nach hidden ist sicherlich ungültig. Nicht sicher, ob es tatsächlich da ist oder irgendwie eingefügt wurde, als du für die Veröffentlichung bereinigt wurdest.

Bedenken Sie:

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")) 
} 

Eine Vermutung wäre, wo auch immer der wahren versteckte Wert von (config-Datei usw.) gezogen wird immer fälschlicherweise die \n drin hat und es gerne in Ihren Kopf gezogen zu werden, aber nur in diesem Fall.

+1

Das '\ n' war in der Kopfzeile, bevor ich für die Veröffentlichung gereinigt habe. Ich würde es seltsam finden, dass es nur in die k8s-Umgebung eingefügt wurde, obwohl alles andere gleich sein sollte (besonders angesichts der Docker-Deploy), aber es ist eine Spur, die ich aufspüren werde! – SjB

+1

Beim Erstellen eines k8s-Geheimnisses aus einer Datei wurde nach den geheimen Daten ein \ n hinzugefügt, das dann in den Header eingefügt wurde. – SjB

1

erinnern Sie sich an die "-n", wenn Sie dies tun: Echo-n-Taste | base64

+0

Dies scheint nicht im Zusammenhang mit der Frage – Efren

+0

Dies ist verwandt und war wahrscheinlich der Ursprung des Problems: die Verwendung von Echo ohne das Flag -n fügt eine neue Zeile der Ausgabe (für schöne Anzeige im Terminal) und wurde zusammen mit der Pipe andere Daten zu base64 – SjB