⚠️

Terraform ApplyでCost Explorer APIのRate Limitに引っかかったら

2024/01/12に公開

https://x.com/chilitreat/status/1745352199834845673?s=20

エラー内容

コスト配分タグごとのコスト異常検知を行うために、90個程度一度にリソースをTerraformで作成してApplyしようとしたら、以下のようなエラーが発生して、Applyが正常に完了できなかった

│ Error: listing tags for CE (Cost Explorer) Anomaly Monitor (arn:aws:ce::1234567890:anomalymonitor/57314eba-1081-487d-9d71-487fe8cf91fb): LimitExceededException: Rate limit exceeded
│ 
│   with aws_ce_anomaly_monitor.cost_allocation_tag_a,
│   on cost_anomaly_detection.tf line 183, in resource "aws_ce_anomaly_monitor" "cost_allocation_tag_a":183: resource "aws_ce_anomaly_monitor" "cost_allocation_tag_a" {

LimitExceededException: Rate limit exceeded Cost Explorer APIのRate Limitに引っかかってしまった模様

解決法

-refresh=false オプションをつけてApply実行する

terraform apply -refresh=false

Terraformで一度に大量のリソースを変更する場合にどうするべきか調査してたところ以下の議論に辿り着いた。

https://discuss.hashicorp.com/t/optimizing-terraform-aws-to-deploy-and-destroy-4000-instances/25334

-refresh=false オプションは、tfstateファイルに記録された内容との差分だけを見てPlan/Applyを実行するため、ドリフトを検知しない

https://www.hashicorp.com/blog/new-terraform-planning-options-refresh-false-refresh-only-replace

解決できたとはいえ、今後Plan/Apply実行時に毎回 -refresh=false オプションつけないとダメになるのでなんか微妙な気がしている

他に試したこと

APIのRate Limit に引っかからないように -prallelismオプションを指定して並列の処理数を少なくした

何度か試したら稀にうまくいく時もあったが、全然安定しなかったためボツ

そもそも-prallelismオプションはそういう用途ではないっぽい。色々試した後に公式Docに書いてあった

Note that some providers (AWS, for example), handle API rate limiting issues at a lower level by implementing graceful backoff/retry in their respective API clients. For this reason, Terraform does not use this parallelism feature to address API rate limits directly.

https://developer.hashicorp.com/terraform/internals/graph#walking-the-graph

Discussion