💸

Google CloudのStorage Transferの設定変更は慎重に!

2023/12/12に公開

要約

  • Storage Transferの設定変更をしたところ、想定外の費用請求が発生した。
  • Terraform Provider側のドキュメントを参照して設定変更したが、Google Cloud本家のドキュメントも確認するべきだった。
  • 念には念を入れるためのバックアップ転送が大量に走ったものであり、費用以外に本番サービスへの影響はなし。

はじめに

Google Cloud Storage Transferの設定を変更したら予期せぬ高額請求が発生してしまい、教訓として残します。

前提

運用しているあるGoogle Storageバケット(以下オリジンバケット)には多くのオブジェクトがバージョニングされて保存されています。
さらにオリジンバケット自体を誤って削除した時に備えて、念には念を入れて定期的にStorage Transferでバックアップバケットに転送していました。

terraformで管理しているgoogle_storage_transfer_jobリソースの transfer_options の設定は以下の通りです。

transfer_options {
  overwrite_objects_already_existing_in_sink = false 
  delete_objects_unique_in_sink              = false
  delete_objects_from_source_after_transfer  = false
}

設定変更

ある時、オリジンバケット側のオブジェクト削除をバックアップバケット側にも同期して削除する設定にする要件がありました。

terraform google providerのドキュメント によると、delete_objects_unique_in_sinkをtrueにすることで実現できそうです。

delete_objects_unique_in_sink - (Optional) Whether objects that exist only in the sink should be deleted.

さらに、overwrite_objects_already_existing_in_sinkもtrueにするとバックアップバケットに既に存在するオブジェクトの上書きもしてくれるようで、バージョンニングを行っているため特にデメリットはないだろうと思い、確実に同期するためこちらもtrueにしました。

overwrite_objects_already_existing_in_sink - (Optional) Whether overwriting objects that already exist in the sink is allowed.

以下が修正後です。

transfer_options {
  overwrite_objects_already_existing_in_sink = true 
  delete_objects_unique_in_sink              = true
  delete_objects_from_source_after_transfer  = false
}

事件

数日して請求ダッシュボードを見ると、設定変更後からCloud Storageの使用料が約10倍に激増していることに気が付きました😱

原因

使用料の内訳を見るとNetworking Traffic Egress GCP Inter Region within Asiaの料金が激増していることがわかりました。

どうやらオリジンバケット内の全オブジェクトの全バージョンが定期転送の度に上書き更新され高額な転送料がかかっているようでした。

terraform google providerのドキュメント のさらに下を読むと、overwrite_whenを指定せずにoverwrite_objects_already_existing_in_sinkをtrueにするとoverwrite_whenがALWAYS扱いとなり全転送が走るようでした。

overwrite_when - (Optional) When to overwrite objects that already exist in the sink. If not set, overwrite behavior is determined by overwrite_objects_already_existing_in_sink. Possible values: ALWAYS, DIFFERENT, NEVER.

また、Google Cloud本家のドキュメント では、overwrite_objects_already_existing_in_sinkはデフォルトのfalseでは差分があるオブジェクトのみ上書きされ、trueにすると全てのオブジェクトは上書きされる旨が書いてありました。

When to overwrite objects that already exist in the sink. The default is that only objects that are different from the source are ovewritten. If true, all objects in the sink whose name matches an object in the source are overwritten with the source object.

対応

オブジェクトに更新がある場合のみコピーされれば良いため、overwrite_objects_already_existing_in_sinkをfalseに戻しました。

transfer_options {
  overwrite_objects_already_existing_in_sink = false 
  delete_objects_unique_in_sink              = true
  delete_objects_from_source_after_transfer  = false
}

さらに意図せずバックアップバケットに転送された大量のオブジェクトのバージョニングも削除することで設定変更前の費用に戻りました。

教訓

  • Cloud Storageは保存料だけでなく、転送料にも注意をする。
  • terraform側のproviderドキュメントだけでなく、Google Cloud側のドキュメントも見ておいた方が詳細が書いてあることがあり確実である。
  • TransferOptionsの設定は組み合わせにより思わぬ挙動となるので、設定変更が想定通り動いているか実際に検証する。
  • 思わぬ請求増にすぐ気付けるようにGoogle Cloudの予算アラートはしっかり設定する。
株式会社ナレッジワーク

Discussion