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

问题描述 投票:0回答:3

我正在 jupyter 笔记本中使用 python。 我正在尝试从 aws s3 存储桶访问多个 parquet 文件并将它们全部转换为一个 json 文件。我知道我可以访问数据,但我得到:

ClientError: An error occurred (AccessDenied) when calling the ListObjects operation: Access Denied

这是我的代码:

import boto3

s3_resource = boto3.resource('s3')

s3_client = boto3.client('s3')
bucket = s3_resource.Bucket(name='my-bucket')

all_objects = s3_client.list_objects(Bucket = 'my-bucket', Prefix = 'Files.parquet')

我不确定拒绝访问是从哪里来的。非常感谢!

python amazon-s3 jupyter-notebook parquet
3个回答
8
投票

您可以点击此链接,并将以下策略附加到用户/角色。

{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "s3:ListBucket"
         ],
         "Resource":"arn:aws:s3:::my-bucket"
      }
   ]
}

1
投票

我做了这个answer中的所有事情,但没有成功。无论如何,你应该先这样做。

对我有用的是在 AWS IAM 控制台中为我的帐户设置新的密钥和秘密,因为我使用的是另一个无权访问 S3 的用户帐户提供的密钥和秘密。

我还在S3中设置了直接访问S3的策略。 点击

Bucket --> Permissions --> Bucket policy
并创建这样的东西:

{
    "Version": "2012-10-17",
    "Id": "Policy1675850598142",
    "Statement": [
        {
            "Sid": "Stmt1675850596389",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::918775241671:user/[email protected]"
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::bucketName"
        }
    ]
}

您还需要在 boto3 中创建经过身份验证的会话才能连接,这是我的完整代码:

import boto3
import awswrangler as wr

# Define your AWS access key and secret key
aws_access_key_id = "SSSSL22FTPTYGZWDF4"
aws_secret_access_key = "fjsidkljfksjfkjs490340+eVcGaXmcamIOrDDzW"

# Use boto3 to create a session with your AWS credentials
session = boto3.Session(
    aws_access_key_id=aws_access_key_id,
    aws_secret_access_key=aws_secret_access_key
)

# Use awswrangler to connect to your S3 bucket
bucket_name = "mybucket"

# List the contents of your S3 bucket
s3 = session.client("s3")
result = s3.list_objects(Bucket=bucket_name)

# Print the contents of the bucket
if "Contents" in result:
    for obj in result["Contents"]:
        print(obj["Key"])
else:
    print("The bucket is empty.")

0
投票

您可能需要使用 VPN 访问您的 AWS 账户。如果您在本地运行该程序并且未连接到 VPN,AWS 将返回此信息。

© www.soinside.com 2019 - 2024. All rights reserved.