Скопируйте файл из одной корзины AWS S3 в другую корзину S3 с помощью Java

#java #amazon-web-services #amazon-s3 #aws-lambda

#java #amazon-веб-сервисы #amazon-s3 #aws-lambda

Вопрос:

Я пытаюсь скопировать файл манифеста из одной корзины, изменить его содержимое и вставить измененный файл в другую корзину S3, используя лямбда-функцию, написанную на Java. Ниже приведен подробный сценарий. Я знаю, как должна запускаться функция lambda. Мне нужна помощь в программе Java, которая будет выполнять действия, описанные в пункте # 4.

  1. Существует 2 корзины AWS S3 (давайте назовем их Bucket_A и Bucket_B).

  2. 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

  3. Bucket_B Folder_B получит текстовый файл, который должен запустить функцию lambda

  4. Базовой программе 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?