Gunosy Tech Blog

Gunosy Tech Blogは株式会社Gunosyのエンジニアが知見を共有する技術ブログです。

データ基盤のコストをAmazon S3 Intelligent-Tieringで削減する

こんにちは。id:skozawa です。

こちらの記事は Gunosy Advent Calendar 2024 の 8 日目の記事です。 昨日は takuji さんの LLM を使った広告問い合わせ対応の話 でした。

この記事では Gunosy で運用しているデータ基盤のコスト最適化の話を紹介したいと思います。

背景

Gunosy ではデータ基盤として AWS の Athena と S3 を主に利用しています。 データ基盤の詳細は以下の資料をご覧ください。

Gunosyにおけるデータの民主化を促進するデータ基盤 - Speaker Deck

S3 にはユーザーの行動ログや記事、広告データなどが日々蓄積されていきます。 そうすると S3 のコストもどんどん増加していってしまいますが、運用上はコストはできるだけ最小限に抑えたいです。 S3 のコストを最小限にするにはストレージクラスを Glacier Deep Archive クラスにするというアプローチがあり、Gunosy でも以前実践しています。 今回はこちらの方法ではなく、データ基盤の要件に合ったアプローチを取ります。

tech.gunosy.io

データ基盤に求められる要件

データ基盤としては、いつでも誰でも欲しいデータにアクセスできる状態をできるだけ担保したいです。 そうなるとデータ取得に数時間かかる Glacier Deep Archive クラスは今回のケースには適していません。

また、データのアクセス傾向としては以下のような傾向が見られます。

  • 全てのデータが頻繁にアクセスされるわけではない
  • 新しいデータほど頻繁にアクセスされやすい
  • どのデータがいつ求められるかは完全には予測できない
    • ただし、ある程度の傾向は予測できる

上記の傾向を考慮して、今回はアクセス頻度に応じて自動的にデータのコストが変わる Intelligent-Tiering ストレージクラスを利用してコストを最適化することにしました。

AWS Intelligent-Tiering

AWS S3 Intelligent-Tiering とは、利用頻度に応じてストレージクラスが変わる仕組みです。

  • 初期は Intelligent-Tiering Frequent Access クラス
  • 30 日間アクセスがなかった場合に Intelligent-Tiering Infrequent Access クラスになる
  • 90 日間アクセスがなかった場合に Intelligent-Tiering Archive Instant Access クラスになる

Intelligent-Tiering Archive Instant Access クラスになるとコストは 1/5 程度になります。

オプトインで 180 日間アクセスがなかった場合に Intelligent-Tiering Deep Archive Access クラスにすることができ、更なるコスト削減も可能となりますが、 オブジェクトの復元が必要となり即時アクセスができなくなります。 データ基盤の「いつでも誰でも欲しいデータにアクセスできる」という要件が満たせなくなるため、今回のケースでは Intelligent-Tiering Deep Archive Access クラスのオプトインはしていません。

aws.amazon.com

ライフサイクル設定

Intelligent Tiering にする S3 のライフサイクルを設定しました。 ただし、Intelligent Tiering ではオブジェクトをモニタリングするコストがかかるため、頻繁にアクセスするデータを Intelligent-Tiering クラスにするとコストが悪化してしまいます。 そのため、事前にデータのアクセス頻度をある程度予測したのち、データのパスごとに Intelligent-Tiering にするように設定しました。

resource "aws_s3_bucket_lifecycle_configuration" "sample_intelligent_tiering" {
  bucket = aws_s3_bucket.sample.bucket

  rule {
    id     = "sample1-intelligent-tiering"
    status = "Enabled"

    filter {
      and {
        prefix                   = "sample1/"
        object_size_greater_than = 1024 * 1024
      }
    }

    transition {
      days          = 365
      storage_class = "INTELLIGENT_TIERING"
    }
  }

  rule {
    id     = "sample2-intelligent-tiering"
    status = "Enabled"

    filter {
      and {
        prefix                   = "sample2/"
        object_size_greater_than = 1024 * 1024
      }
    }

    transition {
      days          = 180
      storage_class = "INTELLIGENT_TIERING"
    }
  }
}

検証結果

途中で別のデータ削減施策が入ったことで 9 月にデータ量が下がってはいますが、全体の 7 割程度のデータを Intelligent-Tiering クラスに変更し、そのうちの 80%程度が Intelligent-Tiering Archive Instant Access、13%程度が Intelligent-Tiering Infrequent Access クラスになりました。

ストレージタイプごとの容量

そして、コストとしては半額程度に下げることができました。

S3のコスト

まとめ

データ基盤は事業の運営上、必須なものとなっています。 データ基盤には日々データが蓄積されており、その分コストも上がってしまうという課題があります。 今回はデータ基盤の S3 コストを Intelligent-Tiering の仕組みを利用して半額程度にすることができました。 今後はデータ基盤の適切なコストについても検討していきたいと思います。

明日の Gunosy Advent Calendar 2024 は、最近入社された小野さんの入社エントリです。お楽しみに!