0

署名済み URL を使用して画像ファイルを AWS s3 バケットにアップロードしたいのですが、スクリーン ショットに示されているエラーが表示されます。このページs3 direct file uploadの投稿に従いました。何を知りたいですか?私が犯している間違いであり、これがサーバー側の問題なのか、それとも「署名済み」URL への put リクエストを作成するために別のアプローチを使用する必要があるのか​​ も知りたいです。

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

1 に答える 1

1

この問題にさらに時間を費やした後、これはサーバー側の問題ではなく、リクエストの作成に問題があることに気付きました。AWS s3 がリクエストを受信すると、そのリクエストの署名とヘッダーをチェックするため、PUT リクエストのヘッダーを設定する必要がありました。そのため、preSignedURL の作成中に「ContentType」または「ACL」を設定している場合は、「Content-リクエストに「x-amz-acl」と入力します。

これは私の更新された「s3Params」です

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

そしてこれが私のリクエストです 更新されたリクエスト ヘッダーのスクリーンショット

最後に、署名付き PUT s3 リクエストのこのポスト セット ヘッダーからいくつかの助けを得ました。

于 2016-12-31T09:17:11.570 に答える