Лямбда: не совпадает подпись ошибки прямой загрузки 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

Другие вопросы по тегам