S3コンソールからバッチオペレーションジョブでオブジェクトのコピーと復元を実行する

マニフェストファイルを準備すれば、多数のオブジェクトに対しても簡単にコピーや復元を実行できそうでした。
2024.05.20

データアナリティクス事業本部 機械学習チームの鈴木です。

S3のライフサイクルでオブジェクトクラスを変更するライフサイクルポリシーを設定しているときに、複数のファイルを標準クラスに戻したり復元したりするのってどうするのがいいんだろうと思っていましたが、S3バッチオペレーションジョブを使えばできそうなことを知りました。

この機能はre:Invent 2018期間中に発表されたもので、今となっては歴史も長い機能ですが、私はたまたま使う機会がなかったため、まずはS3コンソールから使ってみました。

バッチオペレーションジョブについて

Amazon S3オブジェクトに対して大規模なバッチオペレーションを実行するための機能です。

ユーザーはCSVやS3インベントリで生成されるJSONレポート形式のマニフェストファイルを準備し、マニフェストファイルに記載のオブジェクトに対してオペレーションを実行することができます。

バッチオペレーションジョブはオブジェクトに対して操作を行うため、その権限を付与したIAMロールを準備する必要があります。

多数のオペレーションをサポートしており、記事執筆時点では以下がありました。

  • オブジェクトのコピー
  • AWS Lambda 関数の呼び出し
  • すべてのオブジェクトタグを置換する
  • すべてのオブジェクトタグを削除する
  • アクセスコントロールリストを置き換える
  • バッチオペレーションを使ってオブジェクトを復元する
  • S3 オブジェクトロックの保持
  • S3 オブジェクトロックのリーガルホールド
  • S3 バッチレプリケーションを使用した既存のオブジェクトのレプリケーション

S3 バッチ操作でサポートされるオペレーションより

準備

まずは検証のための準備について記載します。

オブジェクトのアップロード

検証用のS3バケットに、2つだけですがオブジェクトをアップロードしておきました。

アップロードしたオブジェクト

パスはbatch_operation/source/test1.txtのように配置しました。パスはなんでもよいのですが、マニフェストファイルと、後で行うコピー結果に現れるので明記しておきます。

マニフェストファイルの作成

今回は手でCSV形式のマニフェストファイルを作成しました。バケット名は自身のものに置き換えてください。

manifest.csv

バケット名,batch_operation/source/test1.txt
バケット名,batch_operation/source/test2.txt

CSVを手作りする場合、マニフェストファイルは2または3列になります。上記の例は3列目がありませんが、オペレーション対象がバージョニングされている場合に、バージョンIDを指定するために使います。バージョンIDが指定されていない場合は、最新バージョンに対して処理が実行されるそうです。

このファイルをS3バケットにアップロードしておきました。

マニフェストファイル

パスはバッチオペレーションジョブで後ほど指定します。

マニフェストファイルはS3インベントリレポートを使用することもできます。また、S3コンソール以外からであれば、オブジェクトフィルター条件に基づいてマニフェストを自動的に生成させることもできるようです。

IAMロールの作成

バッチオペレーションジョブがオペレーション実行対象のオブジェクトや結果、マニフェストファイルにアクセスできるよう、IAMロールを作成しておく必要がありました。

今回はコピーと復元を試してみたかったので、以下の2つのIAMポリシーを作成しました。

コピー用のポリシー

以下の定義でIAMポリシーを作成しました。

