【问题标题】:S3:HeadObject - returns 403 responseS3:HeadObject - 返回 403 响应
【发布时间】:2020-07-29 14:02:56
【问题描述】:

我在 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: '*'

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

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

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

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

谢谢

【问题讨论】:

标签: javascript amazon-web-services amazon-s3 serverless


【解决方案1】:

尝试改变

iamRoleStatements:
    - Effect: Allow
      Action:
        - s3:PutObject
        - s3:GetObject
        - s3:ListBucket
      Resource: "arn:aws:s3:::${self:custom.${self:provider.stage}.tableauBookmarksBucket}/*"

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}"

【讨论】:

  • 就是这样!谢谢
  • 还解决了使用 boto 的 list_objects_v2 时出现的访问被拒绝错误
猜你喜欢
  • 1970-01-01
  • 2014-08-04
  • 2023-02-24
  • 1970-01-01
  • 2019-07-05
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多