フラミナル

考え方や調べたことを書き殴ります。IT技術系記事多め

【Terraform】IAMで配列変数を扱うときの方法

f:id:lirlia:20200624112925p:plain

IPアドレスのリストを変数で用意して、それをIAMで呼び出す時にこんなエラーが出ます。これを解消するTipsです。

# 変数ファイル
IPaddress_list= [A,B,C,D]

---
# Terraformコード

  access_policies = <<POLICY
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "es:*",
      "Principal": "*",
      "Effect": "Allow",
      "Resource": "arn:aws:es:ap-northeast-1:${data.aws_caller_identity.self.account_id}:domain/xxx/*",
      "Condition": {
        "IpAddress": {"aws:SourceIp": ${var.IPaddress_list} }
      }
    }
  ]
}
POLICY

Terraform実行後

Error: Invalid template interpolation value

  on aws_es.tf line 23, in resource "aws_elasticsearch_domain" "example":
  13: 
  14: 
  15: 
  16: 
  17: 
  18: 
  19: 
  20: 
  21: 
  22: 
  23:         "IpAddress": {"aws:SourceIp": ${var.IPaddress_list}}
  24: 
  25: 
  26: 
  27: 
  28: 
    |----------------
    | var.IPaddress_list is tuple with 21 elements

Cannot include the given value in a string template: string required.

解決方法

うまく連結させます。

# Terraformコード

  access_policies = <<POLICY
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "es:*",
      "Principal": "*",
      "Effect": "Allow",
      "Resource": "arn:aws:es:ap-northeast-1:${data.aws_caller_identity.self.account_id}:domain/xxx/*",
      "Condition": {
        "IpAddress": {"aws:SourceIp": ["${join("\",\"", var.IPaddress_list)}"] }
      }
    }
  ]
}
POLICY