terraform/modules/ingress/main.tf (183 lines of code) (raw):
/**
* Copyright 2022 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
# Terraform Block
terraform {
required_version = ">= 0.13"
required_providers {
kubectl = {
source = "gavinbunney/kubectl"
version = ">= 1.14.0"
}
helm = {
source = "hashicorp/helm"
version = ">= 2.5.1"
}
}
}
module "cert_manager" {
source = "terraform-iaac/cert-manager/kubernetes"
cluster_issuer_email = var.cert_issuer_email
cluster_issuer_name = "letsencrypt"
cluster_issuer_private_key_secret_name = "cert-manager-private-key"
}
resource "kubernetes_namespace" "ingress_nginx" {
metadata {
name = "ingress-nginx"
}
}
resource "google_compute_address" "ingress_ip_address" {
name = "nginx-controller"
region = var.region
}
module "nginx-controller" {
source = "terraform-iaac/nginx-controller/helm"
version = "2.0.2"
namespace = "ingress-nginx"
ip_address = google_compute_address.ingress_ip_address.address
# TODO: does this require cert_manager up and running or can they be completed in parallel
depends_on = [
module.cert_manager, resource.kubernetes_namespace.ingress_nginx
]
}
resource "kubernetes_ingress_v1" "default_ingress" {
depends_on = [
module.nginx-controller
]
metadata {
name = "default-ingress"
annotations = {
"kubernetes.io/ingress.class" = "nginx"
"cert-manager.io/cluster-issuer" = module.cert_manager.cluster_issuer_name
"nginx.ingress.kubernetes.io/enable-cors" = "true"
"nginx.ingress.kubernetes.io/cors-allow-methods" = "PUT,GET,POST,DELETE,OPTIONS"
"nginx.ingress.kubernetes.io/cors-allow-origin" = var.cors_allow_origin
"nginx.ingress.kubernetes.io/cors-allow-credentials" = "true"
"nginx.ingress.kubernetes.io/proxy-read-timeout" = "3600"
}
}
spec {
# Default backend to UI app.
default_backend {
service {
name = "adp-ui"
port {
number = 80
}
}
}
rule {
http {
# Upload Service
path {
backend {
service {
name = "upload-service"
port {
number = 80
}
}
}
path_type = "Prefix"
path = "/upload_service"
}
# classification Service
path {
backend {
service {
name = "classification-service"
port {
number = 80
}
}
}
path_type = "Prefix"
path = "/classification_service"
}
# validation Service
path {
backend {
service {
name = "validation-service"
port {
number = 80
}
}
}
path_type = "Prefix"
path = "/validation_service"
}
# extraction Service
path {
backend {
service {
name = "extraction-service"
port {
number = 80
}
}
}
path_type = "Prefix"
path = "/extraction_service"
}
# hitl Service
path {
backend {
service {
name = "hitl-service"
port {
number = 80
}
}
}
path_type = "Prefix"
path = "/hitl_service"
}
# document-status Service
path {
backend {
service {
name = "document-status-service"
port {
number = 80
}
}
}
path_type = "Prefix"
path = "/document_status_service"
}
# matching Service
path {
backend {
service {
name = "matching-service"
port {
number = 80
}
}
}
path = "/matching_service"
}
# Sample Service
path {
backend {
service {
name = "sample-service"
port {
number = 80
}
}
}
path_type = "Prefix"
path = "/sample_service"
}
}
}
tls {
hosts = ["${var.domain}"]
secret_name = "tls-secret"
}
}
}