programing

제공한 권한 부여 메커니즘이 지원되지 않습니다.AWS4-HMAC-SHA256을 사용하십시오.

testmans 2023. 6. 14. 21:43
반응형

제공한 권한 부여 메커니즘이 지원되지 않습니다.AWS4-HMAC-SHA256을 사용하십시오.

오류가 발생했습니다.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-vlan (1.56.0)

어떻게 고칠까요?

감사해요.

AWS4-HMAC-SHA256(Signature Version 4, "V4")은 S3에서 지원하는 두 가지 인증 체계 중 하나입니다.

모든 지역에서 V4를 지원하지만 US-Standard() 및 다른 지역에서도 다른 오래된 체계인 Signature Version 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에서 V4를 사용하도록 설정하는 방법에 대해 설명합니다.

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


¹US StandardS3 지역 배치의 이전 이름으로, 에 기반을 두고 있습니다.us-east-1지역.이 답변이 처음 작성되었을 때부터 "AWS 지역 명명 규칙과 일치하도록 Amazon S3는 US Standard Region을 US East(N. Virginia) Region으로 이름을 변경했습니다."모든 실질적인 목적에서, 그것은 단지 이름의 변경일 뿐입니다.

노드를 사용하여 시도

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

은 야해합다로 설정해야 .signatureVersion: 'v4'config버전을 하는 방법: 사용자 지정

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

작업대상에서 합니다.JS.dll

을 사용하는 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')
)

저는 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"

또는 bot3 버전 1.4.4 이전 버전:

AWS_S3_REGION_NAME = "ap-south-1"

AWS_S3_SIGNATURE_VERSION = "s3v4"

PHP SDK의 유사한 문제로, 다음과 같이 작동합니다.

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

은 중한부분은입니다.signature 리고그고.region

AWS_S3_REGION_NAME = "ap-south-1"

AWS_S3_SIGNATURE_VERSION = "s3v4"

이것은 또한 24시간 동안 서핑을 한 후에 나의 시간을 절약해주었습니다.

플라스크 코드(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)

자바에서 나는 속성을 설정해야 했습니다.

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

영역을 s3Client 인스턴스에 추가합니다.

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

bto3의 경우 코드는 다음과 같습니다.

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

또는

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

boto 구성을 사용한 엄지발가락의 경우, 나는 이것을 다음에 넣어야 했습니다.$AWS_CONFIG_FILE

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

그래서 변화 없이 직접 보토를 사용한 것이라면, 이것은 유용할 것입니다.

django/boto3/django-storage에 대한 초신성 답변은 저와 함께 작동했습니다.

AWS_S3_REGION_NAME = "ap-south-1"

또는 bot3 버전 1.4.4 이전 버전:

AWS_S3_REGION_NAME = "ap-south-1"

AWS_S3_SIGNATURE_VERSION = "s3v4"

그것들을 당신의 settings.py 에 추가하고 그에 따라 지역 코드를 변경하세요.

다음에서 aws 영역을 확인할 수 있습니다. 여기에 링크 설명을 입력하십시오.

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

기본적으로 오류는 이전 버전의 aws-sdk를 사용하다가 버전을 업데이트해서 발생한 것입니다.

에는 내사노용하js의경우를 했습니다.signatureVersion에서: 음과같구문서에은:

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

AWS S3 버킷 영역을 확인하고 연결 요청에서 적절한 영역을 전달합니다.

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

저의 경우, 요청 유형이 잘못되었습니다.GET(dumb)을 사용하고 있었는데 PUT임에 틀림없습니다.

파이썬에서 사용한 기능은 다음과 같습니다.

def uploadFileToS3(filePath, s3FileName):
    s3 = boto3.client('s3', 
                    endpoint_url=settings.BUCKET_ENDPOINT_URL,
                    aws_access_key_id=settings.BUCKET_ACCESS_KEY_ID,
                    aws_secret_access_key=settings.BUCKET_SECRET_KEY,
                    region_name=settings.BUCKET_REGION_NAME
                    )
    try:
        s3.upload_file(
            filePath, 
            settings.BUCKET_NAME, 
            s3FileName
            )

        # remove file from local to free up space
        os.remove(filePath)

        return True
    except Exception as e:
        logger.error('uploadFileToS3@Error')
        logger.error(e)
        return False

기본 버전이 업데이트되지 않을 수 있습니다.이 명령 추가

AWS_S3_SIGNATURE_VERSION = "s3v4"

settings.py

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

이 조합을 사용해 보세요.

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

저는 3일 동안 꼼짝 못했고 마침내 수많은 블로그와 답변을 읽은 후 아마존 AWS S3 버킷을 구성할 수 있었습니다.

