आपके द्वारा प्रदान किया गया प्राधिकरण तंत्र समर्थित नहीं है। कृपया AWS4-HMAC-SHA256 का उपयोग करें


130

मुझे एक त्रुटि मिलती है AWS::S3::Errors::InvalidRequest The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256.जब मैं नए फ्रैंकफर्ट क्षेत्र में S3 बाल्टी में फ़ाइल अपलोड करने का प्रयास करता हूं। सभी US Standardक्षेत्र के साथ ठीक से काम करते हैं।

स्क्रिप्ट:

backup_file = '/media/db-backup_for_dev/2014-10-23_02-00-07/slave_dump.sql.gz'
s3 = AWS::S3.new(
    access_key_id:     AMAZONS3['access_key_id'],
    secret_access_key: AMAZONS3['secret_access_key']
)

s3_bucket = s3.buckets['test-frankfurt']

# Folder and file name
s3_name = "database-backups-last20days/#{File.basename(File.dirname(backup_file))}_#{File.basename(backup_file)}"

file_obj = s3_bucket.objects[s3_name]
file_obj.write(file: backup_file)

aws-sdk (1.56.0)

इसे कैसे जोड़ेंगे?

धन्यवाद।


1
इस जवाब ने मेरी समस्या हल कर दी: stackoverflow.com/questions/34483795/…
बहादर तसदिमिर

जवाबों:


151

AWS4-HMAC-SHA256, जिसे सिग्नेचर वर्जन 4 के रूप में भी जाना जाता है, ("V4") S3 द्वारा समर्थित दो प्रमाणीकरण योजनाओं में से एक है।

सभी क्षेत्र V4 का समर्थन करते हैं, लेकिन US-Standard¹, और कई - लेकिन सभी नहीं - अन्य क्षेत्र भी, अन्य, पुरानी योजना, हस्ताक्षर संस्करण 2 ("V2") का समर्थन करते हैं।

Http://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html के अनुसार ... जनवरी, 2014 के बाद तैनात नए S3 क्षेत्र केवल V4 का समर्थन करेंगे।

चूंकि फ्रैंकफर्ट 2014 के अंत में पेश किया गया था, इसलिए यह V2 का समर्थन नहीं करता है, जो कि यह त्रुटि है जो आप उपयोग कर रहे हैं।

http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingAWSSDK.html बताता है कि विभिन्न एसडीके में V4 को कैसे सक्षम किया जाए, यह मानते हुए कि आप उस क्षमता वाले SDK का उपयोग कर रहे हैं।

मैं अनुमान लगाऊंगा कि एसडीके के कुछ पुराने संस्करण इस विकल्प का समर्थन नहीं कर सकते हैं, इसलिए यदि उपरोक्त मदद नहीं करता है, तो आपको एसडीके के नए रिलीज़ की आवश्यकता हो सकती है जिसका आप उपयोग कर रहे हैं।


¹ US StandardS3 क्षेत्रीय तैनाती कि में आधारित है का पुराना नाम है us-east-1क्षेत्र। चूंकि यह उत्तर मूल रूप से लिखा गया था, "अमेज़ॅन एस 3 ने यूएस स्टैंडर्ड क्षेत्र का नाम बदलकर यूएस ईस्ट (एन। वर्जीनिया) क्षेत्र कर दिया था, जो कि एडब्ल्यूएस क्षेत्रीय नामकरण सम्मेलनों के अनुरूप है।" सभी व्यावहारिक उद्देश्यों के लिए, यह केवल नामकरण में बदलाव है।


यह स्टंप s3cmd-1.5.0-0.alpha3.fc20.noarch है जो फेडोरा 20 के साथ आता है। और जाहिर तौर पर यह 1.5.0-rc1 , अब के लिए नवीनतम स्टंप भी है ।
डेविड टोनहोफर

1
@DavidTonhofer जो सही लगता है। ऐसा लगता है कि s3cmd डेवलपर्स ने AWS4-HMAC-SHA256अभी तक लागू नहीं किया है: github.com/s3tools/s3cmd/issues/402
माइकल - sqlbot

