kubernetesterraformamazon-eksterraform-provider-kubernetesterraform-provider-helm

Is it possible to fetch the image tag from a deployment in EKS using terraform kubernetes provider?


Context: I'm reusing terraform modules and I deploy microservices using helm provider within terraform.

Problem:

I'm trying to translate this line into terraform code, to get the current image tag live from prod (in the interest of reusing it). I'm already using kubernetes provider's auth and doesn't make sense to pull kubectl in my CI just for this.

k get deploy my-deployment -n staging -o jsonpath='{$.spec.template.spec.containers[:1].image}'

Kubernetes terraform provider doesn't seem to support data blocks nor helm provider outputs blocks.

Does anyone know how could we get (read) the image tag of a deployment using terraform?

EDIT:

My deployment looks like this:

resource "helm_release" "example" {
  name       = "my-redis-release"
  repository = "https://charts.bitnami.com/bitnami"
  chart      = "redis"
  version    = "6.0.1"

  values = [
    "${file("values.yaml")}"
  ]

  set {
    name  = "image.tag"
    value = "latest"
  }

}

The tag will be a hash that will change often and passed on from another repo.

latest in this case should be replaced by the current running tag in the cluster. I can get it using kubectl, using the line above, but not sure how using terraform.


Solution

  • It turns out there are multiple ways of doing it, where the easiest one for me is to reference the set argument of the helm_release resource:

    output "helm_image_tag" {
      value = [ for setting in helm_release.example.set : setting.value if setting.name == "image.tag" ]
    }
    

    The output will then be a list where you can reference it in a shell script (or another scripting language):

      + helm_image_tag = [
          + "latest",
        ]
    

    If the list format does not suit you, you can create a map output:

    output "helm_image_tag" {
    value = { for setting in helm_release.example.set : setting.name => setting.value if setting.name == "image.tag" }
    }
    

    This produces the following output:

      + helm_image_tag = {
          + "image.tag" = "latest"
        }
    

    By using terraform output helm_image_tag you can access this output value and decide what to do with it in the CI.