AWS CLI S3 При вызове операции HeadObject произошла ошибка клиента (403): Запрещено

Я пытаюсь настроить AMI Amazon Linux (ami-f0091d91) и иметь script, который запускает команду копирования для копирования из ведра S3.

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

Этот script отлично работает на моем локальном компьютере, но с ошибкой 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 .

Может кто-нибудь объяснить, что происходит?

Ответ 1

Я понял это. У меня была ошибка в моем шаблоне формирования облаков, который создавал экземпляры EC2. В результате экземпляры EC2, которые пытались получить доступ к указанным выше кодам, разворачивают ведра, находятся в разных регионах (не us-west-2). Похоже, что политики доступа на ведрах (принадлежащие Amazon) разрешают доступ только из региона, в котором они находятся. Когда я исправил ошибку в моем шаблоне (это была неправильная карта параметров), ошибка исчезла

Ответ 2

в моем случае проблема заключалась в выражении Resource в политике доступа пользователя.

Сначала у нас был "Resource": "arn:aws:s3:::BUCKET_NAME", но для того, чтобы иметь доступ к объектам внутри корзины, вам нужен /* в конце: "Resource": "arn:aws:s3:::BUCKET_NAME/*"

Из документации AWS:

Права доступа к корзине указывают, каким пользователям разрешен доступ к объектам в корзине и какие типы доступа они имеют. Права доступа к объекту указывают, каким пользователям разрешен доступ к объекту и какие типы доступа они имеют. Например, у одного пользователя могут быть только права на чтение, а у другого - права на чтение и запись.

Ответ 3

Я получил ошибку A client error (403) occurred when calling the HeadObject operation: Forbidden для моей команды копирования aws cli aws s3 cp s3://bucket/file file. Я использовал роль IAM, которая имела полный доступ S3, используя Inline Policy.

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

Если я дам ему полный доступ S3 от Managed Policies, тогда команда будет работать. Я думаю, что это должно быть ошибкой от Amazon, потому что политики в обоих случаях были точно такими же.

Ответ 4

Пытаясь решить эту проблему самостоятельно, я обнаружил, что нет разрешения HeadBucket. Похоже, что есть, потому что это то, что говорит вам сообщение об ошибке, но на самом деле операция HEAD требует разрешения ListBucket. Я также обнаружил, что моя политика IAM и моя политика корзины были противоречивы. Убедитесь, что вы проверите оба.

Ответ 5

Одна из причин этого может быть, если вы попытаетесь получить доступ к ведрам региона, для которого требуется V4-Signing. Попробуйте явно предоставить область, как --region cn-north-1

Ответ 6

У меня возникла проблема, добавив --recursive в команду.

На данный момент это не совсем понятно, поскольку вы (как я) пытаетесь только скопировать один файл, но он делает трюк!

Ответ 7

В моем случае я получил эту ошибку, пытаясь получить объект в папке S3 Bucket. Но в этой папке моего объекта не было (я поставил не ту папку), поэтому S3 отправил это сообщение. Надеюсь, это может помочь вам тоже.

Ответ 8

Я получил эту ошибку с неправильно настроенным тестовым событием. Я изменил ARN сегментов источника, но забыл изменить имя сегмента S3 по умолчанию.

Т.е. убедитесь, что в разделе сегмента тестового события и ARN, и имя сегмента заданы правильно:

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

Ответ 9

Я получаю это сообщение об ошибке из-за того, что часы моего экземпляра EC2 не синхронизированы.

Я смог исправить на Ubuntu, используя это:

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

Ответ 10

Я получал 403 на запросы HEAD, пока работали запросы GET. Оказалось, что это конфиг CORS в разрешениях s3. Я должен был добавить ГОЛОВУ

<?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>

Ответ 11

Я также испытал такое поведение. В моем случае я обнаружил, что если у политики IAM нет доступа для чтения объекта (s3:GetObject), s3:GetObject та же ошибка.

Я согласен с вами, что ошибка, возникшая в aws console & cli, не очень хорошо объяснена и может привести к путанице.

Ответ 12

Я также испытал этот сценарий.

У меня есть ведро с политикой, которая использует AWS4-HMAC-SHA256. Оказывается, мой awscli не обновляется до последней версии. У меня был aws-cli/1.10.8. Обновление решило проблему.

pip install awscli --upgrade --user

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

Ответ 13

Я понял..

Проблема: "Ошибка загрузки скрипта: фатальная ошибка: при вызове операции HeadObject: Forbidden произошла ошибка (403)", я попытался запустить задание Glue ETL, которое обращается к S3.

Примечание. Файл S3 копируется из той же учетной записи, доступ к нему из того же региона и учетной записи, что и задание на клей.

Решение: Когда я использую Политику AWSGlueServiceRole по умолчанию, моя работа была успешной, но когда я создал свою собственную Политику и такую же, как политика по умолчанию, но изменил ARN, специфичные для моего сегмента и учетной записи, она выдавала ошибку выше. После 48 часов Trail и ошибок я понял, что мы должны использовать определенный регион, как показано ниже. Я вставляю блок json, который разрешил вышеуказанную ошибку.

{"Sid": "VisualEditor1", "Effect": "Allow", "Action": ["s3: CreateBucket", "s3: ListBucket", "s3: GetBucketAcl", "s3: GetBucketLocation", "glue:" ], "Resource": ["arn: aws: glue: ap-south-1:123456788768: каталог /", "arn: aws: s3: bucketXYZ"]}

Вы можете взять JSON политики по умолчанию и изменить ресурсы (регион, область, каталог и т.д.) S3, EC2 и Glue

Ответ 14

Если вы работаете в среде, где учетные данные/роль не ясны, убедитесь, что вы включили --profile=yourprofile чтобы клиент знал, какие учетные данные использовать. Например:

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

будет успешным, в то время как следующее привело к ошибке HeadObject

aws s3 cp s3://yourbucket destination.txt

В настройках профиля указаны записи в файлах config и credentials данных.

Ответ 15

Я получил эту ошибку, когда ведро уже существовало. Поэтому вы можете попробовать переименовать созданное вами ведро.

Ответ 16

Это связано с не авторизованным доступом к корзине. Вы должны перенастроить так:

aws configure

введите свой ключ доступа и секретный ключ доступа. Затем задайте имя региона по умолчанию, такое же, как и область сегмента.

Это будет работать.

Ответ 17

Вам не хватает разрешения HeadBucket.