Amazon Web Services ブログ

Amazon S3 Intelligent-Tiering を使用して Amazon S3 ストレージのコストをきめ細かく大規模に管理

このブログは 2022 年 9 月 7 日に Arun Chandapillai、 Shak Kathir によって執筆された内容を日本語化したものです。原文はこちらを参照してください。

データレイクの構築とスケーリングにおいて、増え続けるデータセットを効率的に管理・保持するには、費用対効果の高いデータストレージが不可欠です。適切なストレージアーキテクチャを選択することで、お客様は迅速に検証して AWS に移行することができます。Amazon S3 Intelligent-Tiering は、データレイクワークフローのすべての段階で、お客様がデータアクセスパターンが変化したときに、パフォーマンスへの影響やオペレーションオーバーヘッドなしに、ストレージコストを自動的に最適化できるストレージクラスです。

このブログでは、開発者とクラウド運用マネージャーが S3 Intelligent-Tiering を使用してストレージコストを最適化する方法について説明します。まず、 S3 Intelligent-Tiering アクセス階層を紹介することから始めます。次に、個々のバケットから始めて、S3 Intelligent-Tiering にオブジェクトを直接アップロードするなど、複数のユースケースに焦点を当てます。続いて、S3 ライフサイクルポリシーを使用して、既存のオブジェクトを S3 Standard または S3 Standard IA から S3 Intelligent-Tiering に移行する方法についても説明します。

後ほど、多数のバケットに対して S3 Intelligent-Tiering ライフサイクルポリシーを大規模に有効化する方法について説明します。ここでは、既存バケットと新規バケットの両方において、アクセスパターンに基づいて S3 Intelligent-Tiering アクセス階層間でオブジェクトを移行する 2 つのシナリオについて説明します。これらのユースケースにより、開発者とクラウド運用マネージャーは、個々のバケットまたは AWS アカウント内の複数のバケットにまたがる大規模な S3 Intelligent-Tiering ストレージクラス設定を管理し、データアクセスパターンの変化に応じてストレージコストを自動的に最適化できるようになります。

S3 Intelligent-Tiering アクセス階層

S3 Intelligent-Tiering は、オブジェクトを次の 3 つのアクセス階層に自動的に保存します:

  • 頻繁にアクセスされるデータ用に最適化された、高頻度アクセス階層
  • アクセス頻度の低いデータ用に最適化された、低コストの低頻度アクセス層
  • ほとんどアクセスされないデータ用に最適化された、非常に低コストのアーカイブインスタントアクセス階層

即時取得を必要としないストレージコストをさらに節約するには、オプションのアーカイブアクセス階層ディープアーカイブアクセス階層を有効にできます。有効化すると、90 日間(90 ~ 730 日で指定可能)アクセスされなかったオブジェクトはアーカイブアクセス層に、180 日後(180 ~ 730 日で指定可能)にはディープアーカイブアクセス階層に移動します。

S3 Intelligent-Tiering ではデータ取り出し料金はかかりません。お客様は、監視と自動化のためのオブジェクトごとの少額の月額料金で S3 Intelligent-Tiering を実装できます。また、自動階層化の対象となる最小オブジェクトサイズは 128 KB です。Amazon S3 Intelligent-Tiering は、128 KB 未満のオブジェクトの最小ストレージ期間と、監視と自動化のための月額料金をなくすことで、ストレージコストをさらに最適化します。

  • 高頻度アクセス階層(自動):作成された、または S3 Intelligent-Tiering に移行されたオブジェクトのライフサイクルが開始されるデフォルトのアクセス階層です。
  • 低頻度アクセス層 (自動):オブジェクトが 30 日間連続してアクセスされない場合、そのオブジェクトは低頻度アクセス層に移動します。
  • アーカイブインスタントアクセス階層(自動):オブジェクトが 90 日間連続でアクセスされない場合、そのオブジェクトはアーカイブインスタントアクセス階層に移動します。
  • アーカイブアクセス層 (オプション):非同期的にアクセスできるデータに対してアーカイブアクセス層を有効にできます。有効化後にアーカイブアクセス層は、少なくとも 90 日間連続してアクセスされなかったオブジェクトを自動的にアーカイブします。アーカイブの最終アクセス時間は最大 730 日まで設定できます。このアクセス階層の標準取り出し時間は 3 ~ 5 時間です。オブジェクトへのより高速なアクセスが必要な場合は、迅速取り出しが選択肢となります。
  • ディープアーカイブアクセス層 (オプション):非同期的にアクセスできるデータに対してディープアーカイブアクセス層を有効にできます。有効化後にディープアーカイブアクセス階層は、180 日間以上連続してアクセスされなかったオブジェクトを自動的にアーカイブします。アーカイブの最終アクセス時間は最大 730 日まで設定できます。このアクセス階層のオブジェクトの標準取得は 12 時間以内です。

