Skip to content

Instantly share code, notes, and snippets.

@nicosingh
Last active May 10, 2023 19:37
Show Gist options
  • Select an option

  • Save nicosingh/ab9edd1b356efe018ab6d9df4e1b96ce to your computer and use it in GitHub Desktop.

Select an option

Save nicosingh/ab9edd1b356efe018ab6d9df4e1b96ce to your computer and use it in GitHub Desktop.
# create some variables
variable "dns_base_domain" {
type = string
description = "DNS Zone name to be used from EKS Ingress."
}
variable "ingress_gateway_name" {
type = string
description = "Load-balancer service name."
}
variable "ingress_gateway_iam_role" {
type = string
description = "IAM Role Name associated with load-balancer service."
}
variable "ingress_gateway_chart_name" {
type = string
description = "Ingress Gateway Helm chart name."
}
variable "ingress_gateway_chart_repo" {
type = string
description = "Ingress Gateway Helm repository name."
}
variable "ingress_gateway_chart_version" {
type = string
description = "Ingress Gateway Helm chart version."
}
# get (externally configured) DNS Zone
# ATTENTION: if you don't have a Route53 Zone already, replace this data by a new resource
data "aws_route53_zone" "base_domain" {
name = var.dns_base_domain
}
# create AWS-issued SSL certificate
resource "aws_acm_certificate" "eks_domain_cert" {
domain_name = var.dns_base_domain
subject_alternative_names = ["*.${var.dns_base_domain}"]
validation_method = "DNS"
tags = {
Name = "${var.dns_base_domain}"
}
}
resource "aws_route53_record" "eks_domain_cert_validation_dns" {
for_each = {
for dvo in aws_acm_certificate.eks_domain_cert.domain_validation_options : dvo.domain_name => {
name = dvo.resource_record_name
record = dvo.resource_record_value
type = dvo.resource_record_type
}
}
allow_overwrite = true
name = each.value.name
records = [each.value.record]
ttl = 60
type = each.value.type
zone_id = data.aws_route53_zone.base_domain.zone_id
}
resource "aws_acm_certificate_validation" "eks_domain_cert_validation" {
certificate_arn = aws_acm_certificate.eks_domain_cert.arn
validation_record_fqdns = [for record in aws_route53_record.eks_domain_cert_validation_dns : record.fqdn]
}
# deploy Ingress Controller
resource "kubernetes_service_account" "load_balancer_controller" {
metadata {
name = var.ingress_gateway_name
namespace = "kube-system"
labels = {
"app.kubernetes.io/component" = "controller"
"app.kubernetes.io/name" = var.ingress_gateway_name
}
annotations = {
"eks.amazonaws.com/role-arn" = "arn:aws:iam::${data.aws_caller_identity.current.account_id}:role/${var.ingress_gateway_iam_role}"
}
}
}
resource "kubernetes_secret" "load_balancer_controller" {
type = "kubernetes.io/service-account-token"
wait_for_service_account_token = true
metadata {
namespace = kubernetes_service_account.load_balancer_controller.metadata.0.namespace
generate_name = "${kubernetes_service_account.load_balancer_controller.metadata.0.name}-token"
annotations = {
"kubernetes.io/service-account.name" = kubernetes_service_account.load_balancer_controller.metadata.0.name
}
}
}
resource "helm_release" "ingress_gateway" {
name = var.ingress_gateway_chart_name
chart = var.ingress_gateway_chart_name
repository = var.ingress_gateway_chart_repo
version = var.ingress_gateway_chart_version
namespace = "kube-system"
set {
name = "clusterName"
value = var.cluster_name
}
set {
name = "serviceAccount.name"
value = kubernetes_service_account.load_balancer_controller.metadata.0.name
}
set {
name = "serviceAccount.create"
value = "false"
}
}
@rajarshiaws

Copy link
Copy Markdown

It is failing for me with this error: can you please suggest what is going wrong?

aws_autoscaling_policy.eks_autoscaling_policy[0]: Refreshing state... [id=my-app-eks-02020092914170335280000000d-autoscaling-policy]

Error: services "nginx-ingress-nginx-ingress" not found

  on ingress.tf line 75, in data "kubernetes_service" "ingress_gateway":
  75: data "kubernetes_service" "ingress_gateway" {

@firemanxbr

firemanxbr commented Sep 29, 2020

Copy link
Copy Markdown

I'm getting the same error:

$ terraform plan -out=development.tfplan 
-var-file=network-development.tfvars -var-file=eks-development.tfvars -var-file=ingress-development.tfvars -var-file=subdomains-development.tfvars -var-file=namespaces-development.tfvars
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.

data.aws_caller_identity.current: Refreshing state...
module.eks-cluster.data.aws_ami.eks_worker_windows: Refreshing state...
module.eks-cluster.data.aws_iam_policy_document.cluster_assume_role_policy: Refreshing state...
module.eks-cluster.data.aws_partition.current: Refreshing state...
module.eks-cluster.data.aws_ami.eks_worker: Refreshing state...
data.aws_route53_zone.base_domain: Refreshing state...
data.aws_elb_hosted_zone_id.elb_zone_id: Refreshing state...
data.aws_availability_zones.available_azs: Refreshing state...
module.eks-cluster.data.aws_caller_identity.current: Refreshing state...
module.eks-cluster.data.aws_iam_policy_document.workers_assume_role_policy: Refreshing state...

------------------------------------------------------------------------

Error: Get "http://localhost/api/v1/namespaces/default/services/nginx-ingress-nginx-ingress": dial tcp 127.0.0.1:80: connect: connection refused

  on ingress.tf line 75, in data "kubernetes_service" "ingress_gateway":
  75: data "kubernetes_service" "ingress_gateway" {

@nicosingh

nicosingh commented Oct 1, 2020

Copy link
Copy Markdown
Author

@rajarshiaws @firemanxbr I'm not able to reproduce the error ☹️ but seems to be a Kubernetes provider problem.

Could you try a couple of things?:

  • comment data.kubernetes_service.ingress_gateway and the objects using it, and apply? I just wanna double-check if you can create helm_release.ingress_gateway (which is the dependency for this data source).

  • add an explicit dependency on data.kubernetes_service.ingress_gateway of module.eks-cluster?. Something like:

# create base domain for EKS Cluster
data "kubernetes_service" "ingress_gateway" {
  metadata {
    name = join("-", [helm_release.ingress_gateway.chart, helm_release.ingress_gateway.name])
  }
  depends_on = [module.eks-cluster]
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment