Я не эксперт AWS, поэтому мне нужна помощь в настройке политик доступа к аудиофайлу S3 Bucket. Быстрое объяснение: Я пытаюсь вызвать лямбда-функцию и получить доступ к аудиофайлу из ведра S3 с частным доступом. Моя лямбда-функция (та же учетная запись aws) должна иметь доступ к mp3-файлу через его URI.
Подробности: Я разрабатываю Alexa Skill в .NET, размещенном на AWS Lambda. Этот навык должен воспроизводить звук, который будет извлечен из корзины S3. Единственный способ воспроизвести аудио — оставить mp3-файл доступным для всех (разрешить общий доступ), но я хочу ограничить доступ только для моей лямбда-функции (та же учетная запись aws). Другими словами: я не хочу, чтобы кто-либо мог получить доступ к этим файлам, только моя лямбда-функция. Всякий раз, когда я настраиваю политику доступа, навык alexa больше не обращается к файлу и возвращает: «Не удалось установить соединение с предоставленным URI аудиофайла».
Я пытался:
Но это не работает.
Кто знает как его правильно настроить?
эй @AnonCoward, я передаю ссылку для игры Alexa, я получил ссылку из сеанса Object Link в ведре: https://my-bucket.s3.sa-east-1.amazonaws.com/my-audio.mp3
Я попытаюсь найти, как получить предварительно подписанную ссылку. Большое спасибо! :D
Вам следует создать роль IAM и связать эту роль IAM с функцией AWS Lambda.
Роль IAM должна иметь следующие разрешения:
AWSLambdaBasicExecutionRole
, которая разрешает функции Lambda отправлять журналы в журналы CloudWatch (см. Роль выполнения Lambda — AWS Lambda){
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Action":"s3:ListBucket",
"Resource":"arn:aws:s3:::BUCKET-NAME"
},
{
"Effect":"Allow",
"Action":[
"s3:PutObject",
"s3:PutObjectAcl",
"s3:GetObject",
"s3:GetObjectAcl",
"s3:DeleteObject"
],
"Resource":"arn:aws:s3:::BUCKET-NAME/*"
}
]
}
Эта политика дает функции Lambda разрешение отображать содержимое корзины, а также загружать/загружать/удалять объекты из корзины.
Если вы просто хотите, чтобы функция Lambda читала файлы в корзине, вы можете уменьшить ее до:
{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Action":"s3:GetObject"
"Resource":"arn:aws:s3:::BUCKET-NAME/*"
}
]
}
Эй, у меня есть аналогичная конфигурация, которая не работает: Роль: { "Версия": "2012-10-17", "Утверждение": [ { "Sid": "VisualEditor0", "Эффект": "Разрешить", " Действие": "s3:GetObject", "Resource": [ "arn:aws:s3:::my-bucket", "arn:aws:s3:::*/*" ] } ] }
Если вы хотите предоставить доступ к любому сегменту, просто используйте: "Resource": "*"
То, что предложил @Anon Coward, сработало отлично!
Вы пытаетесь прочитать аудиофайл в Lambda или передаете ссылку на Alexa для воспроизведения на устройстве? Если вы передаете ссылку, вероятно, вам нужно передать предварительно подписанный URL-адрес, чтобы устройство могло получить доступ к данным. – Анон Трус 24 ноя в 5:47
Я не понимал, что когда я предоставляю Alexa URI через REST API, он не будет разрешен в моей собственной функции. По этой причине у Alexa не было доступа ни к одному файлу. Спасибо вам всем!
Вы пытаетесь прочитать аудиофайл в Lambda или передать ссылку Alexa, чтобы он воспроизвел его на устройстве? Если вы передаете ссылку, вероятно, вам нужно передать предварительно подписанный URL-адрес, чтобы устройство могло получить доступ к данным.