2017-04-08 337 views
1

我有一个用C#编写的Lambda函数,尝试将对象上传到S3存储桶失败。出于测试目的,我将输入字符串转换为字节数组并将其用作对象内容。我的处理函数的定义如下:AWS Lambda C#将对象上传到S3

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); 
    } 
} 

功能无差错运行,但对象不会写入到S3。我觉得这可能与PutObjectAsync方法有关,但我不积极。该IAmazonS3接口包括PutObject方法,而是企图用这种方法我收到以下错误时:

'IAmazonS3' does not contain a definition for 'PutObject'

什么是载对象的S3存储在C#lambda函数的最佳方式?

回答

2

这是我使用C#lambda函数将S3对象放到S3中的帮助器函数(以及它的工作原理)。您可能可以将其作为您的起点。

不知道为什么你正在你的字符串转换为字节,并在C#/λ您需要使用PutObjectAsync方法,而不是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; 
      } 
     } 
1

你应该申请等待与异步

await client.PutObjectAsync(request);