0

Я хочу загрузить файлы изображений в ведро AWS s3 с использованием предварительно подписанных URL-адресов, но я получаю сообщение об ошибке, показанном на снимке экрана, я следил за сообщением с этой страницы s3 direct file upload, я хотел бы знать, какую ошибку я делаю, а также хочу знать, является ли это проблемой на стороне сервера или я должен использовать другой подход для запроса запроса на «предварительно подписанный» URL-адрес, спасибо заранее ,Лямбда: Амазонка s3 Прямая подпись подписи подписяния не соответствует

Error I'm Getting on Postman

Мой 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

Почему вам нужен подписанный URL для загрузки изображение в лямбда-функции. В качестве альтернативы вы можете иметь роль, под которой работает ваша функция Lambda, чтобы иметь доступ к ведро S3, и этого должно быть достаточно – Rajesh

+0

Спасибо @Rajesh: Можете ли вы предоставить мне пример для этого? что будет полезно для меня, чтобы понять – Balkrishna

+0

@ Rajesh проверить связанное сообщение в блоге. Цель здесь - перетащить/загрузить/загрузить на S3 с веб-страницы, используя предварительно подписанный URL-адрес, сгенерированный «сервером», который на самом деле является синхронной функцией Lambda. Загрузка файла из Lambda неприменима. –

ответ

1

После тратить больше времени на этот вопрос, я понял, что это не проблема на стороне сервера но проблема заключалась в том, чтобы сделать запрос. Мне нужно было установить заголовки для моего запроса PUT, потому что, когда AWS s3 получает какой-либо запрос, он проверяет подпись этого запроса в сравнении с заголовками, поэтому, если вы устанавливаете «ContentType» или «ACL» при создании preSignedURL, тогда вы должны предоставить «Content- Type 'и' x-amz-acl 'в вашем запросе.

Это мой обновленный «s3Params»

var s3Params = { 
       Bucket: 'profile-images', 
       Key: image.name, 
       ACL: 'public-read', 
       ContentType: image.type 
      }; 

И это мой запрос Updated request headers screenshot

Наконец я получил некоторую помощь от этого поста set headers for presigned PUT s3 requests