2017-12-28 3 views
0

私はS3バケットxxxを持っています。 s3バケットからデータにアクセスし、その詳細をRDS PostgreSQLインスタンスに書き込むためのlambda関数を書きました。私は自分のコードでそれをすることができます。ファイルがs3になったときに同じ関数を呼び出すためのラムダ関数に1つのトリガを追加しました。s3バケットから指定されたキーにアクセスしますか?

私のコードからは、名前が 'sampleData.csv'のファイルしか読み取れません。あなたは、私がキー=「SampleData.csv」を言及していることがわかります私のコードから

public class LambdaFunctionHandler implements RequestHandler<S3Event, String> { 

private AmazonS3 s3 = AmazonS3ClientBuilder.standard().build(); 

public LambdaFunctionHandler() {} 

// Test purpose only. 
LambdaFunctionHandler(AmazonS3 s3) { 
    this.s3 = s3; 
} 

@Override 
public String handleRequest(S3Event event, Context context) { 
    context.getLogger().log("Received event: " + event); 
    String bucket = "xxx"; 
    String key = "SampleData.csv"; 




    System.out.println(key); 

    try { 
     S3Object response = s3.getObject(new GetObjectRequest(bucket, key)); 
     String contentType = response.getObjectMetadata().getContentType(); 
     context.getLogger().log("CONTENT TYPE: " + contentType); 
     // Read the source file as text 
     AmazonS3 s3Client = new AmazonS3Client(); 
     String body = s3Client.getObjectAsString(bucket, key); 
     System.out.println("Body: " + body); 
     System.out.println(); 
     System.out.println("Reading as stream....."); 
     System.out.println(); 

     BufferedReader br = new BufferedReader(new InputStreamReader(response.getObjectContent())); 
    // just saving the excel sheet data to the DataBase  
     String csvOutput; 
     try { 
      Class.forName("org.postgresql.Driver"); 
      Connection con = DriverManager.getConnection("jdbc:postgresql://ENDPOINT:5432/DBNAME","USER", "PASSWORD"); 
      System.out.println("Connected"); 
      // Checking EOF 
     while ((csvOutput = br.readLine()) != null) { 
      String[] str = csvOutput.split(","); 
      String name = str[1]; 
      String query = "insert into schema.tablename(name) values('"+name+"')"; 
      Statement statement = con.createStatement(); 
      statement.executeUpdate(query); 

     } 
     System.out.println("Inserted Successfully!!!"); 
     }catch (Exception ase) { 
      context.getLogger().log(String.format(
        "Error getting object %s from bucket %s. Make sure they exist and" 
        + " your bucket is in the same region as this function.", key, bucket)); 
      // throw ase; 
     } 


     return contentType; 
    } catch (Exception e) { 
     e.printStackTrace(); 
     context.getLogger().log(String.format(
      "Error getting object %s from bucket %s. Make sure they exist and" 
      + " your bucket is in the same region as this function.", key, bucket)); 
     throw e; 
    } 
} 

の下に与えられた自分のコードを検討します。特定のファイル名を指定せずにキーを取得する方法はありますか?

答えて

0

これらのリンクが役立ちます。

http://docs.aws.amazon.com/AmazonS3/latest/dev/ListingKeysHierarchy.html http://docs.aws.amazon.com/AmazonS3/latest/dev/ListingObjectKeysUsingJava.html

あなたが特定のファイル名を渡すことなく、探しているキーを見つけるために、プレフィックスと区切り文字を使用してオブジェクトを一覧表示することができます。

+0

本当にありがとう...それは私のために働く.2番目のリンク。もう1つ質問があります。 s3バケットから最新のオブジェクトを取得したい。それを得る方法はありますか?実際に私の要件は、ファイルがs3になると、s3から読み込んでRDS postgreSQLインスタンスに保存することです。 smple.csvがs3になると、ラムダ関数が呼び出され、データはdbに保存されます。次の別のファイル 'sample2.csv'はs3上にあり、sample.csvとsample2.csvが必要です。私はちょうど最新のものを読んでみたいです。何か案が? –

0

S3でイベントの詳細を取得する必要がある場合は、実際にs3イベント通知機能をラムダ機能に有効にすることができます。 Refer the link あなたが名前を付けて、あなたのバケツの内側に、によって

  • 「通知の追加」「イベント」
  • クリックで
  • をクリックし、「プロパティ」の

    1. をクリックし、これを有効にし、イベントの種類を選択することができます
    2. 必要に応じて接頭辞と接尾辞を付けてください。すべてのイベントを考慮する空白のままにしてください。
    3. 「Lambda関数に送信してLambda ARNを指定してください。

    イベントの詳細は、json形式のlambda関数に送信されます。そのjsonから詳細を取得できます。入力は次のようになり:

    { "レコード":[{ "eventVersion": "2.0"、 "のEventSource": "AWS:S3"、 "awsRegion": "AP-南-1"、 {"principalId": "AWS:AIDAJASDFGZTLA6UZ7YAK"}、 "requestParameters":{"sourceIPAddress": "2017-11-23T09:25:54.845Z"、 "eventName": "ObjectRemoved:Delete"、 "userIdentity" ":" 52.95.72.70 "}、" responseElements ":{" x-amz-request-id ":" A235BER45D4974E "、" x-amz-id-2 ":" gluK9ZyNDCjMQrgjFGH0t7Dz19eBrJeIbTCBNI + Pe9tQugeHk88zHOY90DEBcVgruB9BdU0vV8 = "}、" s3 " {"s3SchemaVersion": "1.0"、 "configurationId": "sns"、 "bucket":{"name": "example-bucket1"、 "ownerIdentity":{"principalId": "AQFXV36adJU8"}、 "arn" "例:バケット1"}、 "オブジェクト":{"キー": "SampleData.csv"、 "シーケンサー": "005A169422CA7CDF66"}}}}}

    objectname = event['Records'][0]['s3']['object']['key'](Oops、これはPython用) というキーにアクセスし、この情報をRDSに送信できます。

  • 関連する問題