<p>I'm new to Terraform and Helm world! I need to set up Istio on the AWS EKS cluster. I was able to set up the EKS cluster using Terraform. I'm thinking of installing ISTIO on top of the EKS cluster using Terraform by writing terraform modules. However, I found that we can set up Istio on top of eks using the helm chart.</p>
<p>Can someone help me to answer my few queries:</p>
<ol>
<li>Should I install Istio using Terraform? If yes, Is there any terraform module available or How can I write one?</li>
<li>Should I install Istio using Helm Chart? If yes, what are the pros and cons of it?</li>
<li>I need to write a pipeline to install Istio on EKS cluster. Should I use a combination of both terraform and Helm as provider?</li>
</ol>
<p>Thank you very much for your time. Appreciate all your help!</p>

<p>To extend @Chris 3rd option of terraform + helm provider,</p>
<p>as for version 1.12.0+ of istio they officially have a working helm repo:</p>
<p><a href="https://istio.io/latest/docs/setup/install/helm/" rel="noreferrer">istio helm install</a></p>
<p>and that with terraform's helm provider
<a href="https://registry.terraform.io/providers/hashicorp/helm/latest/docs" rel="noreferrer">Terraform helm provider</a>
allows an easy setup that is configured only by terraform:</p>
<pre class="lang-hcl prettyprint-override"><code>provider &quot;helm&quot; {
  kubernetes {
    // enter the relevant authentication
  }
}

locals {
  istio_charts_url = &quot;https://istio-release.storage.googleapis.com/charts&quot;
}

resource &quot;helm_release&quot; &quot;istio-base&quot; {
  repository       = local.istio_charts_url
  chart            = &quot;base&quot;
  name             = &quot;istio-base&quot;
  namespace        = var.istio-namespace
  version          = &quot;1.12.1&quot;
  create_namespace = true
}

resource &quot;helm_release&quot; &quot;istiod&quot; {
  repository       = local.istio_charts_url
  chart            = &quot;istiod&quot;
  name             = &quot;istiod&quot;
  namespace        = var.istio-namespace
  create_namespace = true
  version          = &quot;1.12.1&quot;
  depends_on       = [helm_release.istio-base]
}

resource &quot;kubernetes_namespace&quot; &quot;istio-ingress&quot; {
  metadata {
    labels = {
      istio-injection = &quot;enabled&quot;
    }

    name = &quot;istio-ingress&quot;
  }
}

resource &quot;helm_release&quot; &quot;istio-ingress&quot; {
  repository = local.istio_charts_url
  chart      = &quot;gateway&quot;
  name       = &quot;istio-ingress&quot;
  namespace  = kubernetes_namespace.istio-ingress-label.id
  version    = &quot;1.12.1&quot;
  depends_on = [helm_release.istiod]
}
</code></pre>
<p><strong>This is the last step that was missing to make this production ready</strong></p>
<p>It is no longer needed to locally keep the helm charts with the null_resource</p>
<p>If you wish to override the default helm values it is nicely shown in here:
<a href="https://artifacthub.io/packages/search?kind=0&amp;org=istio&amp;ts_query_web=istio&amp;official=true&amp;sort=relevance&amp;page=1" rel="noreferrer">Artifact hub</a>, choose the relevant chart and see the values</p>
