2017-03-02 23 views
3

私はaws-sdk-goを使用してdynamodbと通信するGoプログラムを持っています。依存関係が派生しています。 1.7.1に進みます。 aws-sdk-goバージョン1.6.24。以下のすべての環境で期待どおりにプログラムが動作します:シェルからの私のdevのボックス(ドッカー1.13.1) kubernetes/CoreOSで無効なヘッダーフィールドの値

  • EC2インスタンス上で実行中のシェルから

    • のdevのボックス(アーチのLinux)
    • ドッカコンテナ(Ubuntuの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インスタンスで構成されています。

    私の開発マシンで動作するドッカーイメージはスクラッチベースです。トラブルシューティングをするには、私はUbuntuに基づいた画像を最新のものにしました。ちょうどdynamodbから簡単な項目を取得します。このイメージがk8sクラスタ上で実行され、プログラムが対話型シェルから実行されると、同じエラーが発生します。私はこのenvからdynamodbエンドポイントをpingできることを確認しました。

    私はこの問題のトラブルシューティングに苦労しています。私は何か愚かなことをここに逃していますか?誰かが正しい方向に私を向けることができますか、何が起こっているのアイデアを持っている?

  • 答えて

    2

    \nhiddenの後には、確かに無効です。あなたが投稿用にクレンジングしていたときに、実際にそこに存在するか、何らかの形で挿入されているかどうかはわかりません。

    は考えてみましょう:

    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環境にのみ挿入されているのは奇妙だと思うだろうが(他のものはすべて同じでなければならない(特にドッカーの配置を考えると)そうだが、それは私が追跡するリードだ! – SjB

    +1

    ファイルからk8sシークレットを作成すると、シークレットデータの後ろに\ nが追加され、シークレットデータがヘッダーに挿入されました。 – SjB

    1

    これを行うときに "-n"を覚えておいてください。 echo -n key | base64

    +0

    これは質問に関連していないようです – Efren

    +0

    これは関連しており、おそらく問題の起源でした。-nフラグを付けずにechoを使うと、出力に改行が追加され(端末にかなり表示されます)、その他のデータをbase64に – SjB

    関連する問題