Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services Boto3返回调用PutObject操作时发生的错误(AccessDenied):拒绝访问_Amazon Web Services_Amazon S3_Boto3_Amazon Iam - Fatal编程技术网

Amazon web services Boto3返回调用PutObject操作时发生的错误(AccessDenied):拒绝访问

Amazon web services Boto3返回调用PutObject操作时发生的错误(AccessDenied):拒绝访问,amazon-web-services,amazon-s3,boto3,amazon-iam,Amazon Web Services,Amazon S3,Boto3,Amazon Iam,我已经创建了一个具有对S3完全访问权限的策略的用户: 当我设置凭据(~/.aws/credentials)并尝试使用boto3将文件推送到我的存储桶时,它返回调用PutObject操作时发生的错误(AccessDenied):拒绝访问 知道为什么会这样吗 我甚至尝试为根帐户生成一个访问密钥id/秘密访问密钥,但它返回相同的错误。我已经用另一个帐户的凭据运行了我的代码,它工作正常,因此问题出在帐户本身 编辑: 我使用boto3.client('sts').get\u caller\u ident

我已经创建了一个具有对S3完全访问权限的策略的用户:

当我设置凭据(~/.aws/credentials)并尝试使用boto3将文件推送到我的存储桶时,它返回
调用PutObject操作时发生的错误(AccessDenied):拒绝访问

知道为什么会这样吗

我甚至尝试为根帐户生成一个访问密钥id/秘密访问密钥,但它返回相同的错误。我已经用另一个帐户的凭据运行了我的代码,它工作正常,因此问题出在帐户本身

编辑:

我使用
boto3.client('sts').get\u caller\u identity().get('account')
验证了呼叫者ID与我的帐户相同

我没有为我的bucket设置策略,这些是它的权限

这是我课堂上的一个片段

from boto3 import client
from botocore.exceptions import ClientError
from boto3.exceptions import S3UploadFailedError

class AmazonS3(object):
    s3 = client('s3')

@classmethod
def upload_image(cls, bucket_name, object_name, file_content):
    extra_args = {"ACL": "public-read",
                  "ContentType": "image/jpeg" if object_name.split('.')[-1] in ['jpg', 'jpeg'] else "image/png",
                  "ContentDisposition": "inline",
                  "ContentEncoding": "base64"}

    try:
        cls.s3.put_object(Body=file_content, Bucket=bucket_name, Key=object_name, **extra_args)
    except (ClientError, S3UploadFailedError, Exception) as e:
        raise Exception('There was an error when uploading the image')

我发现了问题。在我的代码中,我从一个环境变量中获取了bucket名称,如下面的
os.getenv('AWS\u bucket\u name','X')

在我的部署中,我已经将BUCKET_NAME='Y'设置为环境变量,因此能够列出我的S3 BUCKET并在输出中获取'Y',并且不能将文件上载到'X'而不是'Y'是有意义的,因为
AWS_BUCKET_NAME
在部署期间没有设置


但是错误
调用PutObject操作时发生了一个错误(AccessDenied):“拒绝访问”
具有误导性,并说明我没有正确的权限,而不是说明bucket可能不存在。

请尝试
aws sts get caller identity
,并确保调用由正确的主体进行。桶上有桶策略吗?请包括您以JSON格式设置的任何策略。如果您尝试使用AWS CLI复制文件,该策略是否有效?@JohnRotenstein yes如果它可以从AWS CLI工作,但不能从boto3工作,并且两者都使用相同的凭据,则错误可能出在您的Python代码中。你能在你的问题中加入一个可重复性最低的例子吗?@JohnRotenstein我已经编辑了我的问题。我应该注意到,这段代码已经在另一个环境中工作了几个月,我通过在docker compose文件中设置本地凭据来测试它们。旧的证书有效,但不幸的是新的证书无效。但我已经在容器内尝试了aws s3 cp,它正在工作