#java #amazon-web-services #amazon-s3 #aws-lambda
#java #amazon-веб-сервисы #amazon-s3 #aws-lambda
Вопрос:
Я пытаюсь скопировать файл манифеста из одной корзины, изменить его содержимое и вставить измененный файл в другую корзину S3, используя лямбда-функцию, написанную на Java. Ниже приведен подробный сценарий. Я знаю, как должна запускаться функция lambda. Мне нужна помощь в программе Java, которая будет выполнять действия, описанные в пункте # 4.
-
Существует 2 корзины AWS S3 (давайте назовем их Bucket_A и Bucket_B).
-
Bucket_A Folder_A содержит файл manifest.csv со следующим содержимым: CLIENT_NAME,CLIENT_ACCOUNT_NUMBER,PROJECT_NUMBER,PA_NAME,PA_EMAIL,TRANSMISSION_DATE,PRODUCT_TYPE,JOB_TYPE,NUMBER_OF_FILES, ФАЙЛЫ XYZ,XYZ0001,1234567,XYZ,XYZ@gmail.com ,20200825,Q,Q,1,Input.bfc.enc.gz
-
Bucket_B Folder_B получит текстовый файл, который должен запустить функцию lambda
-
Базовой программе Java необходимо- i. Скопировать файл manifest.csv из Bucket_AFolderA ii. Измените значение (Input.bfc.enc.gz ) из столбца с именем FILES на другое имя (скажем, Input.bfc) iii. Вставьте измененный файл в Bucket_B Folder_B
Я новичок как в AWS, так и в Java. Пожалуйста, дайте мне знать, если мне нужно предоставить более подробную информацию о вышеупомянутом сценарии. Следующий код написан до сих пор.
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.apache.commons.io.IOUtils;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.LambdaLogger;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.event.S3EventNotification;
import com.amazonaws.services.s3.model.S3Object;
import com.amazonaws.services.s3.model.S3ObjectInputStream;
public class CopyS3Files implements RequestHandler < S3EventNotification,
Integer > {@Override
public Integer handleRequest(S3EventNotification event, Context context) {
LambdaLogger logger = context.getLogger();
Map < String,
String > MetadataMap; // = new HashMap<String, String>();
int fileCopyFlag = 0;
String currentBucketName = event.getRecords().get(0).getS3().getBucket().getName();
String objectKey = event.getRecords().get(0).getS3().getObject().getKey();
String env = System.getenv("runtime");
logger.log("Environment ==>" env);
System.out.println("bucketName::" currentBucketName);
System.out.println("objectKey::" objectKey);
// AmazonS3 s3 = getAWSClients.getS3(env);
logger.log("Got S3 notification for : " currentBucketName "/" objectKey "n");
S3Object o = AmazonS3ClientBuilder.standard().build().getObject(currentBucketName, objectKey);
S3ObjectInputStream s3is = o.getObjectContent();
logger.log("Fetched S3 Object--" objectKey);
try {
MetadataMap = readMetadata(s3is, logger);
String inputBucketFromMetadata = MetadataMap.get("INPUT_BUCKET");
fileCopyFlag = copyManifestFile(inputBucketFromMetadata, currentBucketName);
if (fileCopyFlag == 1) logger.log("Manifest file copied to the BFC input bucket successfully");
else logger.log("Manifest file could not be copied to the BFC input bucket");
} catch(FileNotFoundException e1) {
logger.log("File Not Found Exception " e1);
e1.printStackTrace();
} catch(IOException e2) {
logger.log("Input Output Exception " e2);
}
return 1;
}
public int copyManifestFile(String inputBucketFromMetadata, String currentBucketName) {
String sourceKey = "manifest.csv";
String destinationKey = "manifest.csv";
/*Need to write the logic to perform steps in point #4 here*/
return 1;
}
public static Map < String,
String > readMetadata(InputStream s3Md, LambdaLogger logger)
throws FileNotFoundException,
IOException {
logger.log("Reading Metadata File.......................");
File tempMetadata = File.createTempFile("Metadata", null);
tempMetadata.deleteOnExit();
FileOutputStream out = new FileOutputStream(tempMetadata);
IOUtils.copy(s3Md, out);
List < Map < String,
String >> namefreq = null;
try (BufferedReader in =new BufferedReader(
new FileReader(tempMetadata))) {
namefreq = in.lines().skip(1).map(line ->line.split("\|")).map(line ->{
Map < String,
String > map = new HashMap < >();
map.put("INPUT_BUCKET", line[0]);
map.put("OUTPUT_BUCKET", line[1]);
map.put("FILE_NAME", line[2]);
map.put("CRYPT_SCHEME", line[3]);
map.put("CRYPT_TYPE", line[4]);
return map;
}).collect(Collectors.toList());
}
logger.log("List of Map contains the contents of Metadata::" namefreq);
System.out.println("List of Map contains the contents of Metadata::" namefreq);
return namefreq.get(0);
}
}
Комментарии:
1. Какой код вы уже написали?
2. Я написал код для ответа на S3EventNotification путем реализации метода AWS handleRequest(). Этот метод вызывает функцию с именем readMetadata(), которая считывает текстовый файл, поступающий в Bucket_B Folder_B, чтобы получить путь Bucket_AFolder_A. После этого мне нужно написать другую функцию — copyS3Files(), которая будет принимать оба этих пути в качестве параметра и выполнять действия, требуемые в пункте # 4. Вы хотите, чтобы я написал код в комментариях? Он большой и здесь не поместится. Я могу вставить его по частям, если вы хотите.
3. Я добавил код, который написан до сих пор в вопросе
4. Может ли кто-нибудь подсказать мне, как выполнить требование, указанное в пункте # 4?