ソリューションの概要(個々の S3 バケット)

このセクションでは、以下の手順を説明します:

  1. S3 Intelligent-Tiering ストレージクラスへオブジェクトを直接アップロードする方法
  2. S3 ライフサイクルポリシーを使用して、既存のオブジェクトを S3 Standard または S3 Standard-IA から S3 Intelligent-Tiering に移行する方法

この手順を実行するには、以下の前提条件が必要です:

1. オブジェクトを直接 S3 Intelligent-Tiering にアップロードする

オブジェクトを直接 S3 Intelligent-Tiering ストレージクラスにアップロードするには、ストレージクラスを S3 Intelligent-Tiering として指定する必要があります。これを実行するには、以下の AWS CLI コマンドを使用します。

aws s3api put-object --bucket <bucket_name> --key dir-1/my_images.tar --body my_images.tar --storage-class INTELLIGENT_TIERING

PUT API 操作を使用してオブジェクトを S3 Intelligent-Tiering ストレージクラスにアップロードするには、 x-amz-storage-class リクエストヘッダーでストレージクラスを指定する必要があります。

2. 既存のオブジェクトを S3 Intelligent-Tiering に移行する

アクセスパターンに基づいて、オブジェクトは以下のように自動的にあるアクセス階層から別の階層に移動されます。

  • オブジェクトが S3 Intelligent-Tiering に配置されると、最初は高頻度アクセス階層に保存されます。
  • 30 日間連続でアクセスがない場合:オブジェクトは低頻度アクセス階層に移動されます。
  • 90 日間連続でアクセスがない場合:オブジェクトはアーカイブインスタントアクセス階層に移動されます。

Illustrates the storage class transition based on access patterns

S3 ライフサイクルルールは、 Amazon S3 がオブジェクトのグループに適用するアクションを定義する一連のルールです。以下の手順では、オブジェクトを S3 Standard クラスから S3 Intelligent-tiering に自動的に移行する方法を説明します。

Step 1: 以下のライフサイクルルールは、オブジェクト作成日に基づいてすべてのオブジェクトを S3 Intelligent-Tiering クラスに移行します。以下のように intelligent-tier.json ファイルを作成します。

{
    "Rules": [
        {
            "ID": "Intelligent_Tier_lifecycle",
            "Prefix": "",
            "Status": "Enabled",
            "Transitions": [
                {
                    "Days": 0,
                    "StorageClass": "INTELLIGENT_TIERING"
                }
            ]
        }
   ]
}

Step 2: 以下のコマンドを実行して、バケットに新しいライフサイクルルールを作成します。

aws s3api put-bucket-lifecycle-configuration --bucket <bucket_name> --lifecycle-configuration file://intelligent-tier.json

以下のコマンドを実行して、バケットに設定されたライフサイクルルールを確認/検証します。

aws s3api get-bucket-lifecycle-configuration --bucket <bucket_name>

Illustrates the S3 Intelligent-Tiering S3 Lifecycle rule

Illustrates the storage class after the transition to Intelligent-tiering

アーカイブアクセス階層へのオプトイン設定

即時取得を必要としないストレージコストをさらに節約するには、このセクションの手順に従って、個々のバケットでオプションである非同期のアーカイブアクセス階層およびディープアーカイブアクセス階層をアクティブ化できます。

  • 90 日間(90 ~ 730 日で指定可能)連続でアクセスがない場合:オブジェクトはアーカイブアクセス階層に移動されます。
  • 180 日間(180 ~ 730 日で指定可能)連続でアクセスがない場合:オブジェクトはディープアーカイブアクセス階層に移動されます。

Illustrates the storage class transition based on access patterns.

Step 1: 以下の S3 Intelligent-Tiering のアーカイブ設定は、長期間ほとんどアクセスされないオブジェクト向けに最適化されたアーカイブアクセス階層とディープアーカイブアクセス階層にオブジェクトへ移動します。設定ルールをバケット内のすべてのオブジェクトに適用するか、フィルターを定義して範囲を制限するかを選択できます。フィルターを定義するための 2 つのオプションは、オブジェクトプレフィックスとオブジェクトタグです。以下のスニペットに示すように archive-tier.json を作成します:

{
   "Id":"Archive_Tier",
   "Status":"Enabled",
   "Tierings":[
      {
         "Days":90,
         "AccessTier":"ARCHIVE_ACCESS"
      },
      {
         "Days":180,
         "AccessTier":"DEEP_ARCHIVE_ACCESS"
      }
   ]
}

Step 2(optional): 以下のコマンドを実行して、 S3 Intelligent-Tiering アーカイブ設定を作成します。

aws s3api put-bucket-intelligent-tiering-configuration --bucket <bucket_name> --id Archive_Tier --intelligent-tiering-configuration file://archive-tier.json

