@@ -21,6 +21,26 @@ locals {
2121    quota_code   =  quota.quota_code !=  null  ?  quota.quota_code :  data.aws_servicequotas_service_quota.by_name[k].quota_code
2222    value        =  quota.value
2323  } }
24+ 
25+   #  Because the API often returns default values rather than configured or applicable values,
26+   #  we have to ignore the value returned by the API or else face perpetual drift.
27+   #  To allow us to change the value in the future, even though we are ignoring it,
28+   #  we encode the value in the resource key, so that a change of value will
29+   #  result in a new resource being created and the old one being destroyed.
30+   #  Destroying the old resource has no actual effect, it does not even close
31+   #  an open request, so it is safe to do.
32+ 
33+   quota_requests  =  for  k , quota  in  local . quotas_coded_map  : 
34+     format (" %v/%v/%v" . service_code , quota. quota_code , quota. value ) =>  merge (
35+       quota, { input_map_key =  k }
36+     )
37+   }
38+ 
39+   quota_results  =  for  k , v  in  local . quota_requests  :  v . input_map_key  =>  merge (
40+     { for  k , v  in  aws_servicequotas_service_quota . this [k ] :  k  =>  v  if  k  !=  " value" 
41+     { " value reported (may be inaccurate)" 
42+     { " value requested" 
43+   ) }
2444}
2545
2646data  "aws_servicequotas_service"  "by_name"  {
@@ -37,9 +57,15 @@ data "aws_servicequotas_service_quota" "by_name" {
3757}
3858
3959resource  "aws_servicequotas_service_quota"  "this"  {
40-   for_each  =  . quotas_coded_map 
60+   for_each  =  . quota_requests 
4161
4262  quota_code    =  . value . quota_code 
4363  service_code  =  . value . service_code 
4464  value         =  . value . value 
65+ 
66+   lifecycle  {
67+     #  Literally about 50% of the time, the actual value set is not available,
68+     #  so the default value is reported instead, resulting in permanent drift.
69+     ignore_changes  =  value ]
70+   }
4571}
0 commit comments