Tengo una función de Lambda escrita en C# que intenta sin éxito cargar un objeto en un depósito de S3. Para fines de prueba, estoy convirtiendo la cadena de entrada en una matriz de bytes y la uso como contenido del objeto. Mi función de controlador se define a continuación:
public void FunctionHandler(string input, ILambdaContext context) { IAmazonS3 client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1); byte[] bytes = new byte[input.Length * sizeof(char)]; Buffer.BlockCopy(input.ToCharArray(), 0, bytes, 0, bytes.Length); using (MemoryStream ms = new MemoryStream()) { foreach (Byte b in bytes) { ms.WriteByte(b); } PutObjectRequest request = new PutObjectRequest() { BucketName = "BUCKET_NAME", Key = "OBJECT_KEY", InputStream = ms }; client.PutObjectAsync(request); } } La función se ejecuta sin errores, pero el objeto no se escribe en S3. Siento que podría tener algo que ver con el método PutObjectAsync , pero no estoy seguro. La interfaz IAmazonS3 incluye un método PutObject , pero cuando intento usar ese método recibo el siguiente error:
'IAmazonS3' no contiene una definición para 'PutObject'
¿Cuál es la mejor manera de cargar un objeto en un depósito de S3 en una función Lambda de C#?
Esta es la función auxiliar que utilizo para colocar objetos de S3 en S3, desde una función lambda de C# (y funciona). Es posible que pueda usar esto como un punto de partida para el suyo.
No estoy seguro de por qué está convirtiendo su cadena en bytes, y en C#/Lambda necesita usar el método PutObjectAsync, no el método PutObject:
public static async Task<bool> PutS3Object(string bucket, string key, string content) { try { using (var client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1)) { var request = new PutObjectRequest { BucketName = bucket, Key = key, ContentBody = content }; var response = await client.PutObjectAsync(request); } return true; } catch (Exception ex) { Console.WriteLine("Exception in PutS3Object:" + ex.Message); return false; } }Debe aplicar await con Async
esperar cliente.PutObjectAsync(solicitud);