Redshift Serverlessを使って気づいたことを書きます。
今回はトランザクションの実行とRPUの挙動についてです。
処理をしていないはずなのに、課金が発生
あるとき何も処理をしていないはずであるにもかかわらず、相当な額の料金が発生していることに気付く。
AWS Budgetsの予算通知ルールを作成していたため、気づくことができた。
料金が発生しているServerlessのメトリクスを確認すると、特に処理をしていないはずの時間帯にRPUがBase Capacityの値で張り付いているという挙動が確認できた。
原因
以下の4つが重なって、Serverless上で"トランザクション"が1週間近く実行されたままだったと推測した。
1.Redshift Serverlessはトランザクション実行中はRPUが使用される。(=料金が発生する)
https://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/serverless-billing.html
2.接続に使っていたツールをauto commit OFFで使っていた。(=selectしただけでトランザクションが開始され、トランザクションはcommit またはrollbackするまでおわらない)
3.ツールを動かしている端末は普段起動したままのPCであり、接続ツールが終了されることがなかった
4.ドキュメント上記載のある、トランザクション制限6時間がきかなかった
https://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/amazon-redshift-limits.html#serverless-limits-account
今後のために
第一に、トランザクションは明示的に終了するガイドするべきと考える。一方操作ミスなども考えられるため、システム側でも何らかの手立てを立てる必要があると考える
要件としては「処理をしていないが、RPUが消費されている状態」を検知できるようなモニタと通知を可能とすること。
まずRedshift Serverlessの機能に「RPUの制限」はあるが、この機能で検知できるのは、総使用RPUであり、必要な処理で消費されたRPUでも検知されてしまうため、要件を満たさない。またAWS Budgetsも同様に必要な処理で発生した料金でも検知されてしまうため、要件を満たさない。
どちらの機能もそれだけでは「処理をしていないが、RPUが消費されている状態」を検知することはできない。
よって、他の手段を検討する必要があると考える。
モニタと通知の検討と実装結果を別記事にて記載する。