Не удается заставить AWS Lambda поместить объект в S3 в ту же учетную запись, несмотря ни на что

#c# #amazon-web-services #amazon-s3 #aws-lambda

Вопрос:

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

В журнале показано, что я создаю временный URL-адрес для чтения файла, он обрабатывается с помощью FFMPEG, я передаю вывод в байт [], в котором отображаются данные, а затем пытаюсь выполнить запрос S3 putObject, который всегда завершается с этим сообщением:

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

Клиент S3-это те же учетные данные, которые я постоянно использую автоматически для загрузки файлов в S3 с разных серверов в разных местах нашей компании. Я попробовал пару разных IAMs, но безрезультатно.

Я не пытаюсь сделать какую-либо подпись вообще. Я просто делаю это:

 var putRequest = new PutObjectRequest  {  BucketName = m.Groups["bucket"].Value,  Key = m.Groups["key"].Value,  InputStream = new MemoryStream(Encoding.UTF8.GetBytes(data ?? "")),  CannedACL = S3CannedACL.PublicRead,  ContentType = MimeTypes.GetMimeType(Path.GetExtension(m.Groups["key"].Value)),  DisablePayloadSigning = true,  };  putRequest.Headers.ContentLength = data.Length;  _context.Logger.LogLine($"Saving file to bucket '{putRequest.BucketName}' and key '{putRequest.Key}' and content type '{putRequest.ContentType}' and content length {putRequest.Headers.ContentLength}");   try  {  await _s3Client.PutObjectAsync(putRequest);  }  catch (AmazonS3Exception s3x)  {  _context.Logger.LogLine($"S3 Exception: {s3x.Message}");  }  

Я проверил ведро и ключ, и они верны. Данные.длина больше 0. Тип контента — «аудио/mpeg», что правильно для .mp3. Данные должны быть записаны.

Моя лямбда работает под управлением AWSLambda_Full_Access со следующими дополнительными правами:

 { "Version": "2012-10-17", "Statement": [  {  "Sid": "VisualEditor0",  "Effect": "Allow",  "Action": [  "s3:ListStorageLensConfigurations",  "s3:ListAccessPointsForObjectLambda",  "s3:GetAccessPoint",  "s3:PutAccountPublicAccessBlock",  "s3:GetAccountPublicAccessBlock",  "s3:ListAllMyBuckets",  "s3:*",  "s3:ListAccessPoints",  "s3:ListJobs",  "s3:PutStorageLensConfiguration",  "s3:ListMultiRegionAccessPoints",  "s3:CreateJob"  ],  "Resource": "*"  } ] }  

У кого-нибудь есть какие-нибудь идеи, что еще я могу упустить? Я застрял на этой проблеме уже более 3 дней и перепробовал все, что мог придумать, так что это должно быть что-то, о чем я не думаю.

Спасибо.

Комментарии:

1. Каковы ценности m.Groups["bucket"].Value и .Groups["key"].Value в чем именно они заключаются?

2. Используя те же учетные данные, сделайте что-нибудь более простое, например, перечислите корзину S3 или загрузите объект S3. Это работает?

3. Зачем использовать creds в лямбда-функции. Вы должны использовать роль IAM, у которой есть разрешения для запуска операций Amazon S3. Я знаю, что взаимодействие с Amazon S3 с помощью лямбда-функции, написанной на Java, не вызывает проблем.

4. возможно, в политике ресурсов вашей корзины S3 есть явный запрет

5. @ErmiyaEskandary {corpRedacted}радио и вывод.mp3.