(403) при вызове операции HeadObject: запрещено при доступе к S3 из пакета AWS в python - PullRequest
0 голосов
/ 22 октября 2019

Я создал образ докера, который был сгенерирован из amazonlinux. Это я вручную установил python3, pip и awscli. Я также настроил AWSCLI для использования моего ключа и секретного ключа. Когда я создаю контейнер из изображения, я могу без проблем взаимодействовать с S3.

Затем я генерирую новое изображение из своего собственного изображения выше, используя Dockerfile. В нем я устанавливаю модули, необходимые для этой задачи (boto3, numpy, pandas, scipy и spacy), а также пользовательский код на python. Это изображение является контейнером, который я использую для AWS Batch.

Мой пользовательский код Python пытается загрузить файл из S3, используя:

jsonText = None
s3 = boto3.client('s3', region_name='us-east-1')
with io.BytesIO() as file_stream:
    s3.download_fileobj(args.input_transcript_s3_bucket, args.input_transcript_s3_key, file_stream)
    wrapper = io.TextIOWrapper(file_stream, encoding='utf-8')
    wrapper.seek(0)
    jsonText = wrapper.read()
    wrapper.flush()
    file_stream.flush()

Когда код Python запускается через AWS Batch, яполучить следующую ошибку:

botocore.exceptions.ClientError: An error occurred (403) when calling the HeadObject operation: Forbidden

В другом сообщении по stackoverflow предлагается добавить регион к вызову создания клиента S3. Как и в случае другого автора, это не помогло мне.

Я думаю, что это вопрос политики. Я проверил политику конечных точек VPC и нашел ее достаточной:

{
    "Statement": [
        {
            "Action": "*",
            "Effect": "Allow",
            "Resource": "*",
            "Principal": "*"
        }
    ]
}

Я создал специальную роль службы пакетной обработки. К нему я добавил AWSBatchServiceRole, а также политики AmazonS3FullAccess. Я назначил эту новую служебную роль совершенно новой вычислительной среде без удачи.

Я не уверен, что делать дальше или как получить больше информации. Есть мысли?

Спасибо.

1 Ответ

0 голосов
/ 22 октября 2019

Docker-контейнер запускается с «nobody» в качестве пользователя. Конфигурация AWS (в частности, каталог .aws) была доступна только как пользователь root.

Я изменил контейнер докера, чтобы скопировать каталог .aws из / root в корень диска HD, а затем сделал его доступным для'nobody':

cp -r /root/.aws /
chown nobody /.aws
chgrp nobody /.aws
cd /.aws
chown nobody *
chgrp nobody *

Затем я проверил, чтобы «никто» не мог получить доступ к учетным данным:

su -s /bin/bash nobody
aws s3 ls

Это решило мою проблему.

Я не очень доволен этим решением, так как оно предоставляет мой ключ AWS и секретный ключ пользователю «nobody», но попадаю в ловушку 22. Я создал этот пост, чтобы посмотреть, есть ли другие варианты.

...