AWS CLI S3调用HeadObject操作时发生客户端错误(403):禁止

时间:2016-03-22 01:36:37

标签: amazon-web-services amazon-s3 aws-cli

我正在尝试设置Amazon Linux AMI(ami-f0091d91)并且有一个运行复制命令的脚本从S3存储桶复制。

 aws --debug s3 cp s3://aws-codedeploy-us-west-2/latest/codedeploy-agent.noarch.rpm .

此脚本在我的本地计算机上运行良好,但在Amazon Image上出现以下错误失败:

2016-03-22 01:07:47,110 - MainThread - botocore.auth - DEBUG - StringToSign:
HEAD


Tue, 22 Mar 2016 01:07:47 GMT
x-amz-security-token:AQoDYXdzEPr//////////wEa4ANtcDKVDItVq8Z5OKms8wpQ3MS4dxLtxVq6Om1aWDhLmZhL2zdqiasNBV4nQtVqwyPsRVyxl1Urq1BBCnZzDdl4blSklm6dvu+3efjwjhudk7AKaCEHWlTd/VR3cksSNMFTcI9aIUUwzGW8lD9y8MVpKzDkpxzNB7ZJbr9HQNu8uF/st0f45+ABLm8X4FsBPCl2I3wKqvwV/s2VioP/tJf7RGQK3FC079oxw3mOid5sEi28o0Qp4h/Vy9xEHQ28YQNHXOBafHi0vt7vZpOtOfCJBzXvKbk4zRXbLMamnWVe3V0dArncbNEgL1aAi1ooSQ8+Xps8ufFnqDp7HsquAj50p459XnPedv90uFFd6YnwiVkng9nNTAF+2Jo73+eKTt955Us25Chxvk72nAQsAZlt6NpfR+fF/Qs7jjMGSF6ucjkKbm0x5aCqCw6YknsoE1Rtn8Qz9tFxTmUzyCTNd7uRaxbswm7oHOdsM/Q69otjzqSIztlwgUh2M53LzgChQYx5RjYlrjcyAolRguJjpSq3LwZ5NEacm/W17bDOdaZL3y1977rSJrCxb7lmnHCOER5W0tsF9+XUGW1LMX69EWgFYdn5QNqFk6mcJsZWrR9dkehaQwjLPcv/29QcM+b5u/0goazCtwU=
/aws-codedeploy-us-west-2/latest/codedeploy-agent.noarch.rpm
2016-03-22 01:07:47,111 - MainThread - botocore.endpoint - DEBUG - Sending http request: <PreparedRequest [HEAD]>
2016-03-22 01:07:47,111 - MainThread - botocore.vendored.requests.packages.urllib3.connectionpool - INFO - Starting new HTTPS connection (1): aws-codedeploy-us-west-2.s3.amazonaws.com
2016-03-22 01:07:47,151 - MainThread - botocore.vendored.requests.packages.urllib3.connectionpool - DEBUG - "HEAD /latest/codedeploy-agent.noarch.rpm HTTP/1.1" 403 0
2016-03-22 01:07:47,151 - MainThread - botocore.parsers - DEBUG - Response headers: {'x-amz-id-2': '0mRvGge9ugu+KKyDmROm4jcTa1hAnA5Ax8vUlkKZXoJ//HVJAKxbpFHvOGaqiECa4sgon2F1kXw=', 'server': 'AmazonS3', 'transfer-encoding': 'chunked', 'x-amz-request-id': '6204CD88E880E5DD', 'date': 'Tue, 22 Mar 2016 01:07:46 GMT', 'content-type': 'application/xml'}
2016-03-22 01:07:47,152 - MainThread - botocore.parsers - DEBUG - Response body:

