Amazon S3のオブジェクト操作・一括処理・高速転送
Amazon S3のオブジェクト取得・一覧、Batch Operations、マルチパートアップロード、Transfer Acceleration、データレイク連携を学びます。
S3オブジェクトの取得と一覧
Amazon S3では、オブジェクトのデータを読む操作と、バケット内のキーを列挙する操作を区別します。
GetObjectは、バケットとオブジェクトキーを指定してオブジェクトの内容を取得します。バージョニングを使っている場合は、必要に応じてバージョンIDも指定できます。アクセスには対象オブジェクトを読む権限が必要です。ListObjectsV2は、バケット内のオブジェクトキーと一覧情報を返します。1回のリクエストで返るキーは最大1,000件で、続きがあるときは継続トークンを使って次のページを取得します。バケット内の全件を読むにはページング処理が必要です。ListBucketsはアカウントが所有するバケットの一覧を返す操作です。バケット内のオブジェクト一覧を返すListObjectsV2とは別のAPIです。
ListObjectsV2では、たとえばPrefixでキー名の先頭を絞り込み、Delimiterで階層風にまとめ、MaxKeysで1回に返す件数を制御します。オブジェクトのサイズや最終更新日時を条件にしたサーバー側検索を直接指定するAPIではありません。レスポンスにはサイズなどの情報が含まれるため、一覧を取得した後にアプリケーション側で判定できます。大量データを属性で抽出して一括処理する場合は、S3 InventoryやBatch Operationsのマニフェスト生成条件を利用する方法もあります。
GetObjectは「オブジェクト本体を読む」、ListObjectsV2は「キーを列挙する」という違いを押さえましょう。単にプレフィックス配下のオブジェクトを探す場合は一覧APIを使い、特定のキーが分かっているならGetObjectで直接取得します。
S3 Batch Operationsによる一括操作
S3 Batch Operationsは、多数のオブジェクトに対して同じ種類の処理を一括実行するマネージド機能です。オブジェクトごとに自前のループを実装してAPIを呼び続けるのではなく、対象の一覧と操作をジョブとしてS3に渡し、進捗を追跡できます。数十億規模のオブジェクトを含む処理にも利用できますが、対象数の上限やジョブの同時実行数などサービスクォータは公式資料で確認してください。
主な操作には、次のものがあります。
- オブジェクトのコピー
- オブジェクトタグの追加・置換・削除
- ACLの置換
- Object Lockの保持期間やリーガルホールドの設定
- S3 Glacier Flexible Retrievalなどのアーカイブオブジェクトの復元開始
- オブジェクトの暗号化設定の更新
- AWS Lambda関数の呼び出しによるカスタム処理
1つのジョブが実行する操作は1種類です。たとえば、対象オブジェクトのタグを書き換えるジョブと、その後にLambdaを呼び出すジョブは別々に作成します。大量データに同じ作業を適用する仕組みであり、複数種類の処理を自由に連結するワークフローエンジンではありません。
ジョブの構成要素と実行の流れ
ジョブの作成時には、主に次の情報を指定します。
- 操作:コピーやタグ更新など、各オブジェクトに適用する処理と必要なパラメータ。
- マニフェスト:対象となるバケット、キー、必要に応じてバージョンIDを列挙したオブジェクトリスト。S3 InventoryレポートやCSVを指定でき、条件に基づいてリストを自動生成する方法もあります。
- 実行ロール:S3 Batch Operationsがジョブを実行するために引き受けるIAMロール。マニフェストの読み取り、対象操作、レポート書き込みなどに必要な権限を付与します。
- ジョブ設定:実行優先度、対象アカウント、ジョブを作成するリージョン、確認要否、完了レポートの保存先など。
マニフェストは「どのオブジェクトに処理するか」を定義します。バージョニングされたバケットでは、バージョンIDをマニフェストに含めると特定バージョンを対象にできます。指定しない場合は、操作の仕様に応じて最新バージョンが対象になります。マニフェスト自体は汎用バケットに保存する必要があり、マニフェストや対象オブジェクトのリージョン条件はジョブの作成場所と合わせて確認します。
ジョブは実行中に各タスクの進捗を追跡し、完了時に成功・失敗の結果を含む完了レポートを出力できます。レポートを「失敗したタスクだけ」または「すべてのタスク」にすることで、再実行や監査に役立つ情報を得られます。ジョブの作成・実行には料金が発生するため、大規模ジョブでは対象リストや操作内容を事前に確認します。
マルチパートアップロード
マルチパートアップロードは、1つのオブジェクトを複数のパートに分けてS3へ送信し、最後にS3側で1つのオブジェクトとして完成させる仕組みです。大容量ファイルを並行転送してスループットを高めたり、通信が中断したときに失敗したパートだけを再送したりできます。アップロード中にデータを生成しながら転送する場合にも利用できます。
AWSは、オブジェクトサイズが100 MB以上の場合にマルチパートアップロードの利用を検討することを推奨しています。これは推奨の目安で、APIの最小サイズ条件ではありません。
3段階の処理
- 開始:
CreateMultipartUploadでアップロードを開始し、固有のUpload IDを取得します。 - パート送信:データを番号付きパートに分割し、
UploadPartで個別にアップロードします。各パートは順不同・並列で送信でき、失敗したパートだけ再試行できます。 - 完了:全パートの番号とETag等を指定して
CompleteMultipartUploadを呼び出します。S3はパートを組み立ててオブジェクトを完成させます。
パート数、パートサイズ、オブジェクト全体のサイズには上限があります。現在の汎用バケットの主な制限は次のとおりです。
| 項目 | 制限 |
|---|---|
| オブジェクトの最大サイズ | 48.8 TiB |
| 1回のアップロードの最大パート数 | 10,000 |
| パート番号 | 1〜10,000 |
| パートサイズ | 5 MiB〜5 GiB |
| 最後のパート | 5 MiB未満でもよい |
オブジェクト全体のサイズと10,000パートの上限から、パートサイズを決めます。小さすぎるパートは上限個数に達しやすく、大きすぎるパートは失敗時の再送量やメモリ使用量が増えます。利用する言語SDKやAWS CLIの転送ユーティリティでは、マルチパートへの切り替えサイズ、パートサイズ、同時リクエスト数などを調整できます。これらはクライアント実装ごとの転送設定であり、S3 API共通の「並列数」パラメータではありません。適切な値はネットワーク帯域、処理対象のサイズ、クライアント資源に応じて決めます。
中断したアップロードの後始末
マルチパートアップロードは、開始しただけでは一定時間後に自動失効しません。アプリケーションが完了処理または中止処理を呼ぶまで、送信済みパートは残ります。完了していないパートにもストレージ料金がかかるため、失敗時にはAbortMultipartUploadで中止し、不要なパートを削除します。
中止処理の実装漏れに備えて、S3 LifecycleにAbortIncompleteMultipartUploadアクションを設定できます。指定日数を経過した未完了アップロードを中止し、関連パートを削除します。このルールは完成済みオブジェクトそのものを削除するものではありません。アプリケーションの再試行だけに頼らず、ライフサイクルルールを保険として設けると、放置データと不要な料金の蓄積を抑えられます。
S3 Transfer Acceleration
S3 Transfer Accelerationは、クライアントとS3バケットの距離が長い場合に、ファイル転送を速くするためのバケット単位の機能です。クライアントは最寄りのCloudFrontエッジロケーションへ接続し、そこからAWSの最適化されたネットワーク経路でS3バケットへ転送します。世界各地の利用者が一か所のバケットへアップロードするケースや、遠距離で大容量ファイルを継続的に送るケースに向きます。
Transfer AccelerationはS3バケット間のコピーを自動で高速化する機能ではなく、クライアントからバケットへの転送経路を最適化する機能です。利用するにはバケットで機能を有効化し、アクセラレーション用エンドポイントを使います。仮想ホスト形式のリクエストが必要で、バケット名はDNS準拠かつピリオドを含まないものにします。機能を有効にしてから反映まで時間がかかる場合があり、すべてのリージョンで使えるとは限りません。利用前に対象リージョンとエンドポイント要件を確認してください。
転送経路の追加最適化により料金が発生する場合があります。また、距離やネットワークの状態によっては通常のS3エンドポイントより速くならないこともあります。AWSが提供するTransfer Accelerationの速度比較ツールなどで通常経路と比べ、性能改善が料金に見合うか判断します。
エッジロケーションは、AWSのグローバルネットワーク上で利用者に近い接続地点として使われる設備です。CloudFrontのコンテンツ配信だけでなく、Transfer AccelerationではS3への転送入口として働きます。エッジを経由しても、オブジェクトが保存される先は指定したS3バケットです。
S3をデータレイクとして活用する
データレイクは、構造化・半構造化・非構造化など異なる形式のデータを集約して保存し、用途に応じてカタログ化・加工・分析するアーキテクチャです。データを特定のスキーマや用途に整えてから格納するデータウェアハウスとは対比されますが、両者は排他的ではありません。データレイクのデータを加工してウェアハウスに渡したり、両方を分析で組み合わせたりできます。
Amazon S3は容量を事前に確保せず、多様な形式のデータをオブジェクトとして大規模に保存できるため、データレイクのストレージとしてよく使われます。これは「容量が文字どおり無制限」という意味ではなく、事前にボリュームを割り当てず、必要に応じて伸縮できるという特性です。保存しただけで検索・分析が自動化されるわけではなく、データ形式、パーティション、メタデータ、アクセス権を整える必要があります。
データレイクでは、保存層とコンピュート層を分離し、目的に合わせて複数のサービスを組み合わせます。
- AWS Glue Data Catalog:データセットのテーブル定義やスキーマなどのメタデータをカタログ化します。実データをS3に保存したまま、分析サービスがデータの構造を把握できるようにします。
- Amazon Athena:S3上のデータをSQLで直接クエリするサーバーレス分析サービスです。テーブル定義やデータ形式に応じて、必要なデータを読み取って分析します。
- AWS Glue:カタログ作成に加えて、データの抽出・変換・ロード(ETL)やデータ準備に利用できます。
- Amazon EMR:Apache SparkやHadoopなどの分散処理フレームワークを利用して、大規模なデータ変換・分析を実行します。
- Amazon Redshift:データウェアハウスとして構造化データを分析でき、Redshift Spectrumなどを通じてS3上のデータをクエリする構成も可能です。
AWS Lake Formationは、データレイクを構築・管理する際のデータアクセス統制を支援します。S3上のデータとGlue Data Catalogのメタデータに対する権限を一元的に管理し、Athena、Glue、EMR、Redshift Spectrumなどの分析サービスと連携して、データベース・テーブル・列・行などの細かなアクセス制御を実現できます。Lake FormationはIAMを置き換えるものではなく、IAMの認可と組み合わせてデータレイク向けの権限を管理します。
公式ドキュメント
重要ポイント
- ▸GetObjectは指定したキーのオブジェクトを取得し、ListObjectsV2はPrefixやDelimiterなどを使って一覧を段階的に取得する。サイズを条件にした検索APIではない
- ▸S3 Batch Operationsはマニフェスト内の大量のオブジェクトに単一種類の操作を適用し、進捗管理や完了レポートを提供する
- ▸マルチパートアップロードはパート単位で並行転送・再試行でき、完了リクエスト後にS3が1つのオブジェクトへ組み立てる
- ▸未完了のマルチパートアップロードは明示的な中止かLifecycleのAbortIncompleteMultipartUploadルールで後始末する
- ▸S3 Transfer AccelerationはCloudFrontのエッジロケーションを利用し、遠距離のクライアントからS3汎用バケットへの転送を最適化する
- ▸S3データレイクはAthena、Glue、EMR、Redshiftなどの分析サービスと組み合わせ、Lake Formationで権限を細かく統制できる
このトピックの学習を完了しますか?
完了状態はいつでも切り替えられます
この試験ドメイン内で次の学習に進む
同じサービスの関連トピック
Amazon S3 とストレージ に関連するトピックを続けて確認できます。