O mecanismo de autorização que você forneceu não é suportado. Por favor, use AWS4-HMAC-SHA256

130

Eu recebo um erro AWS::S3::Errors::InvalidRequest The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256.ao tentar fazer o upload do arquivo no bucket do S3 na nova região de Frankfurt. Tudo funciona corretamente com a US Standardregião.

Roteiro:

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)

Como corrigi-lo?

Obrigado.

Alexey
fonte
1
Esta resposta resolveu meu problema: stackoverflow.com/questions/34483795/…
Bahadir Tasdemir

Respostas:

151

O AWS4-HMAC-SHA256, também conhecido como Signature Version 4, ("V4") é um dos dois esquemas de autenticação suportados pelo S3.

Todas as regiões suportam a V4, mas o padrão US¹ e muitas - mas não todas - outras regiões, também suportam o outro esquema mais antigo, a Signature Version 2 ("V2").

De acordo com http://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html ... novas regiões S3 implantadas após janeiro de 2014 oferecerão suporte apenas à V4.

Desde que Frankfurt foi introduzida no final de 2014, ele não suporta a V2, que é o que esse erro sugere que você esteja usando.

http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingAWSSDK.html explica como ativar a V4 nos vários SDKs, supondo que você esteja usando um SDK com esse recurso.

Eu especularia que algumas versões mais antigas dos SDKs talvez não suportem essa opção; portanto, se as opções acima não ajudarem, talvez você precise de uma versão mais recente do SDK que está usando.


¹ US Standardé o nome anterior para a implantação regional do S3 baseada na us-east-1região. Desde o momento em que essa resposta foi originalmente escrita, "o Amazon S3 renomeou a região padrão dos EUA para a região leste dos EUA (N. Virgínia) para ser consistente com as convenções de nomes regionais da AWS". Para todos os fins práticos, é apenas uma alteração na nomeação.

Michael - sqlbot
fonte
Isso inclui o s3cmd-1.5.0-0.alpha3.fc20.noarch, que vem com o Fedora 20. E aparentemente também inclui o 1.5.0-rc1 , o mais recente por enquanto.
David Tonhofer
1
@DavidTonhofer que parece certo. Parece que os desenvolvedores do s3cmd ainda não AWS4-HMAC-SHA256implementaram: github.com/s3tools/s3cmd/issues/402
Michael - sqlbot
2
@ "Michael - sqlbot" bem, mudei para "awscli" por enquanto. Para quem tem pressa: yum instale python-pip; O pip instala o awscli; aws configure; aws --region = ue-central-1 s3 ls s3: // $ BUCKET etc ... #
23414 David Tonhofer
AWS-SDK v2 parece apoiar AWS4-HMAC-SHA256 "V4" autenticação bem (relacionado problema )
Jeewes
thnx .. isso é útil para mim
Manish Vadher
68

Com o nó, tente

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

Você deve definir signatureVersion: 'v4'em configusar nova versão sinal:

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

Funciona para JSsdk.

Denis Rizun
fonte
3
Salvou o meu dia! Não tenho certeza por que essa opção não é mais divulgada
André Werlang
26

Para pessoas que usam boto3( Python SDK), use o código abaixo

from botocore.client import Config


s3 = boto3.resource(
    's3',
    aws_access_key_id='xxxxxx',
    aws_secret_access_key='xxxxxx',
    config=Config(signature_version='s3v4')
)
Penkey Suresh
fonte
4
Eu recebo erro AuthorizationQueryParametersErrorError parsing the X-Amz-Credential parameter; the region 'us-east-1' is wrong; expecting 'us-east-2'us-east-2 Então eu adicionei region_name='us-east-2' o código acima
Aseem
13

Problema semelhante com o PHP SDK, isso funciona:

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

A parte importante é ae signaturearegion

Pascal
fonte
É necessário especificar a região?
Chirag Mehta
3

Em Java eu ​​tive que definir uma propriedade

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

e adicione a região à instância s3Client.

s3Client.setRegion(Region.getRegion(Regions.EU_CENTRAL_1))
GameScripting
fonte
3

Com boto3, este é o código:

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

ou

s3_client = boto3.client('s3', region_name='eu-central-1')
Benoit
fonte
você tem s3_client duas vezes?
MH
2

Para thumbor-aws, que usava boto config, eu precisava colocar isso no diretório $AWS_CONFIG_FILE

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

Portanto, qualquer coisa que use boto diretamente, sem alterações, pode ser útil

higuita
fonte
2
AWS_S3_REGION_NAME = "ap-south-1"

AWS_S3_SIGNATURE_VERSION = "s3v4"

isso também economizou meu tempo depois de navegar por 24 horas ..

Smartybrainy
fonte
Isso funciona muito bem, você só precisa alterar o nome da região para se adequar ao seu, se não for "ap-south-1"
Devman
Não são necessárias alterações de codificação! Defina esses dois ambientes e o boto funcionará bem
Stevko 25/07
1

Para o SDK do Android, setEndpoint resolve o problema, embora tenha sido descontinuado.

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

Basicamente, o erro ocorreu porque eu estava usando a versão antiga do aws-sdk e atualizei a versão para que esse erro ocorresse.

no meu caso com o nó js, eu estava usando o signatureVersionobjeto parmas como este:

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

Então eu coloquei a assinatura fora do objeto params e trabalhei como charme:

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

Verifique sua região de bucket do AWS S3 e passe a região adequada na solicitação de conexão.

No My Senario, configurei ' APSouth1 ' para a Ásia-Pacífico (Mumbai)

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);
}
Ravi Oza
fonte
1

Para Boto3, use este código.

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')
        )
Pushplata
fonte
1

No meu caso, o tipo de solicitação estava errado. Eu estava usando GET (burro) Deve ser PUT.

ManiKandan Selvanathan
fonte
Salvou o meu dia, no meu caso, eu estava usando o POST.
Shahid Kamal
0

Em algum momento a versão padrão não será atualizada. Adicione este comando

AWS_S3_SIGNATURE_VERSION = "s3v4"

no settings.py

gokul krishna
fonte
0

Experimente esta combinação.

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
});
Ankit Kumar Rajpoot
fonte
0

Código para o frasco (boto3)

Não se esqueça de importar o Config. Além disso, se você tiver sua própria classe de configuração, altere seu nome.

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)
P.Gupta
fonte