Лямбда: не совпадает подпись ошибки прямой загрузки Amazon s3
Я хочу загрузить файлы изображений в корзину AWS s3 с помощью предварительно подписанных URL-адресов, но на снимке экрана появляется сообщение об ошибке, я проследил за публикацией на этой странице прямой загрузки файла s3, хотелось бы узнать, что Я делаю ошибку, а также хочу знать, является ли это проблемой на стороне сервера, или я должен использовать другой подход для отправки запроса на "предварительно подписанный" URL, спасибо заранее.
Мой serverless.yml
service: my-service-api
provider:
name: aws
runtime: nodejs4.3
stage: dev
region: us-east-1
iamRoleStatements:
- Effect: "Allow"
Action:
- "dynamodb:*"
Resource: "*"
- Effect: "Allow"
Action:
- "s3:*"
Resource: "arn:aws:s3:::profile-images/*"
custom:
globalResultTtlInSeconds: 1
package:
individually: true
include:
- node_modules/mysql/**
- node_modules/bluebird/**
- node_modules/joi/**
exclude:
- .git/**
- .bin/**
- tmp/**
- api/**
- node_modules/**
- utils/**
- package.json
- npm_link.sh
- templates.yml
functions:
profiles:
handler: api/profiles/handler.profiles
events:
- http:
method: POST
path: api/profiles/uploadURL
cors: true
integration: lambda
request: ${file(./templates.yml):request}
authorizer:
arn: arn:aws:lambda:us-east-1:000000000000:function:customAuthorizer
resultTtlInSeconds: ${self:custom.globalResultTtlInSeconds}
identitySource: method.request.header.Authorization
package:
include:
- api/profiles/**
- node_modules/node-uuid/**
- node_modules/jsonwebtoken/**
- node_modules/rand-token/**
resources:
Resources:
UploadBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: profile-images
AccessControl: PublicRead
CorsConfiguration:
CorsRules:
- AllowedMethods:
- GET
- PUT
- POST
- HEAD
AllowedOrigins:
- "*"
AllowedHeaders:
- "*"
IamPolicyInvokeLambdaFunction:
Type: AWS::IAM::Policy
Properties:
PolicyName: "lambda-invoke-function"
Roles:
- {"Ref" : "IamRoleLambdaExecution"}
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- "lambda:InvokeFunction"
Resource: "*"
Мой файл обработчика
var s3Params = {
Bucket: 'profile-images',
Key: image.name,
ACL: 'public-read'
};
s3.getSignedUrl('putObject', s3Params, function (err, url){
if(err){
console.log('presignedURL err:',err);
context.succeed({error: err});
}
else{
console.log('presignedURL: ',url);
context.succeed({uploadURL: url});
}
});
1 ответ
Потратив больше времени на эту проблему, я понял, что это не проблема на стороне сервера, но проблема заключалась в создании запроса. Мне нужно было установить заголовки для моего запроса PUT, потому что, когда AWS s3 получает любой запрос, он проверяет сигнатуру этого запроса по сравнению с заголовками, поэтому, если вы устанавливаете ContentType или ACL при создании preSignedURL, вы должны предоставить Content- Введите 'и'x-amz-acl'в вашем запросе.
Это мой обновленный "s3Params"
var s3Params = {
Bucket: 'profile-images',
Key: image.name,
ACL: 'public-read',
ContentType: image.type
};
Наконец, я получил некоторую помощь от этого заголовка набора постов для заданных запросов PUT s3