S3:HeadObject - 返回 403 响应

red*_* 87 11 javascript amazon-s3 amazon-web-services serverless

我有一个无服务器服务,在 serverless.yml 文件中使用以下配置运行:

service: tableau-export-rest

custom:
  dev:
    tableauBookmarksBucket: tmt-${self:provider.stage}-tableau-bookmarks
  qa:
    tableauBookmarksBucket: tmt-${self:provider.stage}-tableau-bookmarks
  prod:
    tableauBookmarksBucket: tmt-${self:provider.stage}-tableau-bookmarks

provider:
  name: aws
  runtime: nodejs12.x
  region: eu-west-1
  stage:  ${opt:stage, 'dev'}
  timeout: 900
  memorySize: 3008
  environment:
    TABLEAU_BOOKMARKS_BUCKET: ${self:custom.${self:provider.stage}.tableauBookmarksBucket}
  iamRoleStatements:
    - Effect: Allow
      Action:
        - s3:PutObject
        - s3:GetObject
        - s3:ListBucket
      Resource: "arn:aws:s3:::${self:custom.${self:provider.stage}.tableauBookmarksBucket}/*"
    - Effect: Allow
      Action:
        - lambda:InvokeFunction
      Resource: "arn:aws:lambda:*"

functions:
  saveBookmark:
    handler: index.saveBookmark
    timeout: 30
    events:
      - http:
          path: /save-bookmark
          method: post
          cors: 
            origin: '*'
Run Code Online (Sandbox Code Playgroud)

saveBookmark函数看起来像这样:

  const params = {
    Bucket: process.env.TABLEAU_BOOKMARKS_BUCKET,
    Key: 'ABC123'
  }

  s3.headObject(params, (err, data) => {
    if (err) {
      console.log(err);
    } else {
      console.log(data);
    }
  })
Run Code Online (Sandbox Code Playgroud)

由于某种原因,当我尝试将不存在的存储桶中的文件设为 HEAD 时,出现 403 错误。研究问题后,我发现我应该将权限添加s3:ListBucket到无服务器权限列表中,以允许我所做的 headObject 方法。这似乎没有任何效果,因为当我尝试将对象放入桶中时,仍然收到 403 错误。

该存储桶不是公开的,当我尝试使用该putObject方法将文件上传到存储桶时,它工作正常。此外,当文件存在于存储桶中时,headObject 方法可以正常处理 403。

当存储桶中不存在文件时,为什么我会收到 403 而不是 404?

谢谢

jel*_*csc 16

尝试从

iamRoleStatements:
    - Effect: Allow
      Action:
        - s3:PutObject
        - s3:GetObject
        - s3:ListBucket
      Resource: "arn:aws:s3:::${self:custom.${self:provider.stage}.tableauBookmarksBucket}/*"
Run Code Online (Sandbox Code Playgroud)

iamRoleStatements:
    - Effect: Allow
      Action:
        - s3:PutObject
        - s3:GetObject
      Resource: "arn:aws:s3:::${self:custom.${self:provider.stage}.tableauBookmarksBucket}/*"
    - Effect: Allow
      Action: s3:ListBucket
      Resource: "arn:aws:s3:::${self:custom.${self:provider.stage}.tableauBookmarksBucket}"
Run Code Online (Sandbox Code Playgroud)