Почему я получаю разные ошибки при попытке прочитать s3 ключ, который не существует - PullRequest
2 голосов
/ 07 мая 2019

У меня есть две среды. Один, я запускаю с рабочего стола, а другой - с Ams-лямбды. Оба из них являются питоном. Код, который у меня есть на моей машине:

import boto3
s3 = boto3.resource('s3')
bucket = 'my-bucket'
obj = s3.Object(bucket,'test.txt')
try:
    text = obj.get()['Body'].read().decode()
    print("file exists"))
except s3.meta.client.exceptions.NoSuchKey:
    print("key does not exist")

Когда я запускаю это, все работает отлично, как и предполагалось.

Когда я запускаю это на лямбду, я получаю

Произошла ошибка (AccessDenied) при вызове операции GetObject: Access Denied

Мои права на лямбду правильные, так что не может быть, поскольку все работает, когда файл существует. Я удаляю файл при каждом запуске, поэтому он не имеет никакого отношения к порядку запуска моего тестового кода. Для отладки я сделал это:

except Exception as e:
    print(e)

Как в моем лямбда-коде, так и в локальном коде, чтобы увидеть, что является настоящей ошибкой На моей локальной машине ошибка:

Произошла ошибка (NoSuchKey) при вызове операции GetObject: указанный ключ не существует.

Когда я запускаю его на своей лямбде, это

Произошла ошибка (AccessDenied) при вызове операции GetObject: доступ запрещен

Почему я получаю разные сообщения об ошибках, и как я могу объяснить это без ленивого решения «кроме всех исключений»? Спасибо

Это CFT для моей лямбды

                {
                  "Effect": "Allow",
                  "Action": [
                    "s3:PutObject",
                    "s3:GetObject",
                    "s3:ListBucket",
                  ],
                  "Resource": {
                    "Fn::Sub": "arn:aws:s3:::my-bucket/*"
                  }

                }

Ответы [ 2 ]

3 голосов
/ 07 мая 2019

От: https://forums.aws.amazon.com/thread.jspa?threadID=56531

Как вы обнаружили, Amazon S3 вернет ошибку AccessDenied, когда запрашивается несуществующий ключ, а запрашивающему не разрешено перечислять содержимое ведра. По определению Amazon S3, не будучи разрешено перечислять содержимое корзины означает, что не разрешено узнайте, существует ли конкретный ключ. Возврат NoSuchKey будет утечка информации о несуществовании запрошенного ключа. Вместо, Amazon S3 возвращает AccessDenied. AccessDenied ничего не говорит о наличии или отсутствии запрошенного ключа, поэтому нет информация просочилась.

Возможно, вам не хватает разрешения перечислять содержимое корзины (s3:listBucket) в лямбда-выражении.

Ссылка: https://docs.aws.amazon.com/AmazonS3/latest/dev/using-with-s3-actions.html#using-with-s3-actions-related-to-buckets

0 голосов
/ 07 мая 2019

Если вы предоставите действительные учетные данные, а объект не существует, вы увидите NoSuchKey.

Если вы не предоставите действительные учетные данные и объект не существует, вы увидите AccessDenied.Это происходит потому, что если вы скажете, NoSuchKey даст вам информацию о существовании (или его отсутствии) объектов.Это мера безопасности.

Есть ли вероятность, что вы ошибаетесь в своих учетных данных Lambda?

...