2017-10-18 69 views
-1

我目前的AWS設置是一個lambda函數,無論何時我將一個對象放入S3存儲桶時都會被觸發。我在Java中實現了lambda的處理函數。我想要做的只是訪問上傳的文件並觸發lambda函數的執行。例如,如果我上傳sample.json到存儲桶,我想在我的處理函數中訪問這個文件的內容。如何讀取直接觸發lambda執行的上傳文件?

我知道我可以做這樣的事情:

public Void handleRequest(S3Event input, Context context) { 
    for (S3EventNotificationRecord record : input.getRecords()) { 
    String key = record.getS3().getObject().getKey(); 
    String bucket = record.getS3().getBucket().getName(); 
    AmazonS3 s3Client = new AmazonS3Client(credentials); 
    try { 
     S3Object s3Object = s3Client.getObject(new GetObjectRequest(bucket, key)); 
     InputStream input = s3Object.getObjectContent(); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(input)); 
     while (true) { 
     String line = reader.readLine(); 
     if (line == null) break; 
     // Do something with line... 
     } 
// ... 

的問題是,我不能使用快捷鍵。因此,我無法創建一個s3Client來下載文件。換句話說,我必須從我的處理程序方法需要的參數中獲取對象,即S3Event input。我會怎麼做?

+0

LAMBDA不需要訪問鍵使用S3。 – dashmug

+0

@dashmug我想到了。但是,我如何閱讀文件?我能從S3Event輸入中獲得嗎? –

+0

's3Client.getObject(new GetObjectRequest(bucket,key));'似乎是一個好方法。那有什麼問題? – cy3er

回答

1

如果您的Lambda函數配置了適當的IAM角色(允許s3:相關S3對象的GetObject),那麼您不需要在代碼中明確提供憑據。

這裏的Java代碼示例,以獲得一個對象響應對象上傳LAMBDA事件:

package example; 

import java.net.URLDecoder; 

import com.amazonaws.services.lambda.runtime.Context; 
import com.amazonaws.services.lambda.runtime.RequestHandler; 
import com.amazonaws.services.lambda.runtime.events.S3Event; 
import com.amazonaws.services.s3.AmazonS3; 
import com.amazonaws.services.s3.AmazonS3ClientBuilder; 
import com.amazonaws.services.s3.event.S3EventNotification.S3EventNotificationRecord; 

public class S3GetTextBody implements RequestHandler<S3Event, String> { 

    public String handleRequest(S3Event s3event, Context context) { 
     try { 
      S3EventNotificationRecord record = s3event.getRecords().get(0); 

      // Retrieve the bucket & key for the uploaded S3 object that 
      // caused this Lambda function to be triggered 
      String bkt = record.getS3().getBucket().getName(); 
      String key = record.getS3().getObject().getKey().replace('+', ' '); 
      key = URLDecoder.decode(key, "UTF-8"); 

      // Read the source file as text 
      AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient(); 
      String body = s3Client.getObjectAsString(bkt, key); 
      System.out.println("Body: " + body); 
      return "ok"; 
     } catch (Exception e) { 
      System.err.println("Exception: " + e); 
      return "error"; 
     } 
    } 
} 
相關問題