2016-03-22 01:07:47,152 - MainThread - botocore.hooks - DEBUG - Event needs-retry.s3.HeadObject: calling handler <botocore.retryhandler.RetryHandler object at 0x7f421075bcd0>
2016-03-22 01:07:47,152 - MainThread - botocore.retryhandler - DEBUG - No retry needed.
2016-03-22 01:07:47,152 - MainThread - botocore.hooks - DEBUG - Event after-call.s3.HeadObject: calling handler <function enhance_error_msg at 0x7f4211085758>
2016-03-22 01:07:47,152 - MainThread - botocore.hooks - DEBUG - Event after-call.s3.HeadObject: calling handler <awscli.errorhandler.ErrorHandler object at 0x7f421100cc90>
2016-03-22 01:07:47,152 - MainThread - awscli.errorhandler - DEBUG - HTTP Response Code: 403
2016-03-22 01:07:47,152 - MainThread - awscli.customizations.s3.s3handler - DEBUG - Exception caught during task execution: A client error (403) occurred when calling the HeadObject operation: Forbidden
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/awscli/customizations/s3/s3handler.py", line 100, in call
    total_files, total_parts = self._enqueue_tasks(files)
  File "/usr/local/lib/python2.7/site-packages/awscli/customizations/s3/s3handler.py", line 178, in _enqueue_tasks
    for filename in files:
  File "/usr/local/lib/python2.7/site-packages/awscli/customizations/s3/fileinfobuilder.py", line 31, in call
    for file_base in files:
  File "/usr/local/lib/python2.7/site-packages/awscli/customizations/s3/filegenerator.py", line 142, in call
    for src_path, extra_information in file_iterator:
  File "/usr/local/lib/python2.7/site-packages/awscli/customizations/s3/filegenerator.py", line 314, in list_objects
    yield self._list_single_object(s3_path)
  File "/usr/local/lib/python2.7/site-packages/awscli/customizations/s3/filegenerator.py", line 343, in _list_single_object
    response = self._client.head_object(**params)
  File "/usr/local/lib/python2.7/site-packages/botocore/client.py", line 228, in _api_call
    return self._make_api_call(operation_name, kwargs)
  File "/usr/local/lib/python2.7/site-packages/botocore/client.py", line 488, in _make_api_call
    model=operation_model, context=request_context
  File "/usr/local/lib/python2.7/site-packages/botocore/hooks.py", line 226, in emit
    return self._emit(event_name, kwargs)
  File "/usr/local/lib/python2.7/site-packages/botocore/hooks.py", line 209, in _emit
    response = handler(**kwargs)
  File "/usr/local/lib/python2.7/site-packages/awscli/errorhandler.py", line 70, in __call__
    http_status_code=http_response.status_code)
ClientError: A client error (403) occurred when calling the HeadObject operation: Forbidden
2016-03-22 01:07:47,153 - Thread-1 - awscli.customizations.s3.executor - DEBUG - Received print task: PrintTask(message='A client error (403) occurred when calling the HeadObject operation: Forbidden', error=True, total_parts=None, warning=None)
A client error (403) occurred when calling the HeadObject operation: Forbidden

但是,当我使用--no-sign-request选项运行它时,它可以完美地运行:

 aws --debug --no-sign-request s3 cp s3://aws-codedeploy-us-west-2/latest/codedeploy-agent.noarch.rpm .

有人可以解释一下发生了什么吗?

27 个答案:

答案 0 :(得分:17)

我明白了。我在创建EC2实例的云形成模板中出错。因此,尝试访问上述代码部署存储桶的EC2实例位于不同的区域(不是us-west-2)。看起来桶上的访问策略(由亚马逊拥有)仅允许从它们所属的区域进行访问。 当我在模板中修复错误时(错误的参数图),错误消失了

答案 1 :(得分:9)

就我而言,问题是用户访问策略中的Resource语句。

