ふり返る暇なんて無いね

日々のメモ書きをつらつらと。メインブログに書くほどでもないことを流してます

豆: TerraformでAPIから取得した値をリソースのパラメータに使用したい

それcurlが使えるよ。

curl_curl | Data Sources | anschoewe/curl | Terraform | Terraform Registry

前回マネージドプリフィクスリストを使用する例を載せてましたが、Local値にGitHub WebHookのCIDRを直書きしていたため、GitHub側でCIDRが変更されたときに対応が面倒くさいという欠点がありました。

diary.masasuzu.net

今回はこの値を直書きでなくcurlでAPIから取得してそれを利用する例を紹介します。

IPv4アドレスのものだけフィルターするコードが適当なので、このあたりもっと良い手があれば教えてください。

data "curl" "github_meta" {
  http_method = "GET"
  uri         = "https://api.github.com/meta"
}

locals {
  github_meta              = jsondecode(data.curl.github_meta.response)
  github_webhook_cidr      = local.github_meta.hooks
  github_webhook_cidr_ipv4 = [for x in local.github_meta.hooks : x if length(split(".", x)) == 4]
  github_webhook_cidr_ipv6 = [for x in local.github_meta.hooks : x if length(split(":", x)) > 1]

}

resource "aws_ec2_managed_prefix_list" "main" {
  name           = "GitHub Hooks"
  address_family = "IPv4"
  max_entries    = length(local.github_webhook_cidr_ipv4)

  dynamic "entry" {
    for_each = local.github_webhook_cidr_ipv4
    content {
      cidr = entry.value
    }
  }
}

resource "aws_security_group" "main" {
  name   = "Allow GitHub Webhooks"
  vpc_id = var.vpc_id
}

resource "aws_vpc_security_group_ingress_rule" "main" {
  security_group_id = aws_security_group.main.id
  ip_protocol       = "tcp"
  from_port         = 443
  to_port           = 443
  prefix_list_id    = aws_ec2_managed_prefix_list.main.id
}

output "github_webhook_cidr_ipv4" {
  value = local.github_webhook_cidr_ipv4
}

output "github_webhook_cidr_ipv6" {
  value = local.github_webhook_cidr_ipv6
}