Чтение файла из s3 в sagemaker на AWS дает 403 запрещенную ошибку, но другие операции работают с файлом - PullRequest
1 голос
/ 21 февраля 2020

Эта команда:

BUCKET_TO_READ='my-bucket'
FILE_TO_READ='myFile'
data_location = 's3://{}/{}'.format(BUCKET_TO_READ, FILE_TO_READ)
df=pd.read_csv(data_location)

завершается с ошибкой

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

, и я не могу понять, почему. Это должно работать в соответствии с { ссылка }

Вот мои разрешения для корзины:

            "Action": [
                "s3:ListMultipartUploadParts",
                "s3:ListBucket",
                "s3:GetObjectVersionTorrent",
                "s3:GetObjectVersionTagging",
                "s3:GetObjectVersionAcl",
                "s3:GetObjectVersion",
                "s3:GetObjectTorrent",
                "s3:GetObjectTagging",
                "s3:GetObjectAcl",
                "s3:GetObject"

И эти команды работают как положено:

role = get_execution_role()
region = boto3.Session().region_name
print(role)
print(region)

s3 = boto3.resource('s3')
bucket = s3.Bucket(BUCKET_TO_READ)
print(bucket.creation_date)

for my_bucket_object in bucket.objects.all():
    print(my_bucket_object)
    FILE_TO_READ = my_bucket_object.key
    break

obj = s3.Object(BUCKET_TO_READ, FILE_TO_READ)
print(obj)

Все эти операторы печати работали просто отлично.

Я не уверен, имеет ли это значение, но каждый файл находится в папке, поэтому мой FILE_TO_READ выглядит как folder/file.

Эта команда, которая должна загрузить файл в Sagemaker, также сбрасывается с a 403:

import boto3
s3 = boto3.resource('s3')
s3.Object(BUCKET_TO_READ, FILE_TO_READ).download_file(FILE_TO_READ)

Это также происходит, когда я открываю терминал и использую

aws s3 cp AWSURI local_file_name

Ответы [ 2 ]

0 голосов
/ 22 февраля 2020

Причина в том, что мы дали разрешение на ведро, а не на объекты. Это было бы предоставление "Resource": "arn:aws:s3:::bucket-name/", но не "Resource": "arn:aws:s3:::bucket-name/*"

0 голосов
/ 21 февраля 2020

Попробуйте различать действия уровня объекта и действия уровня сегмента в политике IAM. Как то так

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",            
            "Action":   [
                "s3:GetObjectVersionTorrent",
                "s3:GetObjectVersionTagging",
                "s3:GetObjectVersionAcl",
                "s3:GetObjectVersion",
                "s3:GetObjectTorrent",
                "s3:GetObjectTagging",
                "s3:GetObjectAcl",
                "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::bucket-name/*"
        },
        {
            "Effect": "Allow",            
            "Action":   [
                "s3:ListMultipartUploadParts",
                "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::bucket-name"
        }
    ]
}
...