2016-04-07 43 views
0

公式のGolang AWS SDKを使用してS3にファイルをアップロードしようとしているところに問題があります。AWS S3 Golang SDK - ファイルをアップロード中 - 間違った領域

北カリフォルニア地域(us-west-1)に指定されたバケットをターゲットにしています。私はS3の探検家でそれを見ることができます。私はput操作を実行したときしかし、私は次のエラーを取得する:

BucketRegionError: incorrect region, the bucket is not in 'Northern California' region 

は、これは私が私の接続を設定しています方法です:

creds := credentials.NewStaticCredentials(aws_access_key_id, aws_secret_access_key, token) 
_,err := creds.Get() 

config := &aws.Config{ 
    Region   :aws.String("us-west-1"), 
    Endpoint  :aws.String("s3.amazonaws.com"), 
    S3ForcePathStyle:aws.Bool(true), 
    Credentials  :creds, 
    //LogLevel  :0, 
} 

s3_client := s3.New(session.New(config)) 

params := &s3.PutObjectInput{ 
    Bucket  :aws.String(p_bucket_name_str),   
    Key   :aws.String(p_target_file__s3_path_str), 
    ACL   :aws.String("public-read"), 
    Body   :file_bytes, 
    ContentLength:aws.Int64(size), 
    ContentType :aws.String(file_type), 
    Metadata  :map[string]*string{ 
     "Key":aws.String("MetadataValue"), 
    }, 
} 

result,err := p_s3_client.PutObject(params) 

任意の提案や修正が大きな助けになり、ありがとうございました。

+1

バケツが私たちのウェスト-1にあるのは本当ですか? – 0x434D53

+0

バケツのAWS Webツールダッシュボードでは、私に北カリフォルニアを教えています...私はAmazonsテーブルをチェックし、North Californiaマップは私たち - 西-1にマップしました。それはウェブブラウザ経由でバケットファイルにアクセスする際のURLパターンの領域です... – deepblue

+0

私はus-west-1、us-west-2、us-east-1領域を試しましたが、 "BucketRegionError:バケツが「us-west-1」地域にありません(地域はus-west-1/us-west-2/us-east-1) – deepblue

答えて

1

aws-sdk-goには、この作業をより便利にするためのs3managerツールがあります。あなたは以下のようにファイルをアップロードすることができます

creds := credentials.NewStaticCredentials(AccessKey, SecretKey, "") 
sess := session.New(&aws.Config{ 
    Credentials: creds, 
    Region:  &Region, 
}) 

uploader := s3manager.NewUploader(sess) 
uploader.Upload(&s3manager.UploadInput{ 
    ACL:   aws.String(acl), 
    Bucket:  aws.String(bucket), 
    Key:   aws.String(key), 
    ContentType: aws.String(contentType), 
    Body:  r, 
}) 
+0

Iveは今日このメソッドを仲間にしています。コードの必要量を減らしながらも、同じエラー応答を返します。 :( – deepblue

1

あなたのバケツがus-west-1領域に存在し、あなたの要求がus-east-1領域に行われていると思うので、あなたはこのエラーを見ています。 Go用のAWS SDKの場合、エンドポイントs3.amazon.comus-east-1にマップされます。

あなたの要求が作業を開始する必要がありますあなたの設定からEndpoint値を削除するには、正しい領域を有したら、あなたのバケットは、ヘッダとx-amz-bucket-region

に実際にある地域を確認するためにcurlコマンドcurl -I "https://<bucketname>.s3.amazonaws.com"を使用します。 SDKは、提供された地域に基づいてエンドポイントURLを自動的に決定します。 Endpointの値は、SDKがサービスを検索するURLを上書きしています。

バケットが別の領域に存在する場合、s3.amazon.comエンドポイントに対して要求が行われたときに、SDKが自動的に領域を切り替えて要求を再送信することはありません。

0

エラーはエンドポイントのためです。エンドポイント「s3.amazonaws.com」は、デフォルトでus-east-1領域です。 us-west-1のバケットを作成する場合は、エンドポイントを「s3-us-west-1.amazonaws.com」とする必要があります。

関連する問題