Terraform 「xxxx is empty tuple」と表示されたときの対処方法
Terraformで環境差異などでcount文を使わざるを得なくなることは多々あると思います。
count文は条件によってリソースを作る/作らないを制御できますが、リソースの属性参照時にリソースが存在しないとエラーになります。
エラー内容
例えば、こんなS3バケットを定義していたとします。
s3.tf
resource "aws_s3_bucket" "xxxx" {
count = local.is_production ? 0 : 1 # 本番環境のみ作る
bucket = "${local.system}-${local.environment}-apprelease-${data.aws_region.tokyo.name}-${data.aws_caller_identity.tokyo.account_id}"
}他で参照するために、属性をoutputしようとするとエラーになります。
output "aws_s3_bucket_xxxx" {
value = aws_s3_bucket.xxxx[0].arn
}outputではcountを使うこはできません。
エラー内容
│ Error: Invalid index
│
│ on s3.tf line 318, in locals:
│ 318: aws_s3_bucket.xxxx[0].arn
│ ├────────────────
│ │ aws_s3_bucket.xxxx is empty tuple
│
│ The given key does not identify an element in this collection value: the collection has no elements.対処法
try関数を使うことでエラーを回避することができます。(ドキュメント)
output "aws_s3_bucket_apprelease_tokyo" {
value = try(aws_s3_bucket.xxxx[0].arn,"")
}ただし、これでは存在しない場合にも空白文字が残ってしまいます。
空白文字すらも削除したい…!という場合は、三項演算子やその他関数を利用して削除しましょう。
配列の場合は以下のように削除できます。
$ tf console
> [for x in ["a","b","c",""] : x if x != ""]
[
"a",
"b",
"c",
]存在を知っていればどうということは無いのですが、知らないまま過ごしていました。
誰かのお役に立てれば幸いです。