2
@ "माइकल - sqlbot" अच्छी तरह से मैं अब के लिए "awscli" में बदल गया। जल्दी में उन लोगों के लिए: यम स्थापित करें अजगर-पाइप; पाइप स्थापित करें; aws कॉन्फ़िगर; aws --region = eu-central-1 s3 ls s3: // $ BUCKET आदि ...
डेविड टोनहोफर

aws-sdk v2 AWS4-HMAC-SHA256 "V4" प्रमाणीकरण का अच्छी तरह से समर्थन करने के लिए लगता है (संबंधित मुद्दा )
Jeewes

thnx .. यह मेरे लिए उपयोगी है
मनीष वधेर

68

नोड के साथ, कोशिश करें

var s3 = new AWS.S3( {
    endpoint: 's3-eu-central-1.amazonaws.com',
    signatureVersion: 'v4',
    region: 'eu-central-1'
} );

34

आप स्थापित करना चाहिए signatureVersion: 'v4'में configनए साइन संस्करण का उपयोग करने के लिए:

AWS.config.update({
    signatureVersion: 'v4'
});

JSएसडीके के लिए काम करता है ।


3
मेरा दिन बचाया! निश्चित नहीं है कि यह विकल्प अधिक प्रचारित क्यों नहीं है
एन्ड्र वेर्लांग

26

उपयोग करने वाले लोगों के लिए boto3( Python SDK) नीचे दिए गए कोड का उपयोग करें

from botocore.client import Config


s3 = boto3.resource(
    's3',
    aws_access_key_id='xxxxxx',
    aws_secret_access_key='xxxxxx',
    config=Config(signature_version='s3v4')
)

4
मुझे त्रुटि मिलती है AuthorizationQueryParametersErrorError parsing the X-Amz-Credential parameter; the region 'us-east-1' is wrong; expecting 'us-east-2'us-east-2 इसलिए मैंने region_name='us-east-2' उपरोक्त कोड
असीम

13

PHP एसडीके के साथ इसी तरह का मुद्दा, यह काम करता है:

$s3Client = S3Client::factory(array('key'=>YOUR_AWS_KEY, 'secret'=>YOUR_AWS_SECRET, 'signature' => 'v4', 'region'=>'eu-central-1'));

महत्वपूर्ण बिट signatureऔर हैregion


क्या क्षेत्र निर्दिष्ट होना आवश्यक है?
चिराग मेहता

13

