Amazon S3 インベントリレポートの空のバージョン ID 文字列を NULL 文字列に変換します。 - Amazon Simple Storage Service

Amazon S3 インベントリレポートの空のバージョン ID 文字列を NULL 文字列に変換します。

注記

以下の手順は、すべてのバージョンを含む Amazon S3 インベントリレポートにのみ適用されます。また、「すべてのバージョン」レポートが S3 バージョニングが有効になっているバケットの S3 バッチオペレーションのマニフェストとして使用される場合に限ります。現在のバージョンのみを指定する S3 インベントリレポートの文字列を変換する必要もありません。

S3 インベントリレポートは、S3 バッチ操作のマニフェストとして使用できます。ただし、バケットで S3 バージョニングが有効になっている場合、すべてのバージョンを含む S3 インベントリレポートはバージョン ID フィールドに空の文字列で NULL バージョン対応オブジェクトをマークします。インベントリレポートにすべてのオブジェクトバージョン ID が含まれる場合、バッチ操作は null 文字列をバージョン ID として使用しますが、空の文字列ではありません。

S3 バッチ操作ジョブが「すべてのバージョン」S3 インベントリレポートをマニフェストとして使用すると、バージョン ID フィールドに空の文字列を含むオブジェクトのすべてのタスクが失敗します。S3 インベントリレポートのバージョン ID フィールドの空文字列をバッチ操作用の null 文字列に変換するには、次の手順を使用します。

バッチ操作で使用するために Amazon S3 インベントリレポートを更新します。
  1. AWS Management Console にサインインし、Amazon S3 コンソール https://console.aws.amazon.com/s3/ を開きます。

  2. S3 インベントリレポートに移動します。インベントリレポートの構成中に指定した宛先バケットにインベントリレポートを配置します。インベントリレポートの場所の詳細については、インベントリリストの検索 を参照してください。

    1. 宛先バケットを選択します。

    2. フォルダを選択します。フォルダの名前は、元のソースバケットにちなんで付けられます。

    3. インベントリ設定の名前が付いたフォルダを選択します。

    4. hive という名前のフォルダの横にあるチェックボックスを選択します。ページの上部で、[S3 URI をコピーする] を選択し、フォルダの S3 URI をコピーします。

  3. https://console.aws.amazon.com/athena/ で Amazon Athena コンソールを開きます。

  4. クエリエディタで、[設定] を選択し、[管理] を選択します。リポジトリの [設定の管理] ページの クエリ結果の場所 で、クエリ結果を保存する 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';
  6. クエリエディタをクリアするには、[Clear] を選択します。次のコマンドを使用して、インベントリレポートをテーブルにロードします。前のステップで選択したもの table_name に置き換えてください。その後、[Run] を選択してクエリを実行します。

    MSCK REPAIR TABLE table_name;
  7. クエリエディタをクリアするには、[Clear] を選択します。以下の SELECT クエリを実行して、元のインベントリレポートのすべてのエントリを取得し、空のバージョン ID を null 文字列に置き換えます。先に選択したもの table_name に置き換え、節内 YYYY-MM-DD-HH-MM をこのツールを実行させたいインベントリー・レポートの日付 WHERE に置き換えます。次に [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';
  8. Amazon S3コンソール(https://console.aws.amazon.com/s3/)に戻り、先ほど クエリ結果の場所 として選択した S3 バケットに移動します。内部には、日付で終わる一連のフォルダがあるはずです。

    例えば、s3://DOC-EXAMPLE-BUCKET/query-result-location/Unsaved/2021/10/07/ のようなものがあるはずです。実行した .csv クエリの結果を含む SELECT ファイルが表示されるはずです。

    最新の更新日の CSV ファイルを選択してください。次のステップのために、このファイルをローカル・マシンにダウンロードします。

  9. 生成された CSV ファイルには、ヘッダー行が含まれています。この CSV ファイルを S3 バッチ操作ジョブの入力として使用するには、ヘッダー行を削除する必要があります。これは、バッチ操作では 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
  10. CSV ファイルからヘッダー行を削除したら、S3 バッチ操作ジョブのマニフェストとして使用する準備が整いました。CSV ファイルを S3 バケットまたは任意の場所にアップロードし、CSV ファイルをマニフェストとして使用して バッチ操作ジョブを作成します。

    バッチ操作のジョブの作成の詳細については、S3 バッチオペレーションジョブの作成 を参照してください。