AWS - ClientError:调用 GetObject 操作时发生错误 (AccessDenied):访问被拒绝

J. *_*Doe 5 python amazon-s3 amazon-web-services python-3.x

我刚刚使用无服务器部署了 lambda,但不允许我访问我想要的 s3 存储桶。这段代码中有什么明显损坏的地方吗?

service: handler
frameworkVersion: '2'

provider:
  name: aws
  runtime: python3.8
  lambdaHashingVersion: 20201221
  iam:
    role:
      statements:
        - Effect: 'Allow'
          Action:
            - 's3:GetObject'
            - 's3:PutObject'
          Resource: "arn:aws:s3:::my_bucket"
plugins:
  - serverless-python-requirements

package:
  exclude:
    - node_modules/**
functions:
  login:
    handler: handler.login
    events:
     - httpApi:
          path: /login
          method: post
Run Code Online (Sandbox Code Playgroud)

这是尝试访问 s3 的函数

def check_s3(user):
    s3 = boto3.client('s3')
    obj = s3.get_object(Bucket="my_bucket", Key=user)
    data = json.loads(obj['Body'].read())
    return data
Run Code Online (Sandbox Code Playgroud)

我收到的错误:

[ERROR] ClientError: An error occurred (AccessDenied) when calling the GetObject operation: Access Denied
Traceback (most recent call last):
  File "/var/task/handler.py", line 11, in login
    d = check_s3(username)
  File "/var/task/handler.py", line 34, in check_s3
    obj = s3.get_object(Bucket="my_bucket", Key=user)
  File "/var/runtime/botocore/client.py", line 386, in _api_call
    return self._make_api_call(operation_name, kwargs)
  File "/var/runtime/botocore/client.py", line 705, in _make_api_call
    raise error_class(parsed_response, operation_name)
Run Code Online (Sandbox Code Playgroud)

J. *_*Doe 8

问题是我尝试获取的文件不存在


Jas*_*rth 5

您需要使用资源,"arn:aws:s3:::my_bucket/*"因为您获得的是对象,而不是存储桶本身。S3权限


Err*_*rse 5

TL;DR确保您的角色能够胜任s3:ListBucket

我想分享这个问题的答案,因为这对我们的团队来说是一个痛苦,因为我们知道服务器有s3:GetObject但不断收到上述错误。有时,如果对象不存在,您会收到此错误。即您收到以下错误:

ClientError:调用 GetObject 操作时发生错误(AccessDenied):访问被拒绝

而不是像s3_client.exceptions.NoSuchKey. 原因可以在boto3 文档中找到:

在此输入图像描述