मैं Django का उपयोग कर रहा हूं, और मुझे यह काम करने के लिए इन अतिरिक्त कॉन्फ़िगरेशन चर को जोड़ना पड़ा। ( https://simpleisbetterthancomplex.com/tutorial/2017/08/01/how-to-setup-amazon-s3-in-a-django-project.html में उल्लिखित सेटिंग्स के अलावा )।

AWS_S3_REGION_NAME = "ap-south-1"

या boto3 संस्करण 1.4.4 के लिए पिछले:

AWS_S3_REGION_NAME = "ap-south-1"

AWS_S3_SIGNATURE_VERSION = "s3v4"

3

जावा में मुझे एक संपत्ति निर्धारित करनी थी

System.setProperty(SDKGlobalConfiguration.ENFORCE_S3_SIGV4_SYSTEM_PROPERTY, "true")

और क्षेत्र को s3Client उदाहरण में जोड़ें।

s3Client.setRegion(Region.getRegion(Regions.EU_CENTRAL_1))

3

Boto3 के साथ, यह कोड है:

s3_client = boto3.resource('s3', region_name='eu-central-1')

या

s3_client = boto3.client('s3', region_name='eu-central-1')

आपके पास दो बार s3_client है?
एमएच

2

थंबोर-अर्स के लिए, जो बोटो कॉन्फिगर का इस्तेमाल करता है, मुझे इसे लगाने की जरूरत है $AWS_CONFIG_FILE

[default]
aws_access_key_id = (your ID)
aws_secret_access_key = (your secret key)
s3 =
    signature_version = s3

तो कुछ भी जो बिना बदलाव के सीधे बोटो का इस्तेमाल करता है, यह उपयोगी हो सकता है


2
AWS_S3_REGION_NAME = "ap-south-1"

AWS_S3_SIGNATURE_VERSION = "s3v4"

यह भी 24 घंटे के लिए सर्फिंग के बाद मेरा समय बचाया ..


यह बहुत अच्छा काम करता है, आपको बस अपना नाम बदलने के लिए क्षेत्र का नाम बदलना होगा यदि इसके "एपी-दक्षिण -१" नहीं
देवमान

कोई कोडिंग परिवर्तन आवश्यक नहीं है! इन दोनों को सेट करें
var var और boto

1

एंड्रॉइड एसडीके के लिए, सेटइंडपॉइंट समस्या को हल करता है, हालांकि इसे हटा दिया गया है।

CognitoCachingCredentialsProvider credentialsProvider = new CognitoCachingCredentialsProvider(
                context, "identityPoolId", Regions.US_EAST_1);
AmazonS3 s3 = new AmazonS3Client(credentialsProvider);
s3.setEndpoint("s3.us-east-2.amazonaws.com");

1

मूल रूप से त्रुटि थी क्योंकि मैं aws-sdk के पुराने संस्करण का उपयोग कर रहा था और मैंने संस्करण को अपडेट किया ताकि यह त्रुटि उत्पन्न हो।

मेरे मामले में नोड js के साथ मैं signatureVersionइस तरह parmas वस्तु का उपयोग कर रहा था :

const AWS_S3 = new AWS.S3({
  params: {
    Bucket: process.env.AWS_S3_BUCKET,
    signatureVersion: 'v4',
    region: process.env.AWS_S3_REGION
  }
});

फिर मैंने परम ऑब्जेक्ट पर हस्ताक्षर किए और आकर्षण की तरह काम किया:

const AWS_S3 = new AWS.S3({
  params: {
    Bucket: process.env.AWS_S3_BUCKET,
    region: process.env.AWS_S3_REGION
  },
  signatureVersion: 'v4'
});

1

अपने AWS S3 बकेट क्षेत्र की जाँच करें और कनेक्शन अनुरोध में उचित क्षेत्र पास करें।

माय सेनारियो में मैंने एशिया पैसिफिक (मुंबई) के लिए ' APSouth1 ' सेट किया है

using (var client = new AmazonS3Client(awsAccessKeyId, awsSecretAccessKey, RegionEndpoint.APSouth1))
{
    GetPreSignedUrlRequest request1 = new GetPreSignedUrlRequest
    {
        BucketName = bucketName,
        Key = keyName,
        Expires = DateTime.Now.AddMinutes(50),
    };
    urlString = client.GetPreSignedURL(request1);
}

1

Boto3 के लिए, इस कोड का उपयोग करें।

import boto3
from botocore.client import Config


s3 = boto3.resource('s3',
        aws_access_key_id='xxxxxx',
        aws_secret_access_key='xxxxxx',
        region_name='us-south-1',
        config=Config(signature_version='s3v4')
        )


0

कुछ समय में डिफ़ॉल्ट संस्करण अपडेट नहीं होगा। इस कमांड को जोड़ें

AWS_S3_SIGNATURE_VERSION = "s3v4"

में settings.py


0

इस संयोजन का प्रयास करें।

const s3 = new AWS.S3({
  endpoint: 's3-ap-south-1.amazonaws.com',       // Bucket region
  accessKeyId: 'A-----------------U',
  secretAccessKey: 'k------ja----------------soGp',
  Bucket: 'bucket_name',
  useAccelerateEndpoint: true,
  signatureVersion: 'v4',
  region: 'ap-south-1'             // Bucket region
});

0

फ्लास्क के लिए कोड (boto3)

कॉन्फ़िगरेशन आयात करना न भूलें। इसके अलावा, यदि आपके पास अपना स्वयं का विन्यास वर्ग है, तो उसका नाम बदल दें।

from botocore.client import Config

s3 = boto3.client('s3',config=Config(signature_version='s3v4'),region_name=app.config["AWS_REGION"],aws_access_key_id=app.config['AWS_ACCESS_KEY'], aws_secret_access_key=app.config['AWS_SECRET_KEY'])
s3.upload_fileobj(file,app.config["AWS_BUCKET_NAME"],file.filename)
url = s3.generate_presigned_url('get_object', Params = {'Bucket':app.config["AWS_BUCKET_NAME"] , 'Key': file.filename}, ExpiresIn = 10000)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.