コピー用のポリシーJSON

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl",
                "s3:PutObjectTagging"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::コピー先のS3バケット/*"
        },
        {
            "Action": [
                "s3:GetObject",
                "s3:GetObjectAcl",
                "s3:GetObjectTagging",
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::コピー対象のオブジェクトがあるS3バケット",
                "arn:aws:s3:::コピー対象のオブジェクトがあるS3バケット/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": [
                "arn:aws:s3:::マニフェストファイルがあるS3バケット/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::レポートを配置するS3バケット/*"
            ]
        }
    ]
}

復元用のポリシー

以下の定義でIAMポリシーを作成しました。

復元用のポリシーJSON

{
  "Version":"2012-10-17",
  "Statement":[
    {
      "Effect":"Allow",
      "Action":[
          "s3:RestoreObject"
      ],
      "Resource": "arn:aws:s3:::復元対象のオブジェクトがあるS3バケット/*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:GetObjectVersion"
      ],
      "Resource": [
        "arn:aws:s3:::マニフェストファイルがあるS3バケット/*"
      ]
    },
    {
      "Effect":"Allow",
      "Action":[
        "s3:PutObject"
      ],
      "Resource":[
        "arn:aws:s3:::レポートを配置するS3バケット/*"
      ]
    }
  ]
}

上記は、以下のガイドの記載と同じです。ほかのオペレーションについてもポリシー定義のサンプルがあるのでご確認ください。

次に、IAMロールを作成しました。今回はマネジメントコンソールから作成しました。

IAMのコンソールよりロールを作成からIAMロールを作成しました。

信頼されたエンティティを選択ではユースケースとしてS3を選択すると、S3 Batch Operationsがあるのでこちらを選択しました。

ロールを作成

先に作成したIAMポリシーを設定し、cm-nayuts-batch-oparation-roleという名前でロールを作成しました。

このとき、信頼ポリシーは以下のようになっており、Principalでbatchoperations.s3.amazonaws.comが指定されていることに注意するとよさそうでした。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "batchoperations.s3.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

コピーの実行

まずはシンプルにオブジェクトのコピーをやってみました。

1. ジョブの作成

S3コンソールの左メニューからバッチオペレーションを選択し、ジョブの作成を押しました。

バッチオペレーションの選択

マニフェストファイルを選択する画面になるので、CSV形式を選び、マニフェストファイルのパスを指定しました。

マニフェストを選択画面

次の画面でオペレーションを選択しました。

以下の画像にあるように、かなり多くのオペレーションがサポートされていました。

オペレーションを選択

コピー時にはストレージクラスが選択できるので、一括のアーカイブなどにも使えそうでした。今回は単にコピーしてみたいだけなので、スタンダードを選びました。

ストレージクラス

コピー先のバケットを指定しました。同じ名前の既存のオブジェクトは上書きされますは問題なかったのでチェックを入れておきました。

コピー先

追加オプションとして、デフォルト以外にしたいものを設定をしました。

完了レポートは中身に関心があったので生成するようにしてみました。レポートの送信先はIAMロールが書き込める場所にしました。

完了レポートの場所

アクセス許可では、作成していたIAMロールを指定しました。

アクセス許可

これでバッチオペレーションの作成は終わりです。

2. ジョブの実行

バッチオペレーション画面でしばらく待つと、実行のための確認待ちにステータスが遷移するので、実行したいジョブを選択してジョブを実行を押しました。

ジョブを実行

完了済みになるのを待ちました。

完了済み

3. コピー結果の確認

以下のようにコピーが作成されていました。オブジェクトが作成されるパスは、ジョブに設定した送信先の下にマニフェストファイルのキーが作成されるようだったので、少し注意が必要そうでした。

コピー結果のオブジェクト

完了レポートも指定した場所にできていました。

完了レポート例

バケット名,batch_operation/source/test1.txt,,succeeded,200,,Successful
バケット名,batch_operation/source/test2.txt,,succeeded,200,,Successful

コピーの実行(異なるストレージクラスへ)

標準 - IAからスタンダードへのコピー

コピーの際にストレージクラスが選択できたので、標準 - IAからスタンダードクラスへのコピーも試してみました。

まずオブジェクトを標準 - IAへ設定しておきました。

標準 - IAへの設定

続いて、先ほどと同じようにコピーのジョブを実行しました。コピーの際、ストレージクラスはスタンダードを選びました。

実行すると、以下のようにコピーできました。

スタンダードへのコピー結果

アーカイブの復元

Glacierからの復元

以下のように、Glacier Flexible Retrevalへアーカイブしたオブジェクトを用意しました。

Glacierへの設定

コピーと同様にジョブを作成しますが、オペレーションは復元にしました。このとき、どのストレージクラスからかと復元されたコピーが利用可能な日数、取得階層を設定できました。

復元設定

ジョブを実行すると、アーカイブしたオブジェクトに対して確かに復元が行われたことを確認できました。

復元中のオブジェクト

最後に

今回はS3コンソールからのバッチオペレーションジョブの実行の仕方についてでした。オブジェクトのコピーと復元を紹介しました。

複数のオブジェクトに対して一気に処理が実行できたのでとても便利でした。

マニフェストファイルについては、S3インベントリでレポートという形で生成できるので、こちらについてもまた試してみたいなと思いました。

また、コンソール以外からであれば、プレフィクス指定で自動で生成もできるようだったので、使いこなせるとよさそうでした。

参考になりましたら幸いです。