首先我们有"Resource": "arn:aws:s3:::BUCKET_NAME", 但是为了能够访问存储桶中的对象,最后需要/*"Resource": "arn:aws:s3:::BUCKET_NAME/*"

答案 2 :(得分:8)

我的aws cli copy命令A client error (403) occurred when calling the HeadObject operation: Forbidden收到错误aws s3 cp s3://bucket/file file。我正在使用IAM角色,该角色使用Inline Policy进行完全S3访问。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:*",
      "Resource": "*"
    }
  ]
}

如果我从Managed Policies给它完整的S3访问权限,那么命令就可以了。我认为这必定是来自亚马逊的错误,因为两种情况下的策略完全相同。

答案 3 :(得分:5)

我遇到了这个问题,在命令中添加--recursive会有所帮助。

此时它并没有多大意义,因为你(像我一样)只是试图复制一个文件,但它确实有效!

答案 4 :(得分:5)

我自己尝试解决这个问题,发现没有HeadBucket权限。看起来有,因为这是错误消息告诉您的内容,但实际上HEAD操作需要ListBucket权限。 我还发现我的IAM策略和我的存储桶策略存在冲突。一定要检查两者。

答案 5 :(得分:4)

其中一个原因可能是您尝试访问需要V4签名的区域的存储桶。尝试明确提供该区域,如--region cn-north-1

答案 6 :(得分:3)

就我而言,我在尝试在S3存储桶文件夹中获取对象时遇到此错误。但是在那个文件夹中,我的对象不在这里(我放错了文件夹),因此S3发送此消息。希望它能对您有所帮助。

答案 7 :(得分:2)

HeadObject 中的任何对象上运行 mybucket 时对我有用的最低权限:

        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::mybucket/*",
                "arn:aws:s3:::mybucket"
            ]
        }

答案 8 :(得分:2)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowAllS3ActionsInUserFolder",
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::your_bucket_name",
                "arn:aws:s3:::your_bucket_name/*"
            ]
        }
    ]
}

在策略配置中同时添加"arn:aws:s3:::your_bucket_name""arn:aws:s3:::your_bucket_name/*"可以解决此问题。

答案 9 :(得分:1)

可能有很多原因,(最愚蠢的一个是) 当指定的对象或文件在该位置不存在时,AWS S3 会抛出 403 错误

答案 10 :(得分:1)

我由于配置错误的测试事件而收到此错误。我更改了源存储桶ARN,但忘记了编辑默认的S3存储桶名称。

即确保在测试事件的存储区部分中正确设置了ARN和存储区名称:

"bucket": {
  "arn": "arn:aws:s3:::your_bucket_name",
  "name": "your_bucket_name",
  "ownerIdentity": {
    "principalId": "EXAMPLE"
  }

答案 11 :(得分:1)

由于我的EC2实例的时钟不同步,我收到了此错误消息。

我能够使用以下方法在Ubuntu上进行修复:

sudo ntpdate ntp.ubuntu.com
sudo apt-get install ntp

答案 12 :(得分:0)

我也经历了这种行为。就我而言,我发现如果IAM策略无权读取对象(s3:GetObject),则会引发相同的错误。

我同意您的看法,因为aws console&cli引发的错误并没有得到很好的解释,并且可能引起混乱。

答案 13 :(得分:0)

也许这会对某人有所帮助。就我而言,我正在运行 CodeBuild 作业,而 CodeBuild 执行角色拥有对 S3 的完全访问权限。我试图通过 CLI 列出 S3 存储桶中的密钥。但是,我在 aws-cli Docker 映像中使用 CLI,并根据本文通过环境变量传递凭据:

https://docs.aws.amazon.com/codebuild/latest/userguide/troubleshooting.html#troubleshooting-versions

无论我尝试什么,使用 aws s3api ... 的任何调用都会失败并显示相同的 403 错误。我的解决方案是转换为普通的 s3 CLI 调用(而不是 s3api CLI 调用):

aws s3 ls s3://bucket/key --recursive

这个改变奏效了。使用 aws s3api did not 的调用。

答案 14 :(得分:0)

放弃对整个 s3(所有操作、所有存储桶)的访问权限是一种糟糕的做法,只是为了解锁自己。

上面的 403 错误通常是由于缺少文件的“读取”权限。在 S3 中读取文件的读取操作是 Edit -> Advanced -> Join lines

s3:GetObject

解决方案 1:IAM 中的新策略(告诉角色/用户了解 S3)

您可以使用以下内容创建策略(例如 { "Effect": "Allow", "Action": "s3:GetObject", "Resource": [ "arn:aws:s3:::mybucketname/path/*", "arn:aws:s3:::mybucketname" ] } ),并将其附加到执行该工作的用户或角色。 (例如 EC2 实例的 IAM 角色)

这是您的政策的确切 JSON:(只需替换 MY_S3_READERmybucketname

path

创建此政策。然后,转到 IAM > 角色 > 附加策略并附加它。

解决方案 2:在 S3 中编辑 Buckey 策略(告诉 S3 了解用户/角色)

转到您在 S3 中的存储桶,然后添加以下示例:(替换 { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "s3:GetObject", "Resource": [ "arn:aws:s3:::mybucketname/path/*", "arn:aws:s3:::mybucketname" ] } ] } mybucketname

myip

如果您想将此读取权限更改为按用户或角色(而不是 IP 地址),请删除 { "Version": "2012-10-17", "Id": "SourceIP", "Statement": [ { "Sid": "ValidIpAllowRead", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": [ "arn:aws:s3:::mybucketname", "arn:aws:s3:::mybucketname/*" ], "Condition": { "IpAddress": { "aws:SourceIp": "myip/32" } } } ] } 部分,并将“主体”更改为 Condition

附加说明

  1. 通过 "Principal": { "AWS": "<IAM User/Role's ARN>" },aws s3 cp 手动检查权限以加快调试速度。

  2. 权限更改有时需要长达 30 秒才能生效。要有耐心。

  3. 请注意,要执行“aws s3 ls”(例如 ls),您需要 aws s3 ls s3://mybucket/mypath 访问权限。

  4. 重要通过 s3:ListBucket 或类似工具(例如 AJAX 调用中的 cURL)通过 HTTP(S) URL 访问文件需要您授予 IP 访问权限,或手动提供正确的标题,或先get a signedUrl from the SDK

答案 15 :(得分:0)

我有一个lambda函数做同样的事情,从一个存储桶复制到另一个存储桶。

lambda有权使用源存储桶作为触发器。

“配置”标签

enter image description here

但是它还需要具有使用桶进行操作的权限。

权限标签

enter image description here

如果s3不存在,则需要编辑lambda所使用的角色并将其添加(请参见s3FullAccess)

enter image description here

答案 16 :(得分:0)

权限

此操作需要s3:GetObject权限。欲了解更多 有关信息,请参阅在策略中指定权限。如果对象 请求不存在,Amazon S3返回的错误取决于是否 您还具有s3:ListBucket权限。

path('category/singleproduct/<int:id>', views.singleproduct, name='singleproduct')

以下操作与HeadObject有关:

If you have the s3:ListBucket permission on the bucket, Amazon S3 returns an HTTP status code 404 ("no such key") error.

If you don’t have the s3:ListBucket permission, Amazon S3 returns an HTTP status code 403 ("access denied") error.

来源:https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html

答案 17 :(得分:0)

当我遇到此问题时,我发现我的问题是“源帐户”中的文件被“第三方”复制到那里,而所有者不是源帐户。

我不得不使用--metadata-directive REPLACE将对象重新复制到同一存储桶中

Amazon Documentation

中的详细说明

答案 18 :(得分:0)

如果您从另一个AWS帐户复制文件,请检查对象所有者。

对于我来说,我是从另一个没有acl的aws帐户复制文件的,因此文件的所有者是另一个aws帐户,这意味着该文件属于原始帐户。

要修复此问题,请使用acl复制或同步s3文件,例如:

    if ($country =='US'){
        add_filter( 'gform_currency', 'usd_currency' );
    function usd_currency( $currency ) {
        return 'USD';
        }
    }

答案 19 :(得分:0)

在我的情况下,问题出在策略中-在Visual Editor中指定策略时,我没有选择对象

enter image description here

答案 20 :(得分:0)

我通过正确设置系统时间来解决此问题。

确保aws桶区域正确,并且系统时间与aws区域时间匹配

答案 21 :(得分:0)

涉及跨帐户S3访问

IAM用户策略不会超越为外部帐户中的存储桶定义的策略。

s3:必须允许accountA /用户以及accountB /存储桶中的GetObject

答案 22 :(得分:0)

如果在凭证/角色不明确的环境中运行,请确保包含--profile=yourprofile标志,以便cli知道要使用的凭证。例如:

aws s3 cp s3://yourbucket destination.txt --profile=yourprofile

将成功,而以下内容产生HeadObject错误

aws s3 cp s3://yourbucket destination.txt

配置文件设置引用configcredentials文件中的条目。

答案 23 :(得分:0)

我也遇到过这种情况。

我有一个使用AWS4-HMAC-SHA256的策略的存储桶。原来我的awscli没有更新到最新版本。我的是aws-cli / 1.10.8。升级可以解决问题。

pip install awscli --upgrade --user

https://docs.aws.amazon.com/cli/latest/userguide/installing.html

答案 24 :(得分:0)

在GET请求运行时,我在HEAD请求上收到403。原来是s3权限中的CORS配置。我必须添加HEAD

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>HEAD</AllowedMethod>
    <AllowedMethod>PUT</AllowedMethod>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>

答案 25 :(得分:-1)

这是由于未授权访问存储桶。 您应该像这样重新配置:

aws configure

输入您的访问密钥和秘密访问密钥。然后将默认区域名称设置为与存储桶区域相同。

它将起作用。

答案 26 :(得分:-3)

您缺少 HeadBucket 权限。