AWS 측면에서

제 생각엔 당신은 이미

  1. s3 버킷 생성
  2. IAM에서 사용자 생성

스텝

  1. CORS 설정 구성

    you 버킷 > 권한 > CORS 구성

    <CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>*</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
    </CORSConfiguration>```
    
    
  2. 버킷 정책 생성

버킷 > 권한 > 버킷 정책

이것과 비슷해야 합니다.

 {
     "Version": "2012-10-17",
     "Id": "Policy1602480700663",
     "Statement": [
         {
             "Sid": "Stmt1602480694902",
             "Effect": "Allow",
             "Principal": "*",
             "Action": "s3:GetObject",
             "Resource": "arn:aws:s3:::harshit-portfolio-bucket/*"
         }
     ]
 }
PS: Bucket policy should say `public` after this 
  1. 액세스 제어 목록 구성

버킷 > 권한 > 액세스 제어 목록

일반인의 출입을 허가합니다.

PS:: 액세제목다음은같과말합다니이록어스▁ps▁say로 표시되어야 .public 天皇 이후에

  1. 공용 액세스 차단 해제

당신의 버킷 > 권한 > 공용 액세스 차단

모든 옵션 편집 및 해제

**에서 **장고 작업 중이신 분들께 의 대사를 해 주시기 바랍니다.settings.py 파일 게시판 **

#S3 BUCKETS CONFIG

AWS_ACCESS_KEY_ID = '****not to be shared*****'
AWS_SECRET_ACCESS_KEY = '*****not to be shared******'
AWS_STORAGE_BUCKET_NAME = 'your-bucket-name'

AWS_S3_FILE_OVERWRITE = False
AWS_DEFAULT_ACL = None
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

# look for files first in aws 
STATICFILES_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'

# In India these settings work
AWS_S3_REGION_NAME = "ap-south-1"
AWS_S3_SIGNATURE_VERSION = "s3v4"

또한 제공처: https://simpleisbetterthancomplex.com/tutorial/2017/08/01/how-to-setup-amazon-s3-in-a-django-project.html

이것이 저에게 해결책이었습니다.

AWS_S3_REGION_NAME = "eu-central-1"
AWS_S3_ADDRESSING_STYLE = 'virtual'

이것은 장고 프로젝트의 settings.py 에 추가해야 합니다.

PHP SDK를 사용하는 방법은 아래와 같습니다.

require 'vendor/autoload.php';

use Aws\S3\S3Client;

use Aws\S3\Exception\S3Exception;


$client = S3Client::factory(
    array(
        'signature' => 'v4',
        'region' => 'me-south-1',
        'key'    => YOUR_AWS_KEY,
        'secret' => YOUR_AWS_SECRET
    )
);

노드js

var aws = require("aws-sdk");

aws.config.update({
    region: process.env.AWS_REGION,
    secretAccessKey: process.env.AWS_S3_SECRET_ACCESS_KEY,
    accessKeyId: process.env.AWS_S3_ACCESS_KEY_ID,
});
var s3 = new aws.S3({
    signatureVersion: "v4",
});
let data = await s3.getSignedUrl("putObject", {
        ContentType: mimeType, //image mime type from request
        Bucket: "MybucketName",
        Key: folder_name + "/" + uuidv4() + "." + mime.extension(mimeType),
        Expires: 300,
    });
  console.log(data);

AWS S3 버킷 권한 구성

Deselect Block All Public Access

Add Below Policy
{
  "Version":"2012-10-17",
  "Statement":[{
  "Sid":"PublicReadGetObject",
    "Effect":"Allow",
  "Principal": "*",
  "Action":["s3:GetObject"],
  "Resource":["arn:aws:s3:::MybucketName/*"
  ]
  }
]
}

그런 다음 반환된 URL을 붙여넣고 이미지의 바이너리 파일로 URL에 PUT 요청을 합니다.

전체 작동 중인 nodejs 버전:

const AWS = require('aws-sdk');

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


const getPreSignedUrl = async () => {
    const params = {
        Bucket: 'some-bucket-name/some-folder',
        Key: 'some-filename.json',
        Expires: 60 * 60 * 24 * 7
    };
    try {
        const presignedUrl = await new Promise((resolve, reject) => {
            s3.getSignedUrl('getObject', params, (err, url) => {
                err ? reject(err) : resolve(url);
            });
        });
        console.log(presignedUrl);
    } catch (err) {
        if (err) {
            console.log(err);
        }
    }
};

getPreSignedUrl();

언급URL : https://stackoverflow.com/questions/26533245/the-authorization-mechanism-you-have-provided-is-not-supported-please-use-aws4

반응형