1- # Dummy cert (copying from fixed .it cert for now) to bootstrap
2- # httptoolkit.tech and get the gateway running.
3- resource "kubernetes_secret_v1" "cert_httptoolkit_tech_bootstrap" {
1+ resource "kubernetes_namespace_v1" "certificates" {
42 metadata {
5- name = " cert-httptoolkit-tech"
6- namespace = " gateway"
7- }
8-
9- type = " kubernetes.io/tls"
10-
11- data = {
12- " tls.crt" = var.httptoolk_it_tls_cert
13- " tls.key" = var.httptoolk_it_tls_key
14- }
15-
16- lifecycle {
17- ignore_changes = [data , metadata ]
3+ name = " certificates"
184 }
195}
206
@@ -24,7 +10,7 @@ resource "helm_release" "cert_manager" {
2410 repository = " oci://quay.io/jetstack/charts"
2511 chart = " cert-manager"
2612 version = " v1.19.2"
27- namespace = " cert-manager "
13+ namespace = " certificates "
2814 create_namespace = true
2915 wait = true
3016
@@ -44,7 +30,8 @@ resource "kubectl_manifest" "letsencrypt_prod" {
4430 apiVersion = " cert-manager.io/v1"
4531 kind = " ClusterIssuer"
4632 metadata = {
47- name = " letsencrypt-prod"
33+ name = " letsencrypt-prod"
34+ namespace = " certificates"
4835 }
4936 spec = {
5037 acme = {
@@ -55,36 +42,41 @@ resource "kubectl_manifest" "letsencrypt_prod" {
5542 }
5643 solvers = [
5744 {
58- http01 = {
59- gatewayHTTPRoute = {
60- parentRefs = [
61- {
62- name = " primary-gateway"
63- namespace = " gateway"
64- kind = " Gateway"
65- },
66- {
67- name = " secondary-gateway"
68- namespace = " gateway"
69- kind = " Gateway"
70- }
71- ]
45+ # All ACME is delegated via CNAMEs to acme-dns.httptoolkit.tech:
46+ dns01 = {
47+ cnameStrategy = " Follow"
48+ webhook = {
49+ groupName = " acme.scaleway.com"
50+ solverName = " scaleway"
51+ config = {
52+ zone = " acme-dns.httptoolkit.tech"
53+ projectId = var.project_id
54+ }
7255 }
7356 }
57+ selector = {
58+ dnsNames = [
59+ " httptoolkit.tech" ,
60+ " *.httptoolkit.tech"
61+ ]
62+ }
7463 }
7564 ]
7665 }
7766 }
7867 })
7968
80- depends_on = [helm_release . cert_manager ]
69+ depends_on = [
70+ helm_release . cert_manager ,
71+ helm_release . cert_manager_scaleway_webhook
72+ ]
8173}
8274
83- # Set up our two certificates
75+ # Manually set up the TLS cert for *.e.httptoolk.it, for now:
8476resource "kubernetes_secret_v1" "cert_httptoolk_it" {
8577 metadata {
8678 name = " cert-httptoolk-it"
87- namespace = " gateway "
79+ namespace = " certificates "
8880 }
8981
9082 type = " kubernetes.io/tls"
@@ -97,25 +89,68 @@ resource "kubernetes_secret_v1" "cert_httptoolk_it" {
9789 depends_on = [helm_release . envoy_gateway ]
9890}
9991
100- resource "kubectl_manifest" "cert_httptoolkit_tech" {
92+ # We create a new app & API key for cert manager to automate our DNS:
93+ resource "scaleway_iam_application" "acme_dns_bot" {
94+ name = " acme-dns-bot"
95+ description = " Automated bot for Cert Manager DNS challenges"
96+ }
97+
98+ resource "scaleway_iam_policy" "acme_dns_bot_policy" {
99+ name = " acme-dns-bot-policy"
100+ application_id = scaleway_iam_application. acme_dns_bot . id
101+
102+ rule {
103+ project_ids = [var . project_id ]
104+ permission_set_names = [" DomainsDNSFullAccess" ]
105+ }
106+ }
107+
108+ resource "scaleway_iam_api_key" "acme_dns_key" {
109+ application_id = scaleway_iam_application. acme_dns_bot . id
110+ description = " Key for Cert Manager ACME DNS challenges"
111+ }
112+
113+ resource "helm_release" "cert_manager_scaleway_webhook" {
114+ name = " scaleway-webhook"
115+ repository = " https://helm.scw.cloud"
116+ chart = " scaleway-certmanager-webhook"
117+ namespace = " certificates"
118+
119+ depends_on = [helm_release . cert_manager ]
120+
121+ values = [
122+ yamlencode ({
123+ certManager = {
124+ namespace = " certificates"
125+ serviceAccountName = " cert-manager"
126+ }
127+
128+ secret = {
129+ accessKey = scaleway_iam_api_key.acme_dns_key.access_key
130+ secretKey = scaleway_iam_api_key.acme_dns_key.secret_key
131+ }
132+ })
133+ ]
134+ }
135+
136+ resource "kubectl_manifest" "cert_wildcard_httptoolkit_tech" {
101137 yaml_body = yamlencode ({
102138 apiVersion = " cert-manager.io/v1"
103139 kind = " Certificate"
104140 metadata = {
105- name = " cert-httptoolkit-tech"
106- namespace = " gateway "
141+ name = " cert-wildcard- httptoolkit-tech"
142+ namespace = " certificates "
107143 }
108144 spec = {
109- secretName = " cert-httptoolkit-tech"
145+ secretName = " cert-wildcard- httptoolkit-tech"
110146 issuerRef = {
111147 name = " letsencrypt-prod"
112148 kind = " ClusterIssuer"
113149 }
114150 commonName = " httptoolkit.tech"
115151 dnsNames = [
116152 " httptoolkit.tech" ,
117- " public-endpoint.httptoolkit.tech" ,
118- " accounts-api.httptoolkit.tech"
153+ " *.httptoolkit.tech"
119154 ]
120155 }
121156 })
0 commit comments