AWS DataSyncの利用でコスト急増問題

AWS

AWS DataSyncの利用で、コストが急増し数十万が消えた事例を紹介します。AWSを利用している方へ、注意喚起として読んでいただければなと思います。

コスト増加発見

AWSアカウントの管理を実施してます。毎週金曜日にAWS利用料の確認をしているのですが、S3のコストが徐々に上昇していることを確認しました。詳細を見てみるとS3に対してLISTのAPIが大量に発生していることがわかりました。

1000リクエストあたり0.005$

ログ出力用のS3バケットに対してのAPIだったのですが、ログ出力用のS3バケットに対してPUTはしていますが、LISTしていない認識でしたのでハテナ状態でした。

S3周りのインフラ構成

S3周りのインフラ構成は以下です。

あるストレージサービスからDataSyncにより、ログデータをS3へ転送するようになってます。

DataSyncの仕組み

DataSyncは、あるストレージサービスから別のストレージサービスへ転送する機能となってます。(超ざっくり説明です。)転送元のストレージサービスにあるファイルを確認し、その後、転送先のS3にその※ファイルが存在するかどうかを調べ、あれば何もしない。なければファイル転送を行う仕組みとなっています。

※設定によっては、転送先のファイルを調べずに転送することもできます。詳細は以下のAWS公式サイトを確認ください。

AWS DataSyncデータ整合性の検証方法を設定する - AWS DataSync
AWS DataSync転送中にデータの整合性を検証する方法をご覧ください。

コスト増加の原因

コスト急増原因はDataSyncからS3へ対してのLIST APIでした。

上記と同じ説明になりますが、DataSyncは転送元と転送先を比較して、転送するしないを決定しています。比較のタイミングで転送先(S3)へListのAPIをたたいていることになります。

S3の転送先パスに大量のオブジェクトが存在する場合は、その分ListAPIが走ります。これが今回のコスト増加原因です。

さらに、DataSync転送とは別に、転送先パスに階層の深いデバックログを出力していました。(フォーマット:yyyy/MM/dd/hh/mm/ss)開発用デバックログなので、アプリが動くたびにログ出力されるので、大量のS3オブジェクトが出来上がります。

これら大量のS3オブジェクトをDataSync転送時に読み込むこととなるので、APIが多発し今回の金額増加につながりました。

対策

  • 新規のAWSリソースを利用するときは裏で実行されているAPIも把握する
    • 今回は、DataSyncがS3に対してListAPIをたたいていることを知らなかったため
  • DataSync転送先のパスには、階層の深いオブジェクトは配置しない
    • S3のバケットポリシーにて、DataSyncからの転送のみ許可するポリシーを追加する
  • コストが急増した時のためにアラート設定をする
    • 負荷試験なども実施するので、どうしてもコストが上がる時があるので検討が必要

おわりに

今回のコスト増加が発生して、初めてDataSyncがS3に対してListAPIを叩いていることに気づきました。新規のAWSリソースを使うときは、仕組みと裏で何のAPIを叩いているのか把握する大切さを学びました。また、最小権限の法則の大切さも改めて実感しました。

コメント

タイトルとURLをコピーしました