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

Moj*_*ojo 44 amazon-s3 amazon-web-services aws-cli

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

 aws --debug s3 cp s3://aws-codedeploy-us-west-2/latest/codedeploy-agent.noarch.rpm .
Run Code Online (Sandbox Code Playgroud)

此脚本在我的本地计算机上运行良好,但在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
Run Code Online (Sandbox Code Playgroud)

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

 aws --debug --no-sign-request s3 cp s3://aws-codedeploy-us-west-2/latest/codedeploy-agent.noarch.rpm .
Run Code Online (Sandbox Code Playgroud)

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

Moj*_*ojo 20

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

  • 铲斗实际上是在一个区域中定义的. (4认同)
  • 您写道:“存储桶(由Amazon拥有)上的访问策略仅允许从它们所属的区域进行访问。” 铲斗不“属于某个区域”。他们是全球性的。希望我了解导致您改错的原因。 (3认同)

Ane*_*one 20

HeadObject在以下位置的任何对象上运行时对我有用的最小权限mybucket

        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::mybucket/*",
                "arn:aws:s3:::mybucket"
            ]
        }
Run Code Online (Sandbox Code Playgroud)


小智 18

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

  • 如果用户未授权,无论如何都返回403,但如果用户已授权但文件不存在,则返回404不是更好吗? (10认同)
  • 我不同意这是“愚蠢的”。通过使用 403 表示未找到和未授权,它们使得无法确定给定对象是否存在,除非您有权列出它。 (4认同)

tru*_*olf 13

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

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

AWS文档中

存储桶访问权限指定允许哪些用户访问存储桶中的对象以及他们具有哪些访问类型。对象访问权限指定允许哪些用户访问该对象以及他们具有哪些访问类型。例如,一个用户可能只具有读权限,而另一个用户可能具有读和写权限。


sha*_*adi 11

我收到了A client error (403) occurred when calling the HeadObject operation: Forbidden我的aws cli copy命令的错误aws s3 cp s3://bucket/file file.我正在使用一个具有完全S3访问权限的IAM角色Inline Policy.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:*",
      "Resource": "*"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这是一个糟糕的答案 - 您永远不应该允许允许访问所有内容的策略 (31认同)
  • 只要原始错误未修复,这是一种解决方法 (2认同)
  • 我不敢相信三年后我又回到了自己的职位:/ (2认同)

and*_*ien 9

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

  • 这应该是公认的答案 - 另请参阅[这篇 AWS 支持文章](https://aws.amazon.com/premiumsupport/knowledge-center/s3-access-denied-listobjects-sync/)。由于某种原因,存储桶中的对象的“aws s3 cp”需要此权限。 (3认同)

Sco*_*ish 8

我遇到过这个问题,添加--recursive命令会有所帮助.

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

  • 它看起来像成功但本地下载的"文件"实际上是一个空目录 (13认同)

Sau*_*abh 7

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


SAn*_*riy 6

403 - 表示我知道您是谁,但您无权执行您所要求的操作。

就我而言,问题出在策略中 - 在可视化编辑器中指定策略时我没有选择对象

在此输入图像描述


小智 6

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

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

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

aws s3 cp --acl bucket-owner-full-control s3://bucket1/key s3://bucket2/key
Run Code Online (Sandbox Code Playgroud)

  • 已过时,因为根据帮助页面,它已被“--acl”替换(接受 private、public-read、public-read-write、authentiated-read、aws-exec-read、bucket-owner-read 的值、存储桶所有者完全控制和日志传送写入)。感谢您让我走上正轨 (2认同)

Aid*_*din 6

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

上面的403错误通常是由于文件缺乏“读取”权限造成的。用于读取 S3 中文件的 Read 操作是s3:GetObject

        {
            "Effect": "Allow",
            "Action": "s3:GetObject",
            "Resource": [
                "arn:aws:s3:::mybucketname/path/*",
                "arn:aws:s3:::mybucketname"
            ]
        }
Run Code Online (Sandbox Code Playgroud)

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

您可以使用以下内容创建一个策略(例如MY_S3_READER),并将其附加到正在执行该作业的用户或角色。(例如EC2实例的IAM角色)

以下是您的策略的确切 JSON:(只需替换mybucketnamepath

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "s3:GetObject",
            "Resource": [
                "arn:aws:s3:::mybucketname/path/*",
                "arn:aws:s3:::mybucketname"
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

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

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

转到 S3 中的存储桶,然后添加以下示例:(替换mybucketnamemyip

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "s3:GetObject",
            "Resource": [
                "arn:aws:s3:::mybucketname/path/*",
                "arn:aws:s3:::mybucketname"
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

如果您想将此读取权限更改为按用户或角色(而不是 IP 地址),请删除该Condition部分,并将“主体”更改为"Principal": { "AWS": "<IAM User/Role's ARN>" },“。

补充笔记

  1. aws s3 cp通过或手动检查权限aws s3 ls以加快调试速度。

  2. 有时,权限更改最多需要 30 秒才能生效。要有耐心。

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

  4. 重要事项 通过 HTTP(S) URLcURL或类似工具(例如,axios在 AJAX 调用上)访问文件需要您手动授予 IP 访问权限或提供正确的标头,或首先从 SDK 获取签名 URL 。


小智 5

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


小智 5

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowAllS3ActionsInUserFolder",
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::your_bucket_name",
                "arn:aws:s3:::your_bucket_name/*"
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

"arn:aws:s3:::your_bucket_name"和添加"arn:aws:s3:::your_bucket_name/*"到策略配置中为我解决了这个问题。

  • 这将授予所有 S3 权限。建议进行限制,仅授予角色、用户或任务所需的权限级别。 (5认同)

abd*_*wer 5

我将简单地使用以下 AWS IAM 策略,同时牢记 AW​​S 最佳实践和最小权限原则:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Sid1",
            "Effect": "Allow",
            "Action": "s3:ListBucket",
            "Resource": [
                "arn:aws:s3:::[BUCKET_NAME]"
            ]
        },
        {
            "Sid": "Sid2",
            "Effect": "Allow",
            "Action": "s3:GetObject",
            "Resource": [
                "arn:aws:s3:::[BUCKET_NAME]/*"
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)