以下のコマンドを実行して、バケットの S3 Intelligent-Tiering アーカイブ設定を確認 / 検証します。

aws s3api get-bucket-intelligent-tiering-configuration --bucket <bucket_name> --id Archive_Tier

Illustrates the Intelligent-tiering Archive configuration

Step 3 (optional): 以下の S3 ライフサイクル設定は、それぞれ 1 つのアクションを持つ 2 つのルールを指定しています。

  • 移行アクションは、オブジェクト作成日にすべてのオブジェクトを S3 Intelligent-Tiering ストレージクラスに移行するように Amazon S3 に要求します。
  • 有効期限アクションは、“logs/” プレフィックスを持つすべてのオブジェクトを作成から 365 日後に削除するように Amazon S3 に要求します。
    • オブジェクト有効期限ルールを使用して定期的なオブジェクト削除をスケジュールすることで、削除対象のオブジェクトを特定して Amazon S3 に削除リクエストを送信するプロセスを構築する必要がなくなります。
    • オブジェクトがライフサイクルポリシーに基づいて有効期限に達すると、 Amazon S3 はそれを削除キューに入れ、非同期で削除します。

以下のように intelligent-tier_logs_expire.json を作成します。

{
   "Rules":[
      {
         "ID":"Intelligent_Tier_lifecycle",
         "Filter":{
            "Prefix":""
         },
         "Status":"Enabled",
         "Transitions":[
            {
               "Days":0,
               "StorageClass":"INTELLIGENT_TIERING"
            }
         ]
      },
      {
         "ID":"Logs_Expire_lifecycle",
         "Filter":{
            "Prefix":"logs/"
         },
         "Status":"Enabled",
         "Expiration":{
            "Days":365
         }
      }
   ]
}

Step 4 (optional): 以下のコマンドを実行して、バケットのライフサイクル設定を作成します。

aws s3api put-bucket-lifecycle-configuration --bucket <bucket_name> --lifecycle-configuration file://intelligent-tier_logs_expire.json

以下のコマンドを実行して、バケットに設定されたライフサイクル設定情報を確認 / 検証します。

aws s3api get-bucket-lifecycle-configuration --bucket <bucket_name>

Illustrates the S3 Intelligent-tiering lifecycle rules

HeadObject

HEAD アクションは、オブジェクト自体を返さずにオブジェクトからメタデータを取得します。この操作により、オブジェクトの ‘ ArchiveStatus ’ 属性と他のいくつかの属性が取得されます。

以下のコマンドを実行して、オブジェクトのメタデータを取得します。

aws s3api head-object --bucket <bucket_name> --key <object_key> 

Shows the status of an S3 object in ArchiveStatus

ソリューション概要(大規模な S3 バケット)

このソリューションでは、以下の対象に対して S3 ライフサイクル設定を作成し、非同期のアーカイブアクセス階層にオプトインする方法について説明します:

  1. AWS アカウントの既存の S3 バケット
  2. AWS アカウントの新しく作成された S3 バケット

1. 既存の S3 バケット

既存の S3 バケットについては、 Python スクリプトを使用してリソースタグフィルターに基づいて特定の S3 バケットの S3 ライフサイクル設定を更新できます。

これには、以下の前提条件が必要です:

概略すると、このプロセスは以下のようになります。これらのステップを実行するために AWS CLI を設定します。

  • 以下は使用される S3 ライフサイクル設定とアーカイブポリシーです。
S3 lifecycle configuration
lifecycle_config_settings_it = {
    'Rules': [
        {'ID': 'S3 Intelligent Tier Transition Rule',
         'Filter': {'Prefix': ''},
         'Status': 'Enabled',
         'Transitions': [
             {'Days': 0,
              'StorageClass': 'INTELLIGENT_TIERING'}
         ]}
    ]}
