제공 한 인증 메커니즘이 지원되지 않습니다. 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/…
Bahadir Tasdemir

답변:


151

서명 버전 4 ( "V4")라고도하는 AWS4-HMAC-SHA256은 S3에서 지원하는 두 가지 인증 체계 중 하나입니다.

모든 리전은 V4를 지원하지만 US-Standard¹을 지원하지만 다른 리전은 대부분 다른 지역을 지원하며 다른 오래된 구성표 인 서명 버전 2 ( "V2")도 지원합니다.

http://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html ... 에 따르면 2014 년 1 월 이후에 배포 된 새로운 S3 리전은 V4 만 지원합니다.

프랑크푸르트는 2014 년 말에 소개되었으므로 V2를 지원하지 않으므로이 오류가 사용 중임을 나타냅니다.

http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingAWSSDK.html 은 해당 기능이있는 SDK를 사용한다고 가정 할 때 다양한 SDK에서 V4를 활성화하는 방법을 설명합니다.

일부 이전 버전의 SDK는이 옵션을 지원하지 않을 수 있으므로 위의 방법으로 도움이되지 않으면 사용중인 최신 SDK 릴리스가 필요할 수 있습니다.


¹ US Standard는 해당 지역을 기반으로하는 S3 지역 배포의 이전 이름입니다 us-east-1. 이 답변이 처음 작성된 이후 "Amazon S3는 AWS 표준 명명 규칙과 일치하도록 미국 표준 지역의 이름을 미국 동부 (버지니아 북부) 지역으로 변경했습니다." 모든 실질적인 목적을 위해, 그것은 이름의 변화 일뿐입니다.


이것은 Fedora 20과 함께 제공되는 s3cmd-1.5.0-0.alpha3.fc20.noarch를 그루터기합니다. 그리고 현재는 최신 버전1.5.0-rc1 도 볼 수 있습니다.
David Tonhofer

1
@DavidTonhofer 맞습니다. s3cmd 개발자가 AWS4-HMAC-SHA256아직 구현하지 않은 것 같습니다 : github.com/s3tools/s3cmd/issues/402
Michael-sqlbot

2
@ "Michael-sqlbot"잘 나는 지금 "awscli"로 전환했다. 급한 사람들을 위해 : yum install python-pip; pip install awscli; AWS 구성; AWS --region = 유럽 연합 (EU) - 중앙-1 (S3) LS S3 : // $ BUCKET 등 ...
데이비드 Tonhofer

aws-sdk v2는 AWS4-HMAC-SHA256 "V4"인증을 잘 지원하는 것 같습니다 (관련 문제 )
Jeewes

thnx .. 이것은 나에게 유용합니다
Manish Vadher

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'
});

JSSDK에서 작동합니다 .


3
내 하루를 구했다! 확실하지이 옵션은 더 공개되지 않는 이유
앙드레 Werlang

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' 했습니다
Aseem

13

PHP SDK와 비슷한 문제로 작동합니다.

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

중요한 비트는 것입니다 signature과를region


지역을 지정해야합니까?
Chirag Mehta


3

Java에서는 속성을 설정해야했습니다.

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가 두 번 있습니까?
MH

2

boto 설정을 사용한 thumbor-aws의 경우, 이것을 $AWS_CONFIG_FILE

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

따라서 변경없이 직접 boto를 사용한 것은 유용 할 수 있습니다.


2
AWS_S3_REGION_NAME = "ap-south-1"

AWS_S3_SIGNATURE_VERSION = "s3v4"

24 시간 동안 서핑 한 후에도 시간이 절약되었습니다.


이것은 잘 작동합니다. "ap-south-1"이 아닌 경우 지역 이름을 변경해야합니다
Devman

코딩 변경이 필요하지 않습니다! 이 두 가지 환경 변수를 설정하면 boto가 제대로 작동합니다
Stevko

1

Android SDK의 경우 setEndpoint가 더 이상 사용되지 않지만 문제를 해결합니다.

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

그런 다음 params 객체에서 서명을 넣고 매력처럼 작동했습니다.

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

1

연결 요청에서 AWS S3 버킷 리전을 확인 하고 적절한 리전을 전달하십시오.

Senario에서는 아시아 태평양 (뭄바이)에 ' 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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.