从 s3 存储桶访问指定的密钥?
Accessing specified key from s3 bucket?
我有一个 S3 存储桶 xxx。我编写了一个 lambda 函数来访问 s3 存储桶中的数据并将这些详细信息写入 RDS PostgreSQL 实例。我可以用我的代码来做。我向 lambda 函数添加了一个触发器,用于在文件落在 s3 上时调用相同的触发器。
但是从我的代码中我只能读取名称为 '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;
}
}
从我的代码中你可以看到我提到了 key="SampleData.csv";有没有办法在不指定特定文件名的情况下获取存储桶中的密钥?
这两个链接会有所帮助。
http://docs.aws.amazon.com/AmazonS3/latest/dev/ListingKeysHierarchy.html
http://docs.aws.amazon.com/AmazonS3/latest/dev/ListingObjectKeysUsingJava.html
您可以使用前缀和定界符列出对象以查找您要查找的键,而无需传递特定文件名。
如果需要获取S3上的事件详情,其实可以启用s3事件通知器到lambda函数。 Refer the link
您可以通过
启用此功能
- 单击存储桶中的 'Properties'
- 点击'Events '
- 点击'Add notification'
- 给出名称和select事件类型(例如放置、删除等)
- 如有必要请给出前缀和后缀,否则留空以考虑所有事件
- 然后 'Sent to' Lambda 函数并提供 Lambda ARN。
现在,事件详细信息将以 json 格式发送 lambda 函数。您可以从 json 中获取详细信息。输入将是这样的:
{"Records":[{"eventVersion":"2.0","eventSource":"aws:s3","awsRegion":"ap-south-1","eventTime":"2017-11-23T09:25:54.845Z","eventName":"ObjectRemoved:Delete","userIdentity":{"principalId":"AWS:AIDAJASDFGZTLA6UZ7YAK"},"requestParameters":{"sourceIPAddress":"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":"arn:aws:s3:::example-bucket1"},"object":{"key":"SampleData.csv","sequencer":"005A169422CA7CDF66"}}}]}
您可以通过 objectname = event['Records'][0]['s3']['object']['key']
访问密钥(哎呀,这是给 python 的)
然后将此信息发送给 RDS。
我有一个 S3 存储桶 xxx。我编写了一个 lambda 函数来访问 s3 存储桶中的数据并将这些详细信息写入 RDS PostgreSQL 实例。我可以用我的代码来做。我向 lambda 函数添加了一个触发器,用于在文件落在 s3 上时调用相同的触发器。
但是从我的代码中我只能读取名称为 '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;
}
}
从我的代码中你可以看到我提到了 key="SampleData.csv";有没有办法在不指定特定文件名的情况下获取存储桶中的密钥?
这两个链接会有所帮助。
http://docs.aws.amazon.com/AmazonS3/latest/dev/ListingKeysHierarchy.html http://docs.aws.amazon.com/AmazonS3/latest/dev/ListingObjectKeysUsingJava.html
您可以使用前缀和定界符列出对象以查找您要查找的键,而无需传递特定文件名。
如果需要获取S3上的事件详情,其实可以启用s3事件通知器到lambda函数。 Refer the link 您可以通过
启用此功能- 单击存储桶中的 'Properties'
- 点击'Events '
- 点击'Add notification'
- 给出名称和select事件类型(例如放置、删除等)
- 如有必要请给出前缀和后缀,否则留空以考虑所有事件
- 然后 'Sent to' Lambda 函数并提供 Lambda ARN。
现在,事件详细信息将以 json 格式发送 lambda 函数。您可以从 json 中获取详细信息。输入将是这样的:
{"Records":[{"eventVersion":"2.0","eventSource":"aws:s3","awsRegion":"ap-south-1","eventTime":"2017-11-23T09:25:54.845Z","eventName":"ObjectRemoved:Delete","userIdentity":{"principalId":"AWS:AIDAJASDFGZTLA6UZ7YAK"},"requestParameters":{"sourceIPAddress":"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":"arn:aws:s3:::example-bucket1"},"object":{"key":"SampleData.csv","sequencer":"005A169422CA7CDF66"}}}]}
您可以通过 objectname = event['Records'][0]['s3']['object']['key']
访问密钥(哎呀,这是给 python 的)
然后将此信息发送给 RDS。