Terraform 「xxxx is empty tuple」と表示されたときの対処方法

Published
2022-10-13
Author
ykich
Tags

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",
]

存在を知っていればどうということは無いのですが、知らないまま過ごしていました。

誰かのお役に立てれば幸いです。