- Coverage by target cloud
- How the backends compare
- On Google Cloud
- On Azure
- On Azure, OCI, and Private Kubernetes
- Costs
- Service level agreements
- Debug this service
Coverage by target cloud
How the backends compare
Each row compares a capability of ACM (certificates) with its adaptation on each backend. A dash means this row is not stated for that backend.Max adaptation
Infrastructure-only adaptation
On Google Cloud
How it works
On AWS, ACM issues and renews the certificate, and a load balancer, CDN or API gateway uses it by ARN. By default, ACM does not expose the private key. On Google Cloud, Tensor9 creates one Google-managed certificate for eachaws_acm_certificate during installation and points the HTTPS load balancer or proxy at it. Google issues and renews the certificate and never exposes its key. Tensor9 is not in the path of your application’s requests.
The ACM operation names on this card describe infrastructure equivalents configured during installation. This mapping does not serve runtime AWS ACM API requests. Certificate issuance, retrieval, renewal, and deletion use the backend service and its access controls.
Tensor9 creates a Google-managed certificate during installation and attaches it to your load balancer.
Managed and self-managed certificates
Agoogle_certificate_manager_certificate is either managed or self_managed. Tensor9 creates a managed certificate whose domains are your domain_name and subject_alternative_names, with one dns_authorizations entry per domain. Google issues a publicly trusted certificate, chooses its key algorithm and renews it, as ACM does for RequestCertificate.
In self_managed mode, Google serves a certificate, chain and pem_private_key you supply, and you renew it. Tensor9 does not use this mode: an ACM certificate imported with certificate_body and private_key stops the build with an error.
Tensor9 creates managed certificates, which Google issues and renews.
DNS validation
For ACM DNS validation,RequestCertificate returns the certificate ARN. DescribeCertificate supplies its DNS validation CNAME while the certificate is PENDING_VALIDATION. Publishing that record proves domain control. ACM then marks the certificate ISSUED and uses the DNS authorization for subsequent renewal.
A google_certificate_manager_dns_authorization similarly returns a dns_resource_record CNAME to publish in your zone. Tensor9 creates one authorization per domain; one authorization covers a domain and its wildcard, such as example.com and *.example.com. If your stack wrote ACM’s validation records to Route 53, Tensor9 writes Google’s CNAME records to the matching Cloud DNS zone instead. A certificate with validation_method EMAIL or HTTP stops the build with an error; DNS is the supported method.
Both clouds prove domain control with a CNAME record in your zone; Google’s comes from a DNS authorization.
Attaching the certificate
On AWS, a TLS consumer references the certificate by ARN. The load balancer listener, CloudFront distribution, or API gateway performs the TLS handshake. Google Certificate Manager attaches certificates through agoogle_certificate_manager_certificate_map, whose certificate_map_entry records link hostnames to certificates. The target HTTPS proxy picks a certificate by the hostname the client sends (Server Name Indication, SNI). Tensor9 points each reference to the ACM certificate’s ARN at the Google certificate instead.
On AWS the certificate is an ARN on the listener; on Google a certificate map links hostnames to certificates.
Private key access
Default ACM public certificates are non-exportable:GetCertificate returns the certificate and chain without the key. Since 2025, ACM has also offered opt-in exportable public certificates.
Google never exposes a managed certificate’s private key, and a self-managed certificate’s pem_private_key is accepted as input but never returned on read. So moving here does not widen who can read the key. ACM’s opt-in key export is not reproduced.
Google never returns managed private keys or the private keys supplied with imported certificates.
Limitations
Where Google Certificate Manager and ACM differ- Email and HTTP validation are not supported. This mapping uses DNS authorization. A certificate with
validation_methodEMAILorHTTPstops the build with an error. - Imported ACM certificates are not supported. A certificate imported into ACM with
certificate_bodyandprivate_keystops the build with an error. Tensor9 creates only Google-managed certificates. - Choosing the key algorithm is not supported. Google chooses the key for a managed certificate. A certificate whose
key_algorithmis anything other thanRSA_2048stops the build with an error, and keys cannot be exported. - Private CA and exportable ACM certificates are not supported. A certificate that sets
certificate_authority_arn, oroptions.export = ENABLED, stops the build with an error rather than being reissued as a public certificate with a new key. - Subject alternative names from variables behave differently. Alternative names Tensor9 cannot read when it builds the deployment are left off the certificate, and the build reports a warning. A primary
domain_namefrom a variable is resolved at deployment. - Certificate attachment behaves differently. A certificate map links hostnames to certificates on the HTTPS proxy, instead of an ARN on each listener. Check each hostname and each attachment when the AWS ARN is replaced.
- Other ACM options are not supported. Public certificates are logged; ACM has deprecated its transparency-logging opt-out, and this mapping does not keep it. ACM hosted-ACME settings are not reproduced.
Other considerations
- DNS records. The Cloud DNS zone for each domain must exist. Keep the DNS authorization CNAME records in place: Google needs them to renew the certificate.
- Who does what. You control the Google project, the DNS zone and the load balancer. Google issues and renews managed certificates. Confirm the proxy serves the right certificate for every hostname.
- Moving from AWS. Google issues new certificates during installation. Existing ACM certificates and keys are not transferred.
Example monthly charges
This Tensor9 BYOC scenario estimates service charges for the named origin and target services. Adapter hosting and commercial Tensor9 fees need separate allocations. How Tensor9 estimates costs explains the method and what the estimates include.AWS ACM public certificates · Active public certificates
Feature: AWS ACM public certificates. Estimated monthly service charges by Active public certificates. Adapter hosting and Tensor9 fees are excluded. Source: us-east-1; target: global; currency: USD.- Inventory varies independently of monthly reads and mutations. Retention remains an explicit planning assumption. Other native meters and workload assumptions retain their explicitly displayed default quantities. Workload translation and capacity assumptions are not benchmark measurements.
- Native monthly usage priced at the cited provider list prices; listed target allowances apply where present, excluding invoice credits, taxes and negotiated discounts. Rates as of 2026-10-22: us-east-1 → global, USD/month.
- Source prices are reference charges, not an invoice. Target lines cover selected service usage/configuration only; adapter hosting and Tensor9 fees are excluded.
- Samples of explicit prices are not performance measurements or capacity qualification. No interpolation or break-even guarantee is implied.
- Variant assumptions show the first axis sample; any axis-dependent configuration is described by this curve’s workload note.
- Rates are cited provider list prices, editable for discounts, commitments or another region. Workload translation and capacity coefficients remain editable planning assumptions, not benchmark measurements or a commercial quote.
- Default-zero rates are explicit assumptions, not evidence that the deployed service or resource is free.
- Provisioned-unit minimums use an editable approximate allocation floor. Modeled target service cost is max(usage/allocation, minimum), with billable network, durable staging and dependent sinks added separately; actual RU/TU sizing, scaling increments and throughput remain unqualified.
- Durable staging is priced once: provisioned targets include adapter state in their selected allocation; native targets add a separate staging allocation when required. Adapter hosting is a separate allocation and must exclude resources already priced as staging, workers or target capacity.
- A declared adapter mapping and cost model do not establish implementation availability or service equivalence.
- This is a declared directed mapping; a planning estimate does not establish deployment or request-serving support.
- Origin unit prices are cited provider list prices. Retention, amplification, and capacity coefficients are authored planning guesses; they are editable, not measured capacity.
- Public non-exportable source certificates have a zero authored source price. Exportable certificates and private-CA certificates require different models.
- Certificate storage, issuance polling, DNS challenges and adapter state differ from load-balancer traffic. Certificate trust and issuer availability remain backend-specific.
- The Azure native-provisioning Key Vault profile can use self-signed certificates; it must not be presented as the same public-trust workflow as the separate ACME backend.
- Certificate Manager bills deployed certificates per project: the first 100 a month are free, then USD 0.20 per certificate-month to 2,000 and 0.10 above. RSA-3072/4096 TLS and mTLS connections (0.45 per million) are not modeled; DNS challenges, hosting and durable adapter state remain separately allocated.
- Row-store throughput (capacityOpsPerVcpuSecond, default 1500) is measured-by-tensor9 as a lower bound: the DynamoDB adapter on Cloud SQL db-custom-2-7680 (2 vCPU, PostgreSQL 16, us-west1) served 2,974 ops/s of YCSB-A at 16 threads without recorded saturation (src/main/kotlin/t9/prime/equiv/generated/eval/CloudsqlPostgresqlYcsbAT16GoYcsbV1_0_0.kt). Published CPU-bound pgbench reaches 3,101 read-write transactions and 20,289 point reads per vCPU-second (AWS z1d.2xlarge, PostgreSQL 14.5), so actual capacity is likely higher. Reads and writes share one coefficient: at the same adapter version, read-only YCSB-C was not faster than 50%-update YCSB-A.
- Log-broker throughput (capacityStreamMiBPerVcpuSecond 20 at 0.5 utilization, 4 GiB RAM per vCPU) is provider-documented by Google Managed Service for Apache Kafka sizing (https://docs.cloud.google.com/managed-service-for-apache-kafka/docs/plan-cluster-size): write-equivalent bytes are replicated writes plus a quarter of reads. Producer batches below 10 KB lower per-CPU throughput; that penalty is not modeled.
- Disk utilization 0.8 is provider-documented headroom below Cloud SQL automatic storage increase, which triggers near 91-95% full (https://docs.cloud.google.com/sql/docs/postgres/instance-settings). The 20 GiB reserve exceeds PostgreSQL’s 1 GB default max_wal_size; the remainder of that reserve is unmeasured.
- CPU tiers double from 2 vCPUs to the target’s largest node at 4 GiB per vCPU; each target’s documented largest node bounds CPU, RAM, RAM per vCPU and disk, and the durable staging database uses Cloud SQL Enterprise (96 vCPU, 6.5 GiB per vCPU, 624 GiB, 64 TiB). Targets billed per capacity unit or throughput unit are sized by their backend instead.
- No public evidence: peak/mean work (2) and the RAM working-set fraction (0.1). Proposed measurements: the p99 one-minute rate over the monthly mean from customer CloudWatch metrics; the buffer hit ratio while stepping RAM under a fixed YCSB-B load.
- Node bounds: Cloud SQL Enterprise allows 1-96 vCPUs at 0.9-6.5 GB per vCPU and up to 64 TB with a dedicated vCPU (https://docs.cloud.google.com/sql/docs/postgres/instance-settings).
- Stored GiB already includes the origin family’s physical footprint assumptions; no second storage amplification is applied.
- The operations/vCPU coefficient supplies the compute requirement alongside explicit resource-hour minima.
- Copies and allocation fractions change cost only; they do not increase modeled primary capacity.
- AWS Certificate Manager pricing: https://aws.amazon.com/certificate-manager/pricing/
- AWS Price List API, ACM offer: https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/ACM/current/us-east-1/index.json
- Certificate Manager pricing: https://cloud.google.com/certificate-manager/pricing
- Free allowances, committed discounts, credits, taxes and negotiated rates.
- Commercial Tensor9 fees and operations labor unless entered separately.
- ACM Private CA, exportable public certificates, paid external CA fees, authoritative DNS zones/queries and load-balancer/data-transfer charges.
- Taxes, discounts, credits and free-tier allowances not explicitly listed by this model.
- Unmodeled dependent services, task execution and operations outside the selected workload family.
plan-168d6137ea51de31531b7d13e78d3b865c15f0df / 2026-10-22.planning.2. Curve: workload-1.
Sources: AWS Certificate Manager pricing, AWS Price List API, ACM offer, Certificate Manager pricing.
AWS ACM public certificates · Certificate issuances and renewals
Feature: AWS ACM public certificates. Estimated monthly service charges by Certificate issuances and renewals. Adapter hosting and Tensor9 fees are excluded. Source: us-east-1; target: global; currency: USD.- Inventory remains at its authored default; issuance and renewal traffic varies independently. Other native meters and workload assumptions retain their explicitly displayed default quantities. Workload translation and capacity assumptions are not benchmark measurements.
- Native monthly usage priced at the cited provider list prices; listed target allowances apply where present, excluding invoice credits, taxes and negotiated discounts. Rates as of 2026-10-22: us-east-1 → global, USD/month.
- Source prices are reference charges, not an invoice. Target lines cover selected service usage/configuration only; adapter hosting and Tensor9 fees are excluded.
- Samples of explicit prices are not performance measurements or capacity qualification. No interpolation or break-even guarantee is implied.
- Variant assumptions show the first axis sample; any axis-dependent configuration is described by this curve’s workload note.
- Rates are cited provider list prices, editable for discounts, commitments or another region. Workload translation and capacity coefficients remain editable planning assumptions, not benchmark measurements or a commercial quote.
- Default-zero rates are explicit assumptions, not evidence that the deployed service or resource is free.
- Provisioned-unit minimums use an editable approximate allocation floor. Modeled target service cost is max(usage/allocation, minimum), with billable network, durable staging and dependent sinks added separately; actual RU/TU sizing, scaling increments and throughput remain unqualified.
- Durable staging is priced once: provisioned targets include adapter state in their selected allocation; native targets add a separate staging allocation when required. Adapter hosting is a separate allocation and must exclude resources already priced as staging, workers or target capacity.
- A declared adapter mapping and cost model do not establish implementation availability or service equivalence.
- This is a declared directed mapping; a planning estimate does not establish deployment or request-serving support.
- Origin unit prices are cited provider list prices. Retention, amplification, and capacity coefficients are authored planning guesses; they are editable, not measured capacity.
- Public non-exportable source certificates have a zero authored source price. Exportable certificates and private-CA certificates require different models.
- Certificate storage, issuance polling, DNS challenges and adapter state differ from load-balancer traffic. Certificate trust and issuer availability remain backend-specific.
- The Azure native-provisioning Key Vault profile can use self-signed certificates; it must not be presented as the same public-trust workflow as the separate ACME backend.
- Certificate Manager bills deployed certificates per project: the first 100 a month are free, then USD 0.20 per certificate-month to 2,000 and 0.10 above. RSA-3072/4096 TLS and mTLS connections (0.45 per million) are not modeled; DNS challenges, hosting and durable adapter state remain separately allocated.
- Row-store throughput (capacityOpsPerVcpuSecond, default 1500) is measured-by-tensor9 as a lower bound: the DynamoDB adapter on Cloud SQL db-custom-2-7680 (2 vCPU, PostgreSQL 16, us-west1) served 2,974 ops/s of YCSB-A at 16 threads without recorded saturation (src/main/kotlin/t9/prime/equiv/generated/eval/CloudsqlPostgresqlYcsbAT16GoYcsbV1_0_0.kt). Published CPU-bound pgbench reaches 3,101 read-write transactions and 20,289 point reads per vCPU-second (AWS z1d.2xlarge, PostgreSQL 14.5), so actual capacity is likely higher. Reads and writes share one coefficient: at the same adapter version, read-only YCSB-C was not faster than 50%-update YCSB-A.
- Log-broker throughput (capacityStreamMiBPerVcpuSecond 20 at 0.5 utilization, 4 GiB RAM per vCPU) is provider-documented by Google Managed Service for Apache Kafka sizing (https://docs.cloud.google.com/managed-service-for-apache-kafka/docs/plan-cluster-size): write-equivalent bytes are replicated writes plus a quarter of reads. Producer batches below 10 KB lower per-CPU throughput; that penalty is not modeled.
- Disk utilization 0.8 is provider-documented headroom below Cloud SQL automatic storage increase, which triggers near 91-95% full (https://docs.cloud.google.com/sql/docs/postgres/instance-settings). The 20 GiB reserve exceeds PostgreSQL’s 1 GB default max_wal_size; the remainder of that reserve is unmeasured.
- CPU tiers double from 2 vCPUs to the target’s largest node at 4 GiB per vCPU; each target’s documented largest node bounds CPU, RAM, RAM per vCPU and disk, and the durable staging database uses Cloud SQL Enterprise (96 vCPU, 6.5 GiB per vCPU, 624 GiB, 64 TiB). Targets billed per capacity unit or throughput unit are sized by their backend instead.
- No public evidence: peak/mean work (2) and the RAM working-set fraction (0.1). Proposed measurements: the p99 one-minute rate over the monthly mean from customer CloudWatch metrics; the buffer hit ratio while stepping RAM under a fixed YCSB-B load.
- Node bounds: Cloud SQL Enterprise allows 1-96 vCPUs at 0.9-6.5 GB per vCPU and up to 64 TB with a dedicated vCPU (https://docs.cloud.google.com/sql/docs/postgres/instance-settings).
- Stored GiB already includes the origin family’s physical footprint assumptions; no second storage amplification is applied.
- The operations/vCPU coefficient supplies the compute requirement alongside explicit resource-hour minima.
- Copies and allocation fractions change cost only; they do not increase modeled primary capacity.
- AWS Certificate Manager pricing: https://aws.amazon.com/certificate-manager/pricing/
- AWS Price List API, ACM offer: https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/ACM/current/us-east-1/index.json
- Certificate Manager pricing: https://cloud.google.com/certificate-manager/pricing
- Free allowances, committed discounts, credits, taxes and negotiated rates.
- Commercial Tensor9 fees and operations labor unless entered separately.
- ACM Private CA, exportable public certificates, paid external CA fees, authoritative DNS zones/queries and load-balancer/data-transfer charges.
- Taxes, discounts, credits and free-tier allowances not explicitly listed by this model.
- Unmodeled dependent services, task execution and operations outside the selected workload family.
plan-168d6137ea51de31531b7d13e78d3b865c15f0df / 2026-10-22.planning.2. Curve: workload-2.
Sources: AWS Certificate Manager pricing, AWS Price List API, ACM offer, Certificate Manager pricing.
AWS ACM public certificates → Certificate Manager: Authored native-usage planning example. Native monthly usage priced at the cited provider list prices; listed target allowances apply where present, excluding invoice credits, taxes and negotiated discounts.
Scenario source region: us-east-1. Scenario target region: global. Currency: USD.
- Free allowances, committed discounts, credits, taxes and negotiated rates.
- Commercial Tensor9 fees and operations labor unless entered separately.
- ACM Private CA, exportable public certificates, paid external CA fees, authoritative DNS zones/queries and load-balancer/data-transfer charges.
- Taxes, discounts, credits and free-tier allowances not explicitly listed by this model.
- Unmodeled dependent services, task execution and operations outside the selected workload family.
- Translated reads: 10,000 operations.
- Translated writes: 33 operations.
- Translated resident physical data: under 0.01 GiB-month.
- Native provider operations: 726 operations.
- Published payload: 0 GiB.
- Delivered payload: 0 GiB.
- Allocated execution CPU: 0 vCPU-hour.
- Allocated execution RAM: 0 GiB-hour.
- Independent resource allocation: 0 resource-hour.
- Independent inventory: 100 resource-month.
- Input tokens: 0 tokens.
- Output tokens: 0 tokens.
- Billable network: 0 GiB.
- Dependent object sink retained data: 0 GiB-month.
- Dependent object sink writes: 0 writes.
- Rates are cited provider list prices, editable for discounts, commitments or another region. Workload translation and capacity coefficients remain editable planning assumptions, not benchmark measurements or a commercial quote.
- Default-zero rates are explicit assumptions, not evidence that the deployed service or resource is free.
- Provisioned-unit minimums use an editable approximate allocation floor. Modeled target service cost is max(usage/allocation, minimum), with billable network, durable staging and dependent sinks added separately; actual RU/TU sizing, scaling increments and throughput remain unqualified.
- Durable staging is priced once: provisioned targets include adapter state in their selected allocation; native targets add a separate staging allocation when required. Adapter hosting is a separate allocation and must exclude resources already priced as staging, workers or target capacity.
- A declared adapter mapping and cost model do not establish implementation availability or service equivalence.
- This is a declared directed mapping; a planning estimate does not establish deployment or request-serving support.
- Origin unit prices are cited provider list prices. Retention, amplification, and capacity coefficients are authored planning guesses; they are editable, not measured capacity.
- Public non-exportable source certificates have a zero authored source price. Exportable certificates and private-CA certificates require different models.
- Certificate storage, issuance polling, DNS challenges and adapter state differ from load-balancer traffic. Certificate trust and issuer availability remain backend-specific.
- The Azure native-provisioning Key Vault profile can use self-signed certificates; it must not be presented as the same public-trust workflow as the separate ACME backend.
- Certificate Manager bills deployed certificates per project: the first 100 a month are free, then USD 0.20 per certificate-month to 2,000 and 0.10 above. RSA-3072/4096 TLS and mTLS connections (0.45 per million) are not modeled; DNS challenges, hosting and durable adapter state remain separately allocated.
- Row-store throughput (capacityOpsPerVcpuSecond, default 1500) is measured-by-tensor9 as a lower bound: the DynamoDB adapter on Cloud SQL db-custom-2-7680 (2 vCPU, PostgreSQL 16, us-west1) served 2,974 ops/s of YCSB-A at 16 threads without recorded saturation (src/main/kotlin/t9/prime/equiv/generated/eval/CloudsqlPostgresqlYcsbAT16GoYcsbV1_0_0.kt). Published CPU-bound pgbench reaches 3,101 read-write transactions and 20,289 point reads per vCPU-second (AWS z1d.2xlarge, PostgreSQL 14.5), so actual capacity is likely higher. Reads and writes share one coefficient: at the same adapter version, read-only YCSB-C was not faster than 50%-update YCSB-A.
- Log-broker throughput (capacityStreamMiBPerVcpuSecond 20 at 0.5 utilization, 4 GiB RAM per vCPU) is provider-documented by Google Managed Service for Apache Kafka sizing (https://docs.cloud.google.com/managed-service-for-apache-kafka/docs/plan-cluster-size): write-equivalent bytes are replicated writes plus a quarter of reads. Producer batches below 10 KB lower per-CPU throughput; that penalty is not modeled.
- Disk utilization 0.8 is provider-documented headroom below Cloud SQL automatic storage increase, which triggers near 91-95% full (https://docs.cloud.google.com/sql/docs/postgres/instance-settings). The 20 GiB reserve exceeds PostgreSQL’s 1 GB default max_wal_size; the remainder of that reserve is unmeasured.
- CPU tiers double from 2 vCPUs to the target’s largest node at 4 GiB per vCPU; each target’s documented largest node bounds CPU, RAM, RAM per vCPU and disk, and the durable staging database uses Cloud SQL Enterprise (96 vCPU, 6.5 GiB per vCPU, 624 GiB, 64 TiB). Targets billed per capacity unit or throughput unit are sized by their backend instead.
- No public evidence: peak/mean work (2) and the RAM working-set fraction (0.1). Proposed measurements: the p99 one-minute rate over the monthly mean from customer CloudWatch metrics; the buffer hit ratio while stepping RAM under a fixed YCSB-B load.
- Node bounds: Cloud SQL Enterprise allows 1-96 vCPUs at 0.9-6.5 GB per vCPU and up to 64 TB with a dedicated vCPU (https://docs.cloud.google.com/sql/docs/postgres/instance-settings).
- Stored GiB already includes the origin family’s physical footprint assumptions; no second storage amplification is applied.
- The operations/vCPU coefficient supplies the compute requirement alongside explicit resource-hour minima.
- Copies and allocation fractions change cost only; they do not increase modeled primary capacity.
plan-168d6137ea51de31531b7d13e78d3b865c15f0df / 2026-10-22.planning.2. Scenario: planning-example.
Sources: AWS Certificate Manager pricing, AWS Price List API, ACM offer, Certificate Manager pricing.
On Azure
Via Key Vault
How it works
On AWS, your stack requests a certificate from ACM and attaches it by ARN to a load balancer, CDN or API gateway, which handles TLS. By default, ACM does not expose the private key. On Azure, Tensor9 creates oneazurerm_key_vault_certificate for each aws_acm_certificate, in the deployment’s shared Key Vault, and points the service that handles TLS at it. The certificate is self-signed, so clients must be set up to trust it.
The ACM operation names on this card describe infrastructure equivalents configured during installation. This mapping does not serve runtime AWS ACM API requests. Certificate issuance, retrieval, renewal, and deletion use the backend service and its access controls.
During installation, Tensor9 creates a Key Vault certificate and points your TLS endpoint at it.
What the certificate contains
The certificate’scertificate_policy holds your request. domain_name becomes the subject (CN=example.com), and domain_name plus subject_alternative_names become the DNS names, wildcards included. The key is always RSA 2048 and exportable, and the certificate is valid for 12 months.
The policy sets issuer_parameters.name = Self, so Key Vault generates the key and self-signs the certificate. Wait for its certificate operation to complete; no separate DNS approval is required. Tensor9 always creates a new certificate and key. It does not copy an existing certificate body or key; if you must keep one, import it into Key Vault yourself with its chain and passphrase.
Each ACM certificate becomes one Key Vault certificate whose policy names Self as the issuer.
Trust and validation
There is noPENDING_VALIDATION stage and no CNAME record to create: Key Vault issues the certificate as soon as its certificate operation completes. In exchange, browsers and other clients do not trust it until you distribute its root to them.
For a publicly trusted certificate you need a different issuer: a certificate authority (CA) that Key Vault integrates with, such as DigiCert or GlobalSign, or an App Service Managed Certificate for an eligible App Service hostname. Tensor9 does not set up either; you configure it.
Key Vault issues the self-signed certificate without a DNS challenge. Clients must be configured to trust it.
Getting a publicly trusted certificate
If your TLS endpoint is an App Service, you can create anazurerm_app_service_managed_certificate yourself. It uses an existing custom_hostname_binding to validate the hostname. Azure and DigiCert issue a publicly trusted certificate, and Microsoft renews it at no certificate charge.
It covers one exact hostname, does not support wildcards, and needs an internet-reachable App Service for validation. It cannot be attached to an arbitrary load balancer. Use a partner CA when these restrictions do not fit your deployment.
App Service Managed Certificates are publicly trusted and renew automatically. They cover one reachable App Service hostname and no wildcards.
Private key access
ACM’sGetCertificate returns the certificate and chain without the key. Default public certificates are non-exportable; ACM has offered opt-in exportable public certificates since 2025.
Tensor9 sets key_properties.exportable = true on every certificate it creates, so anyone allowed to read the backing Key Vault secret can retrieve the private key. Restrict read access to that secret. To prevent export altogether, the certificate policy would need exportable = false or a non-exportable RSA-HSM or EC-HSM key, which is a change from what Tensor9 generates.
The Key Vault certificate is exportable: anyone who can read its backing secret can read the private key.
Renewal
Key Vault renews a certificate according to thelifetime_action in its policy (AutoRenew at days_before_expiry or lifetime_percentage). The policy Tensor9 generates does not set a lifetime action of its own, so check the certificate’s renewal setting in Key Vault after installation. The certificate is valid for 12 months.
Each renewal creates a new certificate and secret version. The TLS endpoint must use a versionless secret reference, or you must update its versioned reference, to pick up the renewed certificate. Self-signed certificates (issuer = Self) and certificates from integrated partner CAs can renew automatically. Imported certificates (issuer = Unknown) cannot: you obtain and import a replacement before expiry.
Renewal creates a new version. A versionless secret reference lets the TLS endpoint follow it.
Limitations
Where Key Vault certificates and ACM differ- Certificates are not publicly trusted. Tensor9 generates a self-signed certificate (issuer Self), so browsers and other clients reject it until you distribute its root. Public trust needs a Key Vault partner CA or an App Service Managed Certificate, which you set up.
- ACM domain validation is not supported. Key Vault issues from the certificate policy, so DNS, email and CloudFront HTTP validation are not reproduced. A certificate with
validation_methodEMAILorHTTPstops the build with an error; use DNS validation. - Only RSA 2048 keys are supported. Every generated key is RSA 2048. A certificate whose
key_algorithmis anything else, such asEC_prime256v1orRSA_4096, stops the build with an error. - The private key behaves differently: it can be read. The generated key is exportable through the backing Key Vault secret, while ACM never returns a default certificate’s key. Restrict who can read that secret.
- Private CA certificates are not supported. A certificate that sets
certificate_authority_arnstops the build with an error, because a self-signed Key Vault certificate would not keep the private CA’s trust. Use a public ACM certificate. - Exportable ACM certificates are not supported. A certificate with
options.export = ENABLEDstops the build with an error, because Tensor9 would create a new key rather than keep the existing one. - Subject alternative names from variables behave differently. Names Tensor9 cannot read when it builds the deployment (variables or expressions) are left off the certificate, and the build reports a warning. The certificate then covers the primary domain only.
- You must declare certificates as resources in the root module. A
data "aws_acm_certificate"lookup, or a certificate declared in a child module, stops the build with an error.
Other considerations
- Permissions. Tensor9 grants the appliance identity the Key Vault Certificates Officer role on the shared vault so it can create certificates. The gateway or App Service that handles TLS needs read access to the backing secret under its own Azure identity. Grant only the vault or object scope it needs.
- Before switching traffic. Distribute the certificate’s root to your clients, confirm they accept it, and confirm the TLS endpoint can read the certificate. Check the renewal setting, and use a versionless secret reference where the endpoint supports one.
- Recovery and name reuse. Key Vault soft-delete keeps a deleted certificate for its retention period, which affects recovery and reusing the same name.
Example monthly charges
This Tensor9 BYOC scenario estimates service charges for the named origin and target services. Adapter hosting and commercial Tensor9 fees need separate allocations. How Tensor9 estimates costs explains the method and what the estimates include.AWS ACM public certificates · Active public certificates
Feature: AWS ACM public certificates. Estimated monthly service charges by Active public certificates. Adapter hosting and Tensor9 fees are excluded. Source: us-east-1; target: eastus; currency: USD.- Inventory varies independently of monthly reads and mutations. Retention remains an explicit planning assumption. Other native meters and workload assumptions retain their explicitly displayed default quantities. Workload translation and capacity assumptions are not benchmark measurements.
- Native monthly usage priced at the cited provider list prices; listed target allowances apply where present, excluding invoice credits, taxes and negotiated discounts. Rates as of 2026-10-22: us-east-1 → eastus, USD/month.
- Source prices are reference charges, not an invoice. Target lines cover selected service usage/configuration only; adapter hosting and Tensor9 fees are excluded.
- Samples of explicit prices are not performance measurements or capacity qualification. No interpolation or break-even guarantee is implied.
- Variant assumptions show the first axis sample; any axis-dependent configuration is described by this curve’s workload note.
- Rates are cited provider list prices, editable for discounts, commitments or another region. Workload translation and capacity coefficients remain editable planning assumptions, not benchmark measurements or a commercial quote.
- Default-zero rates are explicit assumptions, not evidence that the deployed service or resource is free.
- Provisioned-unit minimums use an editable approximate allocation floor. Modeled target service cost is max(usage/allocation, minimum), with billable network, durable staging and dependent sinks added separately; actual RU/TU sizing, scaling increments and throughput remain unqualified.
- Durable staging is priced once: provisioned targets include adapter state in their selected allocation; native targets add a separate staging allocation when required. Adapter hosting is a separate allocation and must exclude resources already priced as staging, workers or target capacity.
- A declared adapter mapping and cost model do not establish implementation availability or service equivalence.
- This is a declared directed mapping; a planning estimate does not establish deployment or request-serving support.
- Origin unit prices are cited provider list prices. Retention, amplification, and capacity coefficients are authored planning guesses; they are editable, not measured capacity.
- Public non-exportable source certificates have a zero authored source price. Exportable certificates and private-CA certificates require different models.
- Certificate storage, issuance polling, DNS challenges and adapter state differ from load-balancer traffic. Certificate trust and issuer availability remain backend-specific.
- The Azure native-provisioning Key Vault profile can use self-signed certificates; it must not be presented as the same public-trust workflow as the separate ACME backend.
- Certificate operations bill as vault operations; a certificate renewal request through an integrated CA lists USD 3 and is not modeled. ACME DNS challenges, hosting and durable state require separate allocation.
- Row-store throughput (capacityOpsPerVcpuSecond, default 1500) is measured-by-tensor9 as a lower bound: the DynamoDB adapter on Cloud SQL db-custom-2-7680 (2 vCPU, PostgreSQL 16, us-west1) served 2,974 ops/s of YCSB-A at 16 threads without recorded saturation (src/main/kotlin/t9/prime/equiv/generated/eval/CloudsqlPostgresqlYcsbAT16GoYcsbV1_0_0.kt). Published CPU-bound pgbench reaches 3,101 read-write transactions and 20,289 point reads per vCPU-second (AWS z1d.2xlarge, PostgreSQL 14.5), so actual capacity is likely higher. Reads and writes share one coefficient: at the same adapter version, read-only YCSB-C was not faster than 50%-update YCSB-A.
- Log-broker throughput (capacityStreamMiBPerVcpuSecond 20 at 0.5 utilization, 4 GiB RAM per vCPU) is provider-documented by Google Managed Service for Apache Kafka sizing (https://docs.cloud.google.com/managed-service-for-apache-kafka/docs/plan-cluster-size): write-equivalent bytes are replicated writes plus a quarter of reads. Producer batches below 10 KB lower per-CPU throughput; that penalty is not modeled.
- Disk utilization 0.8 is provider-documented headroom below Cloud SQL automatic storage increase, which triggers near 91-95% full (https://docs.cloud.google.com/sql/docs/postgres/instance-settings). The 20 GiB reserve exceeds PostgreSQL’s 1 GB default max_wal_size; the remainder of that reserve is unmeasured.
- CPU tiers double from 2 vCPUs to the target’s largest node at 4 GiB per vCPU; each target’s documented largest node bounds CPU, RAM, RAM per vCPU and disk, and the durable staging database uses Cloud SQL Enterprise (96 vCPU, 6.5 GiB per vCPU, 624 GiB, 64 TiB). Targets billed per capacity unit or throughput unit are sized by their backend instead.
- No public evidence: peak/mean work (2) and the RAM working-set fraction (0.1). Proposed measurements: the p99 one-minute rate over the monthly mean from customer CloudWatch metrics; the buffer hit ratio while stepping RAM under a fixed YCSB-B load.
- Node bounds: Cloud SQL Enterprise allows 1-96 vCPUs at 0.9-6.5 GB per vCPU and up to 64 TB with a dedicated vCPU (https://docs.cloud.google.com/sql/docs/postgres/instance-settings).
- Stored GiB already includes the origin family’s physical footprint assumptions; no second storage amplification is applied.
- The operations/vCPU coefficient supplies the compute requirement alongside explicit resource-hour minima.
- Copies and allocation fractions change cost only; they do not increase modeled primary capacity.
- AWS Certificate Manager pricing: https://aws.amazon.com/certificate-manager/pricing/
- AWS Price List API, ACM offer: https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/ACM/current/us-east-1/index.json
- Azure Retail Prices API: https://prices.azure.com/api/retail/prices
- Free allowances, committed discounts, credits, taxes and negotiated rates.
- Commercial Tensor9 fees and operations labor unless entered separately.
- ACM Private CA, exportable public certificates, paid external CA fees, authoritative DNS zones/queries and load-balancer/data-transfer charges.
- Taxes, discounts, credits and free-tier allowances not explicitly listed by this model.
- Unmodeled dependent services, task execution and operations outside the selected workload family.
plan-21c50979198015a1fe8b833ea00c654bdcb9a531 / 2026-10-22.planning.2. Curve: workload-1.
Sources: AWS Certificate Manager pricing, AWS Price List API, ACM offer, Azure Retail Prices API.
AWS ACM public certificates · Certificate issuances and renewals
Feature: AWS ACM public certificates. Estimated monthly service charges by Certificate issuances and renewals. Adapter hosting and Tensor9 fees are excluded. Source: us-east-1; target: eastus; currency: USD.- Inventory remains at its authored default; issuance and renewal traffic varies independently. Other native meters and workload assumptions retain their explicitly displayed default quantities. Workload translation and capacity assumptions are not benchmark measurements.
- Native monthly usage priced at the cited provider list prices; listed target allowances apply where present, excluding invoice credits, taxes and negotiated discounts. Rates as of 2026-10-22: us-east-1 → eastus, USD/month.
- Source prices are reference charges, not an invoice. Target lines cover selected service usage/configuration only; adapter hosting and Tensor9 fees are excluded.
- Samples of explicit prices are not performance measurements or capacity qualification. No interpolation or break-even guarantee is implied.
- Variant assumptions show the first axis sample; any axis-dependent configuration is described by this curve’s workload note.
- Rates are cited provider list prices, editable for discounts, commitments or another region. Workload translation and capacity coefficients remain editable planning assumptions, not benchmark measurements or a commercial quote.
- Default-zero rates are explicit assumptions, not evidence that the deployed service or resource is free.
- Provisioned-unit minimums use an editable approximate allocation floor. Modeled target service cost is max(usage/allocation, minimum), with billable network, durable staging and dependent sinks added separately; actual RU/TU sizing, scaling increments and throughput remain unqualified.
- Durable staging is priced once: provisioned targets include adapter state in their selected allocation; native targets add a separate staging allocation when required. Adapter hosting is a separate allocation and must exclude resources already priced as staging, workers or target capacity.
- A declared adapter mapping and cost model do not establish implementation availability or service equivalence.
- This is a declared directed mapping; a planning estimate does not establish deployment or request-serving support.
- Origin unit prices are cited provider list prices. Retention, amplification, and capacity coefficients are authored planning guesses; they are editable, not measured capacity.
- Public non-exportable source certificates have a zero authored source price. Exportable certificates and private-CA certificates require different models.
- Certificate storage, issuance polling, DNS challenges and adapter state differ from load-balancer traffic. Certificate trust and issuer availability remain backend-specific.
- The Azure native-provisioning Key Vault profile can use self-signed certificates; it must not be presented as the same public-trust workflow as the separate ACME backend.
- Certificate operations bill as vault operations; a certificate renewal request through an integrated CA lists USD 3 and is not modeled. ACME DNS challenges, hosting and durable state require separate allocation.
- Row-store throughput (capacityOpsPerVcpuSecond, default 1500) is measured-by-tensor9 as a lower bound: the DynamoDB adapter on Cloud SQL db-custom-2-7680 (2 vCPU, PostgreSQL 16, us-west1) served 2,974 ops/s of YCSB-A at 16 threads without recorded saturation (src/main/kotlin/t9/prime/equiv/generated/eval/CloudsqlPostgresqlYcsbAT16GoYcsbV1_0_0.kt). Published CPU-bound pgbench reaches 3,101 read-write transactions and 20,289 point reads per vCPU-second (AWS z1d.2xlarge, PostgreSQL 14.5), so actual capacity is likely higher. Reads and writes share one coefficient: at the same adapter version, read-only YCSB-C was not faster than 50%-update YCSB-A.
- Log-broker throughput (capacityStreamMiBPerVcpuSecond 20 at 0.5 utilization, 4 GiB RAM per vCPU) is provider-documented by Google Managed Service for Apache Kafka sizing (https://docs.cloud.google.com/managed-service-for-apache-kafka/docs/plan-cluster-size): write-equivalent bytes are replicated writes plus a quarter of reads. Producer batches below 10 KB lower per-CPU throughput; that penalty is not modeled.
- Disk utilization 0.8 is provider-documented headroom below Cloud SQL automatic storage increase, which triggers near 91-95% full (https://docs.cloud.google.com/sql/docs/postgres/instance-settings). The 20 GiB reserve exceeds PostgreSQL’s 1 GB default max_wal_size; the remainder of that reserve is unmeasured.
- CPU tiers double from 2 vCPUs to the target’s largest node at 4 GiB per vCPU; each target’s documented largest node bounds CPU, RAM, RAM per vCPU and disk, and the durable staging database uses Cloud SQL Enterprise (96 vCPU, 6.5 GiB per vCPU, 624 GiB, 64 TiB). Targets billed per capacity unit or throughput unit are sized by their backend instead.
- No public evidence: peak/mean work (2) and the RAM working-set fraction (0.1). Proposed measurements: the p99 one-minute rate over the monthly mean from customer CloudWatch metrics; the buffer hit ratio while stepping RAM under a fixed YCSB-B load.
- Node bounds: Cloud SQL Enterprise allows 1-96 vCPUs at 0.9-6.5 GB per vCPU and up to 64 TB with a dedicated vCPU (https://docs.cloud.google.com/sql/docs/postgres/instance-settings).
- Stored GiB already includes the origin family’s physical footprint assumptions; no second storage amplification is applied.
- The operations/vCPU coefficient supplies the compute requirement alongside explicit resource-hour minima.
- Copies and allocation fractions change cost only; they do not increase modeled primary capacity.
- AWS Certificate Manager pricing: https://aws.amazon.com/certificate-manager/pricing/
- AWS Price List API, ACM offer: https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/ACM/current/us-east-1/index.json
- Azure Retail Prices API: https://prices.azure.com/api/retail/prices
- Free allowances, committed discounts, credits, taxes and negotiated rates.
- Commercial Tensor9 fees and operations labor unless entered separately.
- ACM Private CA, exportable public certificates, paid external CA fees, authoritative DNS zones/queries and load-balancer/data-transfer charges.
- Taxes, discounts, credits and free-tier allowances not explicitly listed by this model.
- Unmodeled dependent services, task execution and operations outside the selected workload family.
plan-21c50979198015a1fe8b833ea00c654bdcb9a531 / 2026-10-22.planning.2. Curve: workload-2.
Sources: AWS Certificate Manager pricing, AWS Price List API, ACM offer, Azure Retail Prices API.
AWS ACM public certificates → Key Vault: Authored native-usage planning example. Native monthly usage priced at the cited provider list prices; listed target allowances apply where present, excluding invoice credits, taxes and negotiated discounts.
Scenario source region: us-east-1. Scenario target region: eastus. Currency: USD.
- Free allowances, committed discounts, credits, taxes and negotiated rates.
- Commercial Tensor9 fees and operations labor unless entered separately.
- ACM Private CA, exportable public certificates, paid external CA fees, authoritative DNS zones/queries and load-balancer/data-transfer charges.
- Taxes, discounts, credits and free-tier allowances not explicitly listed by this model.
- Unmodeled dependent services, task execution and operations outside the selected workload family.
- Translated reads: 10,000 operations.
- Translated writes: 33 operations.
- Translated resident physical data: under 0.01 GiB-month.
- Native provider operations: 726 operations.
- Published payload: 0 GiB.
- Delivered payload: 0 GiB.
- Allocated execution CPU: 0 vCPU-hour.
- Allocated execution RAM: 0 GiB-hour.
- Independent resource allocation: 0 resource-hour.
- Independent inventory: 100 resource-month.
- Input tokens: 0 tokens.
- Output tokens: 0 tokens.
- Billable network: 0 GiB.
- Dependent object sink retained data: 0 GiB-month.
- Dependent object sink writes: 0 writes.
- Rates are cited provider list prices, editable for discounts, commitments or another region. Workload translation and capacity coefficients remain editable planning assumptions, not benchmark measurements or a commercial quote.
- Default-zero rates are explicit assumptions, not evidence that the deployed service or resource is free.
- Provisioned-unit minimums use an editable approximate allocation floor. Modeled target service cost is max(usage/allocation, minimum), with billable network, durable staging and dependent sinks added separately; actual RU/TU sizing, scaling increments and throughput remain unqualified.
- Durable staging is priced once: provisioned targets include adapter state in their selected allocation; native targets add a separate staging allocation when required. Adapter hosting is a separate allocation and must exclude resources already priced as staging, workers or target capacity.
- A declared adapter mapping and cost model do not establish implementation availability or service equivalence.
- This is a declared directed mapping; a planning estimate does not establish deployment or request-serving support.
- Origin unit prices are cited provider list prices. Retention, amplification, and capacity coefficients are authored planning guesses; they are editable, not measured capacity.
- Public non-exportable source certificates have a zero authored source price. Exportable certificates and private-CA certificates require different models.
- Certificate storage, issuance polling, DNS challenges and adapter state differ from load-balancer traffic. Certificate trust and issuer availability remain backend-specific.
- The Azure native-provisioning Key Vault profile can use self-signed certificates; it must not be presented as the same public-trust workflow as the separate ACME backend.
- Certificate operations bill as vault operations; a certificate renewal request through an integrated CA lists USD 3 and is not modeled. ACME DNS challenges, hosting and durable state require separate allocation.
- Row-store throughput (capacityOpsPerVcpuSecond, default 1500) is measured-by-tensor9 as a lower bound: the DynamoDB adapter on Cloud SQL db-custom-2-7680 (2 vCPU, PostgreSQL 16, us-west1) served 2,974 ops/s of YCSB-A at 16 threads without recorded saturation (src/main/kotlin/t9/prime/equiv/generated/eval/CloudsqlPostgresqlYcsbAT16GoYcsbV1_0_0.kt). Published CPU-bound pgbench reaches 3,101 read-write transactions and 20,289 point reads per vCPU-second (AWS z1d.2xlarge, PostgreSQL 14.5), so actual capacity is likely higher. Reads and writes share one coefficient: at the same adapter version, read-only YCSB-C was not faster than 50%-update YCSB-A.
- Log-broker throughput (capacityStreamMiBPerVcpuSecond 20 at 0.5 utilization, 4 GiB RAM per vCPU) is provider-documented by Google Managed Service for Apache Kafka sizing (https://docs.cloud.google.com/managed-service-for-apache-kafka/docs/plan-cluster-size): write-equivalent bytes are replicated writes plus a quarter of reads. Producer batches below 10 KB lower per-CPU throughput; that penalty is not modeled.
- Disk utilization 0.8 is provider-documented headroom below Cloud SQL automatic storage increase, which triggers near 91-95% full (https://docs.cloud.google.com/sql/docs/postgres/instance-settings). The 20 GiB reserve exceeds PostgreSQL’s 1 GB default max_wal_size; the remainder of that reserve is unmeasured.
- CPU tiers double from 2 vCPUs to the target’s largest node at 4 GiB per vCPU; each target’s documented largest node bounds CPU, RAM, RAM per vCPU and disk, and the durable staging database uses Cloud SQL Enterprise (96 vCPU, 6.5 GiB per vCPU, 624 GiB, 64 TiB). Targets billed per capacity unit or throughput unit are sized by their backend instead.
- No public evidence: peak/mean work (2) and the RAM working-set fraction (0.1). Proposed measurements: the p99 one-minute rate over the monthly mean from customer CloudWatch metrics; the buffer hit ratio while stepping RAM under a fixed YCSB-B load.
- Node bounds: Cloud SQL Enterprise allows 1-96 vCPUs at 0.9-6.5 GB per vCPU and up to 64 TB with a dedicated vCPU (https://docs.cloud.google.com/sql/docs/postgres/instance-settings).
- Stored GiB already includes the origin family’s physical footprint assumptions; no second storage amplification is applied.
- The operations/vCPU coefficient supplies the compute requirement alongside explicit resource-hour minima.
- Copies and allocation fractions change cost only; they do not increase modeled primary capacity.
plan-21c50979198015a1fe8b833ea00c654bdcb9a531 / 2026-10-22.planning.2. Scenario: planning-example.
Sources: AWS Certificate Manager pricing, AWS Price List API, ACM offer, Azure Retail Prices API.
On Azure, OCI, and Private Kubernetes
Via cert-manager Certificate
How it works
On AWS, ACM issues and renews the certificate, and a load balancer, CDN or API gateway uses it by ARN. By default, ACM does not expose the private key. On Kubernetes, Tensor9 creates a cert-managerCertificate for each aws_acm_certificate during installation, in the traefik namespace, and points the Ingress at its TLS Secret. cert-manager gets a publicly trusted certificate from Let’s Encrypt and stores the certificate and key in that Secret.
The ACM operation names on this card describe infrastructure equivalents configured during installation. This mapping does not serve runtime AWS ACM API requests. Certificate issuance, retrieval, renewal, and deletion use the backend service and its access controls.
cert-manager stores the certificate in a TLS Secret that the Ingress uses for TLS.
The Certificate and its issuer
TheCertificate (cert-manager.io/v1) Tensor9 creates sets three fields. secretName is your ACM resource name followed by -tls. dnsNames holds domain_name and subject_alternative_names, wildcards and variables included. issuerRef selects the tensor9-letsencrypt-prod ClusterIssuer. Validity, renewal timing and the key are left to cert-manager’s defaults: a 90-day Let’s Encrypt certificate with an RSA 2048 key.
Tensor9 also installs cert-manager and that issuer. Its spec.acme names the Let’s Encrypt production server, the contact email you provide, and a dns01 solver that proves domain control by writing a record in your Route 53 hosted zone. ACM’s hosted ACME service, introduced in 2026, uses the same protocol.
The Certificate names the TLS Secret to write and uses the Let’s Encrypt ClusterIssuer through issuerRef .
Issuance and DNS validation
cert-manager opens an ACMEOrder and publishes an _acme-challenge DNS record. Let’s Encrypt checks that record and signs the certificate. cert-manager writes the certificate and private key to the TLS Secret, then sets the Certificate’s Ready condition to true.
The Ready condition replaces ACM’s separate aws_acm_certificate_validation wait, which Tensor9 removes along with the Route 53 validation records. Only DNS validation is supported: a certificate with validation_method EMAIL or HTTP stops the build with an error.
Let’s Encrypt checks a DNS record, then the certificate and key are stored in the TLS Secret and the Certificate becomes Ready .
Renewal
cert-manager renews the certificate before it expires. Because Tensor9 does not setrenewBefore, cert-manager’s default applies: renewal starts about two-thirds of the way through the certificate’s life and repeats the DNS check and issuance.
Renewal writes the new certificate and key under the same secretName, so the Ingress reference stays valid. A certificate you import as a TLS Secret yourself is not renewed automatically.
Renewal changes the contents of the TLS Secret, not its name, just as an ACM certificate keeps its ARN.
Private key access
The Secret containstls.crt and tls.key. Any principal permitted to read it can retrieve the private key. Default ACM public certificates do not expose that key.
Restrict Secret reads with Kubernetes role-based access control (RBAC), using Role and RoleBinding permissions for the relevant ServiceAccount. ACM’s opt-in exportable public certificates, available since 2025, also allow key retrieval; this difference is relative to default, non-exportable ACM certificates.
Read access to the TLS Secret includes access to the private key in tls.key .
Clusters without internet access
Public issuance needs the cluster to reach Let’s Encrypt and to publish DNS challenge records. The resulting certificate is trusted by any client that trusts Let’s Encrypt. For a cluster without that access, you configure aselfSigned or ca issuer. Its certificates are privately trusted: distribute the root to every client that must accept them. They do not provide public trust.
Public trust needs a cluster that can reach Let’s Encrypt; otherwise a selfSigned or ca issuer gives private trust only.
Limitations
Where cert-manager and ACM differ- The private key behaves differently: it can be read. The TLS Secret holds both the certificate and the private key, and any identity that can read the Secret can read the key. Default ACM public certificates never expose their keys.
- Public issuance needs internet and DNS access. The cluster must reach Let’s Encrypt and publish DNS challenge records. Without that, a self-signed or private CA issuer is needed, and every client must be set up to trust it.
- Only Route 53 DNS validation is supported. The Let’s Encrypt issuer’s DNS-01 solver writes to Route 53. A deployment whose DNS is Cloud DNS, Azure DNS, OCI DNS or Cloudflare fails with a DNS-provider-not-supported error.
- Email and HTTP validation are not supported. A certificate with
validation_methodEMAILorHTTPstops the build with an error; it is not converted to an ACME HTTP-01 challenge. - Only RSA 2048 keys are supported. A certificate whose
key_algorithmis anything else, such asEC_prime256v1orRSA_4096, stops the build with an error. - Private CA and exportable ACM certificates are not supported. A certificate that sets
certificate_authority_arn, oroptions.export = ENABLED, stops the build with an error rather than being reissued by Let’s Encrypt with a new key. - Other ACM options are not supported. ACM hosted-ACME endpoint settings and
ManagedBy=CLOUDFRONTare not reproduced. Public certificates are logged; ACM has deprecated the transparency-logging opt-out. - You must have a Kubernetes cluster in the deployment on Azure. On Azure, the Certificate needs an AKS cluster created in the same stack or a cluster you bring. If the stack only uses an external cluster, the build reports a blocking issue.
Other considerations
- You operate cert-manager. Tensor9 installs cert-manager and the Let’s Encrypt issuer; you provide the contact email and operate them with the cluster. Make sure the DNS solver can write to the hosted zone, and watch for failed Orders and Certificates that are not Ready.
- Check renewal at the Ingress. Renewal writes a new certificate to the same Secret. Confirm the Ingress reloads it and serves the renewed certificate. A TLS Secret you imported yourself needs replacements from you.
- Moving from AWS. Wait for each Certificate to become Ready before switching traffic. Existing ACM certificates are not copied; Let’s Encrypt issues new ones. If you must keep a certificate and key you already hold, import them as a
kubernetes.io/tlsSecret.
Example monthly charges
This Tensor9 BYOC scenario estimates service charges for the named origin and target services. Adapter hosting and commercial Tensor9 fees need separate allocations. How Tensor9 estimates costs explains the method and what the estimates include.AWS ACM public certificates · Active public certificates
Feature: AWS ACM public certificates. Estimated monthly service charges by Active public certificates. Adapter hosting and Tensor9 fees are excluded. Source: us-east-1; target: in-cluster; currency: USD.- Inventory varies independently of monthly reads and mutations. Retention remains an explicit planning assumption. Other native meters and workload assumptions retain their explicitly displayed default quantities. Workload translation and capacity assumptions are not benchmark measurements.
- Native monthly usage priced at the cited provider list prices; listed target allowances apply where present, excluding invoice credits, taxes and negotiated discounts. Rates as of 2026-10-22: us-east-1 → in-cluster, USD/month.
- Source prices are reference charges, not an invoice. Target lines cover selected service usage/configuration only; adapter hosting and Tensor9 fees are excluded.
- Samples of explicit prices are not performance measurements or capacity qualification. No interpolation or break-even guarantee is implied.
- Variant assumptions show the first axis sample; any axis-dependent configuration is described by this curve’s workload note.
- Rates are cited provider list prices, editable for discounts, commitments or another region. Workload translation and capacity coefficients remain editable planning assumptions, not benchmark measurements or a commercial quote.
- Default-zero rates are explicit assumptions, not evidence that the deployed service or resource is free.
- Provisioned-unit minimums use an editable approximate allocation floor. Modeled target service cost is max(usage/allocation, minimum), with billable network, durable staging and dependent sinks added separately; actual RU/TU sizing, scaling increments and throughput remain unqualified.
- Durable staging is priced once: provisioned targets include adapter state in their selected allocation; native targets add a separate staging allocation when required. Adapter hosting is a separate allocation and must exclude resources already priced as staging, workers or target capacity.
- A declared adapter mapping and cost model do not establish implementation availability or service equivalence.
- This is a declared directed mapping; a planning estimate does not establish deployment or request-serving support.
- Origin unit prices are cited provider list prices. Retention, amplification, and capacity coefficients are authored planning guesses; they are editable, not measured capacity.
- Public non-exportable source certificates have a zero authored source price. Exportable certificates and private-CA certificates require different models.
- Certificate storage, issuance polling, DNS challenges and adapter state differ from load-balancer traffic. Certificate trust and issuer availability remain backend-specific.
- The Azure native-provisioning Key Vault profile can use self-signed certificates; it must not be presented as the same public-trust workflow as the separate ACME backend.
- cert-manager (Apache-2.0) with an ACME issuer has no vendor charge and Let’s Encrypt issuance is free; the controller’s pods use node capacity, and DNS-01 challenge records bill under the DNS provider.
- Row-store throughput (capacityOpsPerVcpuSecond, default 1500) is measured-by-tensor9 as a lower bound: the DynamoDB adapter on Cloud SQL db-custom-2-7680 (2 vCPU, PostgreSQL 16, us-west1) served 2,974 ops/s of YCSB-A at 16 threads without recorded saturation (src/main/kotlin/t9/prime/equiv/generated/eval/CloudsqlPostgresqlYcsbAT16GoYcsbV1_0_0.kt). Published CPU-bound pgbench reaches 3,101 read-write transactions and 20,289 point reads per vCPU-second (AWS z1d.2xlarge, PostgreSQL 14.5), so actual capacity is likely higher. Reads and writes share one coefficient: at the same adapter version, read-only YCSB-C was not faster than 50%-update YCSB-A.
- Log-broker throughput (capacityStreamMiBPerVcpuSecond 20 at 0.5 utilization, 4 GiB RAM per vCPU) is provider-documented by Google Managed Service for Apache Kafka sizing (https://docs.cloud.google.com/managed-service-for-apache-kafka/docs/plan-cluster-size): write-equivalent bytes are replicated writes plus a quarter of reads. Producer batches below 10 KB lower per-CPU throughput; that penalty is not modeled.
- Disk utilization 0.8 is provider-documented headroom below Cloud SQL automatic storage increase, which triggers near 91-95% full (https://docs.cloud.google.com/sql/docs/postgres/instance-settings). The 20 GiB reserve exceeds PostgreSQL’s 1 GB default max_wal_size; the remainder of that reserve is unmeasured.
- CPU tiers double from 2 vCPUs to the target’s largest node at 4 GiB per vCPU; each target’s documented largest node bounds CPU, RAM, RAM per vCPU and disk, and the durable staging database uses Cloud SQL Enterprise (96 vCPU, 6.5 GiB per vCPU, 624 GiB, 64 TiB). Targets billed per capacity unit or throughput unit are sized by their backend instead.
- No public evidence: peak/mean work (2) and the RAM working-set fraction (0.1). Proposed measurements: the p99 one-minute rate over the monthly mean from customer CloudWatch metrics; the buffer hit ratio while stepping RAM under a fixed YCSB-B load.
- Node bounds: Cloud SQL Enterprise allows 1-96 vCPUs at 0.9-6.5 GB per vCPU and up to 64 TB with a dedicated vCPU (https://docs.cloud.google.com/sql/docs/postgres/instance-settings).
- Stored GiB already includes the origin family’s physical footprint assumptions; no second storage amplification is applied.
- The operations/vCPU coefficient supplies the compute requirement alongside explicit resource-hour minima.
- Copies and allocation fractions change cost only; they do not increase modeled primary capacity.
- AWS Certificate Manager pricing: https://aws.amazon.com/certificate-manager/pricing/
- AWS Price List API, ACM offer: https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/ACM/current/us-east-1/index.json
- cert-manager license: https://github.com/cert-manager/cert-manager/blob/master/LICENSE
- Free allowances, committed discounts, credits, taxes and negotiated rates.
- Commercial Tensor9 fees and operations labor unless entered separately.
- ACM Private CA, exportable public certificates, paid external CA fees, authoritative DNS zones/queries and load-balancer/data-transfer charges.
- Taxes, discounts, credits and free-tier allowances not explicitly listed by this model.
- Unmodeled dependent services, task execution and operations outside the selected workload family.
plan-b9997b072d064101c5df2449030afac695fbe44e / 2026-10-22.planning.2. Curve: workload-1.
Sources: AWS Certificate Manager pricing, AWS Price List API, ACM offer, cert-manager license.
AWS ACM public certificates · Certificate issuances and renewals
Feature: AWS ACM public certificates. Estimated monthly service charges by Certificate issuances and renewals. Adapter hosting and Tensor9 fees are excluded. Source: us-east-1; target: in-cluster; currency: USD.- Inventory remains at its authored default; issuance and renewal traffic varies independently. Other native meters and workload assumptions retain their explicitly displayed default quantities. Workload translation and capacity assumptions are not benchmark measurements.
- Native monthly usage priced at the cited provider list prices; listed target allowances apply where present, excluding invoice credits, taxes and negotiated discounts. Rates as of 2026-10-22: us-east-1 → in-cluster, USD/month.
- Source prices are reference charges, not an invoice. Target lines cover selected service usage/configuration only; adapter hosting and Tensor9 fees are excluded.
- Samples of explicit prices are not performance measurements or capacity qualification. No interpolation or break-even guarantee is implied.
- Variant assumptions show the first axis sample; any axis-dependent configuration is described by this curve’s workload note.
- Rates are cited provider list prices, editable for discounts, commitments or another region. Workload translation and capacity coefficients remain editable planning assumptions, not benchmark measurements or a commercial quote.
- Default-zero rates are explicit assumptions, not evidence that the deployed service or resource is free.
- Provisioned-unit minimums use an editable approximate allocation floor. Modeled target service cost is max(usage/allocation, minimum), with billable network, durable staging and dependent sinks added separately; actual RU/TU sizing, scaling increments and throughput remain unqualified.
- Durable staging is priced once: provisioned targets include adapter state in their selected allocation; native targets add a separate staging allocation when required. Adapter hosting is a separate allocation and must exclude resources already priced as staging, workers or target capacity.
- A declared adapter mapping and cost model do not establish implementation availability or service equivalence.
- This is a declared directed mapping; a planning estimate does not establish deployment or request-serving support.
- Origin unit prices are cited provider list prices. Retention, amplification, and capacity coefficients are authored planning guesses; they are editable, not measured capacity.
- Public non-exportable source certificates have a zero authored source price. Exportable certificates and private-CA certificates require different models.
- Certificate storage, issuance polling, DNS challenges and adapter state differ from load-balancer traffic. Certificate trust and issuer availability remain backend-specific.
- The Azure native-provisioning Key Vault profile can use self-signed certificates; it must not be presented as the same public-trust workflow as the separate ACME backend.
- cert-manager (Apache-2.0) with an ACME issuer has no vendor charge and Let’s Encrypt issuance is free; the controller’s pods use node capacity, and DNS-01 challenge records bill under the DNS provider.
- Row-store throughput (capacityOpsPerVcpuSecond, default 1500) is measured-by-tensor9 as a lower bound: the DynamoDB adapter on Cloud SQL db-custom-2-7680 (2 vCPU, PostgreSQL 16, us-west1) served 2,974 ops/s of YCSB-A at 16 threads without recorded saturation (src/main/kotlin/t9/prime/equiv/generated/eval/CloudsqlPostgresqlYcsbAT16GoYcsbV1_0_0.kt). Published CPU-bound pgbench reaches 3,101 read-write transactions and 20,289 point reads per vCPU-second (AWS z1d.2xlarge, PostgreSQL 14.5), so actual capacity is likely higher. Reads and writes share one coefficient: at the same adapter version, read-only YCSB-C was not faster than 50%-update YCSB-A.
- Log-broker throughput (capacityStreamMiBPerVcpuSecond 20 at 0.5 utilization, 4 GiB RAM per vCPU) is provider-documented by Google Managed Service for Apache Kafka sizing (https://docs.cloud.google.com/managed-service-for-apache-kafka/docs/plan-cluster-size): write-equivalent bytes are replicated writes plus a quarter of reads. Producer batches below 10 KB lower per-CPU throughput; that penalty is not modeled.
- Disk utilization 0.8 is provider-documented headroom below Cloud SQL automatic storage increase, which triggers near 91-95% full (https://docs.cloud.google.com/sql/docs/postgres/instance-settings). The 20 GiB reserve exceeds PostgreSQL’s 1 GB default max_wal_size; the remainder of that reserve is unmeasured.
- CPU tiers double from 2 vCPUs to the target’s largest node at 4 GiB per vCPU; each target’s documented largest node bounds CPU, RAM, RAM per vCPU and disk, and the durable staging database uses Cloud SQL Enterprise (96 vCPU, 6.5 GiB per vCPU, 624 GiB, 64 TiB). Targets billed per capacity unit or throughput unit are sized by their backend instead.
- No public evidence: peak/mean work (2) and the RAM working-set fraction (0.1). Proposed measurements: the p99 one-minute rate over the monthly mean from customer CloudWatch metrics; the buffer hit ratio while stepping RAM under a fixed YCSB-B load.
- Node bounds: Cloud SQL Enterprise allows 1-96 vCPUs at 0.9-6.5 GB per vCPU and up to 64 TB with a dedicated vCPU (https://docs.cloud.google.com/sql/docs/postgres/instance-settings).
- Stored GiB already includes the origin family’s physical footprint assumptions; no second storage amplification is applied.
- The operations/vCPU coefficient supplies the compute requirement alongside explicit resource-hour minima.
- Copies and allocation fractions change cost only; they do not increase modeled primary capacity.
- AWS Certificate Manager pricing: https://aws.amazon.com/certificate-manager/pricing/
- AWS Price List API, ACM offer: https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/ACM/current/us-east-1/index.json
- cert-manager license: https://github.com/cert-manager/cert-manager/blob/master/LICENSE
- Free allowances, committed discounts, credits, taxes and negotiated rates.
- Commercial Tensor9 fees and operations labor unless entered separately.
- ACM Private CA, exportable public certificates, paid external CA fees, authoritative DNS zones/queries and load-balancer/data-transfer charges.
- Taxes, discounts, credits and free-tier allowances not explicitly listed by this model.
- Unmodeled dependent services, task execution and operations outside the selected workload family.
plan-b9997b072d064101c5df2449030afac695fbe44e / 2026-10-22.planning.2. Curve: workload-2.
Sources: AWS Certificate Manager pricing, AWS Price List API, ACM offer, cert-manager license.
AWS ACM public certificates → cert-manager Certificate: Authored native-usage planning example. Native monthly usage priced at the cited provider list prices; listed target allowances apply where present, excluding invoice credits, taxes and negotiated discounts.
Scenario source region: us-east-1. Scenario target region: in-cluster. Currency: USD.
- Free allowances, committed discounts, credits, taxes and negotiated rates.
- Commercial Tensor9 fees and operations labor unless entered separately.
- ACM Private CA, exportable public certificates, paid external CA fees, authoritative DNS zones/queries and load-balancer/data-transfer charges.
- Taxes, discounts, credits and free-tier allowances not explicitly listed by this model.
- Unmodeled dependent services, task execution and operations outside the selected workload family.
- Translated reads: 10,000 operations.
- Translated writes: 33 operations.
- Translated resident physical data: under 0.01 GiB-month.
- Native provider operations: 726 operations.
- Published payload: 0 GiB.
- Delivered payload: 0 GiB.
- Allocated execution CPU: 0 vCPU-hour.
- Allocated execution RAM: 0 GiB-hour.
- Independent resource allocation: 0 resource-hour.
- Independent inventory: 100 resource-month.
- Input tokens: 0 tokens.
- Output tokens: 0 tokens.
- Billable network: 0 GiB.
- Dependent object sink retained data: 0 GiB-month.
- Dependent object sink writes: 0 writes.
- Rates are cited provider list prices, editable for discounts, commitments or another region. Workload translation and capacity coefficients remain editable planning assumptions, not benchmark measurements or a commercial quote.
- Default-zero rates are explicit assumptions, not evidence that the deployed service or resource is free.
- Provisioned-unit minimums use an editable approximate allocation floor. Modeled target service cost is max(usage/allocation, minimum), with billable network, durable staging and dependent sinks added separately; actual RU/TU sizing, scaling increments and throughput remain unqualified.
- Durable staging is priced once: provisioned targets include adapter state in their selected allocation; native targets add a separate staging allocation when required. Adapter hosting is a separate allocation and must exclude resources already priced as staging, workers or target capacity.
- A declared adapter mapping and cost model do not establish implementation availability or service equivalence.
- This is a declared directed mapping; a planning estimate does not establish deployment or request-serving support.
- Origin unit prices are cited provider list prices. Retention, amplification, and capacity coefficients are authored planning guesses; they are editable, not measured capacity.
- Public non-exportable source certificates have a zero authored source price. Exportable certificates and private-CA certificates require different models.
- Certificate storage, issuance polling, DNS challenges and adapter state differ from load-balancer traffic. Certificate trust and issuer availability remain backend-specific.
- The Azure native-provisioning Key Vault profile can use self-signed certificates; it must not be presented as the same public-trust workflow as the separate ACME backend.
- cert-manager (Apache-2.0) with an ACME issuer has no vendor charge and Let’s Encrypt issuance is free; the controller’s pods use node capacity, and DNS-01 challenge records bill under the DNS provider.
- Row-store throughput (capacityOpsPerVcpuSecond, default 1500) is measured-by-tensor9 as a lower bound: the DynamoDB adapter on Cloud SQL db-custom-2-7680 (2 vCPU, PostgreSQL 16, us-west1) served 2,974 ops/s of YCSB-A at 16 threads without recorded saturation (src/main/kotlin/t9/prime/equiv/generated/eval/CloudsqlPostgresqlYcsbAT16GoYcsbV1_0_0.kt). Published CPU-bound pgbench reaches 3,101 read-write transactions and 20,289 point reads per vCPU-second (AWS z1d.2xlarge, PostgreSQL 14.5), so actual capacity is likely higher. Reads and writes share one coefficient: at the same adapter version, read-only YCSB-C was not faster than 50%-update YCSB-A.
- Log-broker throughput (capacityStreamMiBPerVcpuSecond 20 at 0.5 utilization, 4 GiB RAM per vCPU) is provider-documented by Google Managed Service for Apache Kafka sizing (https://docs.cloud.google.com/managed-service-for-apache-kafka/docs/plan-cluster-size): write-equivalent bytes are replicated writes plus a quarter of reads. Producer batches below 10 KB lower per-CPU throughput; that penalty is not modeled.
- Disk utilization 0.8 is provider-documented headroom below Cloud SQL automatic storage increase, which triggers near 91-95% full (https://docs.cloud.google.com/sql/docs/postgres/instance-settings). The 20 GiB reserve exceeds PostgreSQL’s 1 GB default max_wal_size; the remainder of that reserve is unmeasured.
- CPU tiers double from 2 vCPUs to the target’s largest node at 4 GiB per vCPU; each target’s documented largest node bounds CPU, RAM, RAM per vCPU and disk, and the durable staging database uses Cloud SQL Enterprise (96 vCPU, 6.5 GiB per vCPU, 624 GiB, 64 TiB). Targets billed per capacity unit or throughput unit are sized by their backend instead.
- No public evidence: peak/mean work (2) and the RAM working-set fraction (0.1). Proposed measurements: the p99 one-minute rate over the monthly mean from customer CloudWatch metrics; the buffer hit ratio while stepping RAM under a fixed YCSB-B load.
- Node bounds: Cloud SQL Enterprise allows 1-96 vCPUs at 0.9-6.5 GB per vCPU and up to 64 TB with a dedicated vCPU (https://docs.cloud.google.com/sql/docs/postgres/instance-settings).
- Stored GiB already includes the origin family’s physical footprint assumptions; no second storage amplification is applied.
- The operations/vCPU coefficient supplies the compute requirement alongside explicit resource-hour minima.
- Copies and allocation fractions change cost only; they do not increase modeled primary capacity.
plan-b9997b072d064101c5df2449030afac695fbe44e / 2026-10-22.planning.2. Scenario: planning-example.
Sources: AWS Certificate Manager pricing, AWS Price List API, ACM offer, cert-manager license.