archive_policy = {
        'Id': 'Archive_Tier', 
        'Status': 'Enabled',
        'Tierings': [
            {
                'Days': 90,
                'AccessTier': 'ARCHIVE_ACCESS'
            }, 
            {
                'Days': 180,
                'AccessTier': 'DEEP_ARCHIVE_ACCESS'
            }
        ]
  • バケットの特定のリソースタグに基づいて S3 バケットに設定が適用されます。

タグベースのフィルタリング

bucket_tag_key = "storage.class"

bucket_tag_value = "s3.it"

注:フィルターキーと値は、企業のタグ付け命名規則に基づいて変更できます。

Python スクリプトを実行する AWS IAM ユーザー/ロールに、 ListBuckets, GetBucketTagging, PutBucketLifecycleConfiguration, および PutBucketIntelligentTieringConfiguration の適切な権限があることを確認してください。

Python スクリプトはこちらからダウンロードできます。

2. 新しい S3 バケット

新しい S3 バケットについては、バケット作成イベント通知によってトリガーされる S3 ライフサイクル設定をバケットに適用する Lambda 関数の作成して対応します。

Diagram illustrates the solution overview

概略すると、手順は以下のようになります:

  1. Standard からS3 Intelligent-Tiering にストレージクラスを移行する Lambda 関数を作成する
  2. Lambda 関数には、 S3 バケットの特定のリソースタグに基づいて移行を適用するロジックを含める
  3. Lambda 関数をトリガーする S3 バケット作成イベントをキャプチャする EventBridge ルールを作成する

AWS Lambda 関数の作成

ここでは、バケットタグに基づいて S3 バケットのストレージクラスを移行する Lambda 関数を作成します。この Lambda 関数は、ユースケース 1 で説明したものと同じ S3 バケットタグフィルターとライフサイクル設定を使用します。

Amazon EventBridge ルールを設定して、この Lambda 関数をトリガーすることができます。トリガーされると、 Lambda 関数ハンドラーは EventBridge(CloudWatch)イベントを処理し、S3 バケット名を抽出します。リソースタグフィルター に一致するバケットのみが S3 ライフサイクル設定で更新されます。

AWS Lambda 関数実行ロール

最小権限の原則のベストプラクティスに従い、 Lambda 関数実行ロールには、 S3 バケットに新しいライフサイクル設定を適用するための最小限の権限が必要です。最低限、 PutBucketLifecycleConfiguration, PutBucketIntelligentTieringConfiguration, および GetBucketTagging の権限が必要です。サーバーレス Lambda 関数のログ記記録を有効にすることをお勧めします。AWS 管理ロール AWSLambdaBasicExecutionRole は、ログを CloudWatch にアップロードする権限を付与します。

Lambda 関数はこちらからダウンロードできます。

Amazon EventBridge ルールの作成

以下は、 AWS 管理コンソールを使用して Lambda 関数を呼び出す EventBridge ルールを作成する方法です。

  1. CloudWatch コンソールを開き、左側のナビゲーションペインからイベント → ルールを選択し、ルールの作成ボタンをクリックします
  2. イベントソースで、イベントパターンが選択されていることを確認します
  3. サービス名ドロップダウンで S3 を選択し、イベントタイプバケットレベル操作を選択します
  4. 特定の操作を選択し、バケットの作成を選択します
  5. ターゲットで、先ほど作成した AWS Lambda 関数の名前を選択します
  6. ルールの名前と(オプション)説明を入力します。ルールをすぐにアクティブにするには、有効化ボックスを選択したままにします
  7. 最後に、ルールの作成を選択します

Screenshot shows the Amazon EventBridge rule

クリーンアップ

AWS アカウントでの継続的な料金発生を避けるために、このガイドに従って作成した AWS Lambda リソースを削除してください。

結論

このブログ記事では、特定の状況に応じてストレージコストを最適化するために、個々の S3 バケットまたは複数の S3 バケット全体で S3 Intelligent-Tiering を使用するさまざまな方法について説明しました。データアクセスパターンが変化した場合に、パフォーマンスへの影響や運用上のオーバーヘッドなしに S3 ストレージコストを最適化する方法についてガイダンスを提供しました。あらゆる規模の企業が、より広範なクラウドコスト最適化戦略の一環として、このプロアクティブなアプローチをストレージコスト削減に採用できます。

S3 Intelligent-Tiering は AWS 管理コンソールAWS Command Line Interface(CLI)、および AWS SDK を通じて有効にできます。お客様は、監視と自動化のための少額の月額オブジェクト単位の料金で S3 Intelligent-Tiering を実装できます。詳細については、AWS Well-Architected Frameworkストレージのアーキテクチャベストプラクティス、およびコスト最適化のアーキテクチャベストプラクティスを参照してください。ストレージコスト最適化戦略についてさらに支援が必要な場合は、 AWS サポートと AWS アカウントチームにお問い合わせください。

Arun Chandapillai

Arun Chandapillai

Arun Chandapillai は、ダイバーシティ & インクルージョンの推進者であるシニアクラウドアーキテクトです。彼は、ビジネスファーストのクラウド導入戦略を通じてお客様が IT の近代化を加速し、クラウドでアプリケーションとインフラストラクチャを上手に構築、デプロイ、管理できるよう支援することに情熱を注いでいます。

Shak Kathir

Shak Kathir

Shak Kathirvel は AWS ProServe のシニアクラウドアプリケーションアーキテクトです。顧客との共同作業やアプリケーションの近代化と最適化の取り組みの支援、エンタープライズクラウド管理とガバナンス戦略の指導、ワークロードのクラウドへの移行を楽しんでいます。エンタープライズアーキテクチャ、サーバーレステクノロジー、AWS のコストと使用状況の最適化に情熱を注いでいます。彼はやりがいのある仕事と、刺激的な顧客や同僚と仕事をする機会があることからとても気に入っています。