複数のS3のオブジェクトをまとめて一括処理!Amazon S3 Batch Operationsを試してみた

Amazon S3 Batch Operationsとは

Amazon S3 Batch Operations は、Amazon S3のバケットに保存されているオブジェクトに対して一括でAPIを実行できる機能です。re:Invent 2018期間中に発表された、比較的新しいAmazon S3の機能です。

S3が数十億におよぶ大量オブジェクトへのバッチ処理機能を発表!(プレビュー) #reinvent

こちらは2019年4月にGenerally Available(一般利用可能)となりました。

GAから少し時間が空いてしまいましたが、以前より気になっていたのでまずは簡単に試してみました。

基本的な手順

基本的な手順は、以前プレビュー提供時期にまとめた以下のブログの通りです。

Amazon S3の新機能「バッチ一括処理」の使い方 #reinvent

  1. 実行対象のオブジェクトを用意する(S3インベントリレポートまたは直接作成したCSV)
  2. CreateJob APIを利用してバッチ一括処理のジョブを作成する
  3. バッチ一括処理完了後に出力されるジョブレポートを確認する

S3インベントリレポートを作成する

一括処理対象のオブジェクトの指定方法は2パターンありますが、今回はS3インベントリレポートから行いました。

S3インベントリレポートの作成方法は以下のブログを参照してください。

【新機能】S3 Inventoryを試してみた #reinvent

S3インベントリレポートを有効化するとオブジェクト一覧のCSVファイルと manifest.json が出力されるようになります。

manifest.json には、CSVファイルのパスが記録されています。例えば以下のような感じです。

{
  "sourceBucket" : "suwa-yuki",
  "destinationBucket" : "arn:aws:s3:::suwa-inventory-report",
  "version" : "2016-11-30",
  "creationTimestamp" : "1560484800000",
  "fileFormat" : "CSV",
  "fileSchema" : "Bucket, Key",
  "files" : [ {
    "key" : "suwa-yuki/inventory-report/data/be964f31-612b-4b09-af74-cda1b7151441.csv.gz",
    "size" : 55,
    "MD5checksum" : "f0bf69af561e333b89ce36c7aa78ef76"
  } ]
}

なお、今回対象にしたオブジェクトは以下の5つのテキストファイルです。

"suwa-yuki","1.txt"
"suwa-yuki","2.txt"
"suwa-yuki","3.txt"
"suwa-yuki","4.txt"
"suwa-yuki","5.txt"

ジョブを作成する

Amazon S3 Batch OperationsはManagement Consoleから実行することができます。「Create job」を選びます。

Regionは、ジョブを実行するリージョンを選びます。今回は東京リージョンにしました。マニフェストファイルはS3インベントリレポートで生成した manifest.json を選びます。

次にオペレーションを設定します。オペレーションは数種類の中から選択できます。

  • コピーの作成
  • Lambda Functionの実行
  • タグの置換
  • ACLの置換
  • リストア

組み込みのオペレーションを選ぶか、またはLambda Functionを作成することで処理を自由に設定することもできます。拡張性があって良いですね。

今回はACLの置換、全てのオブジェクトに対してPublic Read/Writeを付与してみたいと思います。

次に追加オプションを設定します。

Priorityはジョブの優先度です。複数のジョブを稼働させている際に優先順位付けを行う目的で設定します。数値が高ければ高いほど優先度が上がります。ただし確実な優先順位順で処理されるわけではないため、シーケンスに処理を行いたい場合(例えば、優先度高のジョブが終わっていなければ優先度低のジョブが失敗するような依存関係がある場合など)には使用しないでください。

Completion reportを設定すると、各オブジェクトに対する処理結果をCSVにレポートとして出力することができます。全てのタスク、またはエラーが発生したタスクのいずれかを選ぶことができます。

Permissionsはジョブの処理に利用するサービスロールを指定します。こちらは事前に作成しておく必要があります。

サービスロールを作成する

次に、バッチ自体にS3操作の権限を与えるため、サービスロールのIAMを指定します。

今回はオブジェクトに対してACLを付与したいため、以下のようなアクションが可能な権限を与える必要があります。

  • 対象のオブジェクト(バケット)に対するACL書き込み
  • S3インベントリレポートのバケットの読み取り
  • バッチオペレーションのレポートを出力するバケットへの書き込み

Trust Policyは以下のように設定します。

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

Permissions Policyは、今回は以下のように設定します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObjectAcl",
                "s3:PutObjectVersionAcl"
            ],
            "Resource": "arn:aws:s3:::【対象のオブジェクトが格納されているバケット】/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion",
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:s3:::【S3インベントリレポートのバケット】/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:s3:::【バッチのレポートのバケット】/*"
            ]
        }
    ]
}

ポリシーは以下のドキュメントに詳細に書いてありますので、合わせてお読みください。

サマリを確認し、ジョブを作成します。

ジョブを実行する

ジョブの作成に成功するとステータスが「Await your conformation」となっているため、ジョブを指定して「Confirm and run」を実行します。

ステータスが「Complete」に変わったら完了です。

結果がレポートとして出力されていますので、中身を確認してみると以下のようになっています。

suwa-yuki,2.txt,,succeeded,200,,Successful
suwa-yuki,4.txt,,succeeded,200,,Successful
suwa-yuki,5.txt,,succeeded,200,,Successful
suwa-yuki,1.txt,,succeeded,200,,Successful
suwa-yuki,3.txt,,succeeded,200,,Successful

オブジェクトを確認してみると、正しくPublic Read/Writeが設定されていました。

何十億ものオブジェクトを、簡単に操作できます!

Management Consoleからジョブを作成できるのはお手軽で良いですよね。今回はACLを変更するだけの簡単な例でしたが、Lambda Functionを使うと独自の処理や複雑な処理を一括で実行できます。

オブジェクトに対して何か変更を加えるだけではなく、オブジェクトのデータを元に外部サービスに対してのリクエストを行うなどといったこともできます。

フルマネージド is 最高です。ぜひ使っていきましょう!