Amazon S3 인벤토리 보고서의 빈 버전 ID 문자열을 null 문자열로 변환

Amazon S3 인벤토리 보고서의 빈 버전 ID 문자열을 null 문자열로 변환

참고 다음 절차는 Amazon S3 인벤토리 보고서 중 "모든 버전"을 포함하는 보고서에만, 그리고 S3 버전 관리가 활성화된 버킷에서 "모든 버전" 보고서를 S3 Batch Operations의 매니페스트로 사용하는 경우에만 적용돼요. 현재 버전만 지정하는 S3 인벤토리 보고서에는 문자열을 변환할 필요가 없어요.

S3 인벤토리 보고서를 S3 Batch Operations의 매니페스트로 사용할 수 있어요. 다만 버킷에서 S3 버전 관리가 활성화되면, 모든 버전을 포함하는 S3 인벤토리 보고서는 null 버전 객체를 버전 ID 필드의 빈 문자열로 표시해요. 인벤토리 보고서에 모든 객체 버전 ID가 포함되면, Batch Operations는 null 문자열은 버전 ID로 인식하지만 빈 문자열은 인식하지 못해요.

출처: 문서

본문

S3 Batch Operations 작업이 "모든 버전" S3 인벤토리 보고서를 매니페스트로 사용하면, 버전 ID 필드에 빈 문자열이 있는 객체의 모든 태스크가 실패해요. S3 인벤토리 보고서의 버전 ID 필드에서 빈 문자열을 null 문자열로 변환해 Batch Operations에 사용하려면 다음 절차를 따르세요.

Batch Operations에 사용할 Amazon S3 인벤토리 보고서를 업데이트하는 방법은 다음과 같아요.

  1. AWS Management Console에 로그인하고 https://console.aws.amazon.com/s3/에서 Amazon S3 콘솔을 열어요.
  2. S3 인벤토리 보고서로 이동해요. 인벤토리 보고서는 인벤토리 보고서를 구성할 때 지정한 대상 버킷에 있어요. 인벤토리 보고서 위치 찾기에 대한 자세한 내용은 인벤토리 목록 위치 찾기를 참고하세요. 대상 버킷을 선택하고, 원본 소스 버킷의 이름을 딴 폴더를 선택해요. 인벤토리 구성의 이름을 딴 폴더를 선택하고, hive 폴더 옆의 확인란을 선택해요. Copy S3 URI를 선택해 폴더의 S3 URI를 복사해요.
  3. https://console.aws.amazon.com/athena/에서 Amazon Athena 콘솔을 열어요.
  4. 쿼리 편집기에서 Settings를 선택한 뒤 Manage를 선택해요. Manage settings 페이지의 Location of query result에서 쿼리 결과를 저장할 S3 버킷을 선택해요.
  5. 쿼리 편집기에서 다음 명령으로 인벤토리 보고서의 데이터를 담을 Athena 테이블을 만들어요. table_name을 원하는 이름으로 바꾸고, LOCATION 절에 아까 복사한 S3 URI를 넣은 뒤 Run을 선택해 쿼리를 실행해요.
CREATE EXTERNAL TABLE table_name(bucket string, key string, version_id string) PARTITIONED BY (dt string)ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat' LOCATION 'Copied S3 URI';
  1. 쿼리 편집기를 지우려면 Clear를 선택해요. 그러고 나서 다음 명령으로 인벤토리 보고서를 테이블에 로드해요. table_name을 이전 단계에서 고른 이름으로 바꾼 뒤 Run을 선택해 쿼리를 실행해요.
MSCK REPAIR TABLE table_name;
  1. 쿼리 편집기를 지우려면 Clear를 선택해요. 다음 SELECT 쿼리를 실행해 원본 인벤토리 보고서의 모든 항목을 가져오고 빈 버전 ID를 null 문자열로 바꿔요. table_name을 아까 고른 이름으로 바꾸고, WHERE 절의 YYYY-MM-DD-HH-MM을 이 도구로 실행할 인벤토리 보고서의 날짜로 바꾼 뒤 Run을 선택해 쿼리를 실행해요.
SELECT bucket as Bucket, key as Key, CASE WHEN version_id = '' THEN 'null' ELSE version_id END as VersionId FROM table_name WHERE dt = 'YYYY-MM-DD-HH-MM';
  1. Amazon S3 콘솔(https://console.aws.amazon.com/s3/)로 돌아가 아까 Location of query result로 고른 S3 버킷으로 이동해요. 안에는 날짜로 끝나는 일련의 폴더가 있어야 해요. 예를 들어 s3://amzn-s3-demo-bucket/query-result-location/Unsaved/2021/10/07/ 같은 형식이 보여야 해요. 실행한 SELECT 쿼리 결과를 담은 .csv 파일이 보일 거예요. 가장 최근 수정 날짜의 CSV 파일을 선택하고, 다음 단계를 위해 로컬 머신에 다운로드해요.
  2. 생성된 CSV 파일에는 헤더 행이 있어요. 이 CSV 파일을 S3 Batch Operations 작업의 입력으로 사용하려면 헤더 행을 제거해야 해요. Batch Operations는 CSV 매니페스트의 헤더 행을 지원하지 않거든요. 헤더 행을 제거하려면 파일에 다음 명령 중 하나를 실행해요. file.csv를 CSV 파일 이름으로 바꾸세요.
    • macOS와 Linux – 터미널 창에서 tail 명령을 실행해요. tail -n +2 file.csv > tmp.csv && mv tmp.csv file.csv
    • Windows – Windows PowerShell 창에서 다음 스크립트를 실행해요. File-location을 파일 경로로, file.csv를 파일 이름으로 바꾸세요.
$ins = New-Object System.IO.StreamReader File-location\file.csv
$outs = New-Object System.IO.StreamWriter File-location\temp.csv
try {
  $skip = 0
  while ( !$ins.EndOfStream ) {
    $line = $ins.ReadLine();
    if ( $skip -ne 0 ) {
      $outs.WriteLine($line);
    } else {
      $skip = 1
    }
  }
} finally {
  $outs.Close();
  $ins.Close();
}
Move-Item File-location\temp.csv File-location\file.csv -Force
  1. CSV 파일에서 헤더 행을 제거했으면 S3 Batch Operations 작업의 매니페스트로 사용할 준비가 된 거예요. 원하는 S3 버킷이나 위치에 CSV 파일을 업로드하고, CSV 파일을 매니페스트로 사용해 Batch Operations 작업을 만들어요. Batch Operations 작업 생성에 대한 자세한 내용은 S3 Batch Operations 작업 생성을 참고하세요.

더 알아보기 (Learn more)