1. ホーム
  2. javascript

[解決済み] S3:HeadObject - 403応答を返します。

2022-02-17 12:26:27

質問

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 メソッドを許可するようにしました。バケット内のオブジェクトを head しようとすると 403 が表示されるので、これは効果がないようです。

バケツは公開されておらず、また putObject メソッドを使用してファイルをバケツにアップロードすると、正常に動作します。また、ファイルがバケットに存在する場合、headObject メソッドは 403 で問題なく動作します。

バケットにファイルが存在しない場合、404ではなく403が表示されるのはなぜですか?

ありがとうございます。

解決方法は?

を変更してみてください。

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