> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tensor9.com/llms.txt
> Use this file to discover all available pages before exploring further.

# CloudFront

> CloudFront APIs with Cloud Adapter.

This page describes how CloudFront maps to services in the environment where the application runs. Some profiles adapt origin API calls; others translate infrastructure or document target-native behavior.

## Supported environments

| Environment  | Mapping        |
| ------------ | -------------- |
| Azure        | Infrastructure |
| DigitalOcean | Infrastructure |
| Google Cloud | Infrastructure |
| Scaleway     | Infrastructure |

API means the profile adapts origin API behavior. Infrastructure means the profile changes provisioned resources or documents a target-native alternative without promising an origin API endpoint. Check the operation and capability tables for the behavior your application depends on.

## How the targets compare

Each row compares a capability of CloudFront with its adaptation on each target.
A dash means this profile does not state the capability for that target.

### Cloud Adapter

| Capability                                                                                           | CloudFront                                                 | Azure · Azure Front Door Premium                                                                                                   | Azure · Azure Front Door Standard                                                                                                 | DigitalOcean                                                                                                                                                       | Google Cloud                                                                                                                       | Scaleway                                             |
| ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------- |
| Edge network · who serves the traffic                                                                | CloudFront's global PoPs                                   | Azure Front Door's global edge                                                                                                     | Azure Front Door Standard's global edge                                                                                           | DigitalOcean's CDN edge                                                                                                                                            | Google Cloud CDN on the external load balancer                                                                                     | -                                                    |
| Origins · origin domains → backend                                                                   | Yes - multiple origins + origin groups with failover       | Partial - origin-group members selected by health probes                                                                           | Partial - origin-group members selected by health probes; public endpoints required                                               | Partial - the first origin's domain becomes the CDN origin; additional origins and origin groups drop and are flagged during the build                             | Partial - first HTTP backend service or bucket backend; additional origins and groups are reported                                 | -                                                    |
| Cache behaviors · paths, TTLs, cache key                                                             | Yes - path patterns, per-behavior TTLs, cache key, methods | Partial - path rules with one cache duration and query-string behavior; separate min/max TTL and header/method differences remain  | Partial - path rules with one cache duration and query-string behavior; separate min/max TTL and header/method differences remain | Partial - the default behavior's default TTL is preserved; path patterns, min/max TTL, and methods drop and are flagged during the build                           | Partial - backend cache policy with default/max/client TTLs, negative caching and cache keys; header/method differences remain     | -                                                    |
| Compression · automatic gzip/brotli                                                                  | Yes - automatic edge compression                           | Yes - the route's compression setting                                                                                              | Yes - the route's compression setting                                                                                             | Partial - there is no configurable compression setting; DigitalOcean's CDN edge may apply gzip automatically when the client requests it                           | Yes - the backend's compression mode                                                                                               | -                                                    |
| HTTPS redirect · viewer protocol policy                                                              | Yes - redirect-to-https / https-only                       | Yes - the route's HTTPS-redirect setting                                                                                           | Yes - the route's HTTPS-redirect setting                                                                                          | Partial - the viewer protocol policy has no counterpart; the DigitalOcean CDN endpoint serves over HTTPS by default                                                | Yes - a url\_map HTTPS redirect rule                                                                                               | -                                                    |
| Custom domains + TLS · aliases + certificate                                                         | Yes - alternate domain names + ACM viewer certificate      | Partial - target-managed certificate after domain validation; ACM material and TLS settings require review                         | Partial - target-managed certificate after domain validation; ACM material and TLS settings require review                        | Partial - the first alias becomes the CDN custom domain; additional aliases drop, and the viewer certificate becomes a DigitalOcean-managed certificate you attach | Partial - target-managed certificate after domain validation; ACM material and TLS settings require review                         | -                                                    |
| WAF / geo restrictions · web ACL + geo                                                               | Yes - AWS WAF web ACL + geo restrictions                   | Partial - custom match, rate-limit and country rules; Microsoft-managed rule selection differs from AWS groups                     | Partial - custom match, rate-limit and country rules; managed rules and bot protection require Premium                            | No - no attached-WAF or geo surface on the DigitalOcean CDN endpoint; dropped and flagged during the build                                                         | No - Cloud Armor configured separately; no automatic AWS web ACL or geo translation                                                | -                                                    |
| Origin access & signed URLs · origin and viewer authorization                                        | Yes - OAI / OAC + trusted-signer signed URLs               | Partial - approved Private Link access to supported origins; viewer signed-URL verification requires a separate application design | Partial - public origin with separate access controls; no Private Link or CloudFront viewer-signature verification                | -                                                                                                                                                                  | Partial - Cloud CDN signed URLs require a new HMAC signer; private bucket access or HTTP-origin controls are configured separately | -                                                    |
| Edge functions · Lambda\@Edge / Functions                                                            | Yes - Lambda\@Edge + CloudFront Functions                  | No - rule conditions and actions; no arbitrary function runtime                                                                    | Partial - header, URL and redirect rules; no arbitrary function runtime                                                           | No - no edge-compute analog; associations drop and standalone functions cause a build error                                                                        | No - no function runtime; unsupported associations reported and standalone functions rejected                                      | -                                                    |
| API coverage                                                                                         | full                                                       | high                                                                                                                               | high                                                                                                                              | minimal                                                                                                                                                            | high                                                                                                                               | minimal                                              |
| Origin access & signed URLs · locked-down origin                                                     | Yes - OAI / OAC + trusted-signer signed URLs               | -                                                                                                                                  | -                                                                                                                                 | No - the origin access control companion is removed and flagged during the build; a standalone origin access identity causes a build error                         | -                                                                                                                                  | -                                                    |
| The backend stage needs to know WHAT it points at · and a CloudFront origin does not say             | origin.domain\_name, an FQDN                               | -                                                                                                                                  | -                                                                                                                                 | -                                                                                                                                                                  | -                                                                                                                                  | one of s3 / lb / container / function backend config |
| Every path gets the DEFAULT cache behavior · the one most likely to surprise                         | ordered\_cache\_behavior, per path pattern                 | -                                                                                                                                  | -                                                                                                                                 | -                                                                                                                                                                  | -                                                                                                                                  | one cache stage for the whole pipeline               |
| There is a WAF stage, and your WAF association does not reach it · worth separating from 'no analog' | a WAFv2 web ACL associated with the distribution           | -                                                                                                                                  | -                                                                                                                                 | -                                                                                                                                                                  | -                                                                                                                                  | an unwired waf stage                                 |
| Access logs do not follow the distribution · they move products                                      | logging\_config writing to an S3 bucket                    | -                                                                                                                                  | -                                                                                                                                 | -                                                                                                                                                                  | -                                                                                                                                  | Cockpit, not wired by the build                      |

## On Azure

### Azure Front Door Premium

| Operation                                                                                                | Area             | Support      | Depth        | Notes                                                                                                                                                                                                                                                    |
| -------------------------------------------------------------------------------------------------------- | ---------------- | ------------ | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Origin access (OAI / OAC)                                                                                | Access control   | Partial      | Most usage   | Premium can connect to a supported origin through an approved Private Link endpoint. Configure the compatible origin and close unwanted alternate access paths. A standalone origin access identity without a supported translation causes a build error |
| Signed URLs & trusted keys                                                                               | Access control   | Out of scope | Most usage   | CloudFront signed URLs and signed cookies use RSA or ECDSA signatures that Front Door cannot verify; it is a different request authorization scheme, out of this option's scope and flagged during the build                                             |
| WAF & geo restrictions                                                                                   | Access control   | Partial      | Most usage   | Custom match, rate-limit and country rules become target WAF rules attached through a security policy. Premium supports Microsoft-managed rules and bot protection; AWS managed groups require target-specific rule selection.                           |
| Cache behaviors                                                                                          | Cache            | Partial      | Most usage   | Path-matched rules retain cache duration and query-string behavior. CloudFront default TTL supplies a single duration; separate minimum/maximum constraints and per-behavior header/method differences are reported.                                     |
| Content delivery                                                                                         | Content delivery | Supported    | Common       | served on Azure Front Door: Tensor9 provisions a Front Door profile and endpoint that front your origin, with an origin group and origins pointing at your backend; Microsoft operates the edge                                                          |
| DNS cutover                                                                                              | Content delivery | Supported    | Common       | Supported Route 53 aliases point to the target frontend. CloudFront domain\_name, arn and hosted\_zone\_id are not target identifiers; unsupported output references are removed and active configuration references cause a build error.                |
| Custom domains + TLS                                                                                     | Domains & TLS    | Partial      | Most usage   | Custom domains use target-managed certificates. Complete domain validation before cutover; an ACM ARN supplies no certificate material. Minimum TLS-version and SSL support-method differences are reported.                                             |
| Edge logic (Lambda\@Edge / CloudFront Functions)                                                         | Edge logic       | Out of scope | Most usage   | Rules engine conditions can express headers, URL changes and redirects, but cannot run arbitrary function code. Unsupported associations are omitted and reported; standalone functions cause a build error.                                             |
| Policy & monitoring facets (cache / origin-request / response-headers policies, monitoring subscription) | Facets           | Out of scope | Full surface | these resources are not supported by this mapping; the build reports an error                                                                                                                                                                            |
| Origins                                                                                                  | Origins          | Partial      | Common       | Origin hosts become members of an origin group. Confirm unresolved addresses and review differences between source failover conditions and Front Door health-probe selection.                                                                            |

#### How it works

Tensor9 translates the CloudFront distribution into an Azure Front Door Premium profile, endpoint, origin group, origins, route and rule set. Microsoft operates the edge cache and serves requests. The customer controls the origin and the target configuration.

A custom DNS name can remain after its record and certificate are ready for Front Door. The CloudFront-generated hostname and cached objects do not transfer. Expect origin requests as the new cache fills.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTUwIiB2aWV3Qm94PSIwIDAgODM2IDE1MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJGcm9udCBEb29yIHJvdXRlcyBhIHJlcXVlc3QgdGhyb3VnaCBjYWNoZSBydWxlcyB0byBhbiBvcmlnaW4gaW4gdGhlIGNvbmZpZ3VyZWQgZ3JvdXAuIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojMzM0MTU1fTwvc3R5bGU+PHJlY3QgeD0iMjQiIHk9IjQwIiB3aWR0aD0iMjQwIiBoZWlnaHQ9IjgwIiByeD0iMTAiIGZpbGw9IiNmOGZhZmMiIHN0cm9rZT0iIzY0NzQ4YiIvPjx0ZXh0IHg9IjE0NCIgeT0iNzAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMGYxNzJhIj5DdXN0b21lciByZXF1ZXN0PC90ZXh0Pjx0ZXh0IHg9IjE0NCIgeT0iOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5jdXN0b20gZG9tYWluPC90ZXh0PjxwYXRoIGQ9Ik0yNjYsODAgaDIyIGwtNiwtNSBtNiw1IGwtNiw1IiBmaWxsPSJub25lIiBzdHJva2U9IiM2NDc0OGIiIHN0cm9rZS13aWR0aD0iMiIvPjxyZWN0IHg9IjI5NCIgeT0iNDAiIHdpZHRoPSIyNDAiIGhlaWdodD0iODAiIHJ4PSIxMCIgZmlsbD0iI2Y4ZmFmYyIgc3Ryb2tlPSIjNjQ3NDhiIi8+PHRleHQgeD0iNDE0IiB5PSI3MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmEiPkZyb250IERvb3IgUHJlbWl1bTwvdGV4dD48dGV4dCB4PSI0MTQiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+cm91dGUgKyBjYWNoZSBydWxlczwvdGV4dD48cGF0aCBkPSJNNTM2LDgwIGgyMiBsLTYsLTUgbTYsNSBsLTYsNSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjNjQ3NDhiIiBzdHJva2Utd2lkdGg9IjIiLz48cmVjdCB4PSI1NjQiIHk9IjQwIiB3aWR0aD0iMjQwIiBoZWlnaHQ9IjgwIiByeD0iMTAiIGZpbGw9IiNmOGZhZmMiIHN0cm9rZT0iIzY0NzQ4YiIvPjx0ZXh0IHg9IjY4NCIgeT0iNzAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMGYxNzJhIj5PcmlnaW4gZ3JvdXA8L3RleHQ+PHRleHQgeD0iNjg0IiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPmhlYWx0aHkgb3JpZ2luPC90ZXh0Pjwvc3ZnPg==" alt="Front Door routes a request through cache rules to an origin in the configured group." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTUwIiB2aWV3Qm94PSIwIDAgODM2IDE1MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJGcm9udCBEb29yIHJvdXRlcyBhIHJlcXVlc3QgdGhyb3VnaCBjYWNoZSBydWxlcyB0byBhbiBvcmlnaW4gaW4gdGhlIGNvbmZpZ3VyZWQgZ3JvdXAuIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojY2JkNWUxfTwvc3R5bGU+PHJlY3QgeD0iMjQiIHk9IjQwIiB3aWR0aD0iMjQwIiBoZWlnaHQ9IjgwIiByeD0iMTAiIGZpbGw9IiMxYTI2MzEiIHN0cm9rZT0iIzY0NzQ4YiIvPjx0ZXh0IHg9IjE0NCIgeT0iNzAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4Ij5DdXN0b21lciByZXF1ZXN0PC90ZXh0Pjx0ZXh0IHg9IjE0NCIgeT0iOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5jdXN0b20gZG9tYWluPC90ZXh0PjxwYXRoIGQ9Ik0yNjYsODAgaDIyIGwtNiwtNSBtNiw1IGwtNiw1IiBmaWxsPSJub25lIiBzdHJva2U9IiM2NDc0OGIiIHN0cm9rZS13aWR0aD0iMiIvPjxyZWN0IHg9IjI5NCIgeT0iNDAiIHdpZHRoPSIyNDAiIGhlaWdodD0iODAiIHJ4PSIxMCIgZmlsbD0iIzFhMjYzMSIgc3Ryb2tlPSIjNjQ3NDhiIi8+PHRleHQgeD0iNDE0IiB5PSI3MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNlZDgiPkZyb250IERvb3IgUHJlbWl1bTwvdGV4dD48dGV4dCB4PSI0MTQiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+cm91dGUgKyBjYWNoZSBydWxlczwvdGV4dD48cGF0aCBkPSJNNTM2LDgwIGgyMiBsLTYsLTUgbTYsNSBsLTYsNSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjNjQ3NDhiIiBzdHJva2Utd2lkdGg9IjIiLz48cmVjdCB4PSI1NjQiIHk9IjQwIiB3aWR0aD0iMjQwIiBoZWlnaHQ9IjgwIiByeD0iMTAiIGZpbGw9IiMxYTI2MzEiIHN0cm9rZT0iIzY0NzQ4YiIvPjx0ZXh0IHg9IjY4NCIgeT0iNzAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4Ij5PcmlnaW4gZ3JvdXA8L3RleHQ+PHRleHQgeD0iNjg0IiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPmhlYWx0aHkgb3JpZ2luPC90ZXh0Pjwvc3ZnPg==" alt="Front Door routes a request through cache rules to an origin in the configured group." />
</div>

#### Origins and routing

The endpoint supplies the public host. A route associates that endpoint with an origin group and the rules applied to requests. Each declared origin host becomes an origin; the group uses health probes to select available origins. This differs from CloudFront origin-group failover, so review failover conditions and origin selection.

Confirm any origin address that compilation cannot resolve. An S3 origin follows the selected storage mapping to the target endpoint. Validate the origin host header, TLS and network access against that endpoint rather than retaining an AWS-specific address.

#### Origin access

Front Door Premium can reach supported origins through Private Link. For a Kubernetes service, provide the compatible Azure Private Link service and load balancer arrangement, then approve Front Door's managed private endpoint. An arbitrary private cluster is not reachable merely because the profile uses Premium.

Traffic reaches the origin through a private connection over Microsoft's network. The origin still needs to accept that private traffic, and the platform team must close any unwanted public or alternate access paths. Private Link does not require a connector process inside the application cluster.

CloudFront OAI and OAC govern authenticated access to supported origins; OAC is not a general private-network connection. The target requires the access controls appropriate to its origin type. Neither Standard nor Premium verifies existing CloudFront viewer signed-URL or signed-cookie signatures; that viewer-authorization scheme needs a separate application design.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTUwIiB2aWV3Qm94PSIwIDAgODM2IDE1MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJQcmVtaXVtIHJlYWNoZXMgYSBzdXBwb3J0ZWQgb3JpZ2luIHRocm91Z2ggYW4gYXBwcm92ZWQgUHJpdmF0ZSBMaW5rIGNvbm5lY3Rpb24uIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojMzM0MTU1fTwvc3R5bGU+PHJlY3QgeD0iMjQiIHk9IjQwIiB3aWR0aD0iMjQwIiBoZWlnaHQ9IjgwIiByeD0iMTAiIGZpbGw9IiNmOGZhZmMiIHN0cm9rZT0iIzY0NzQ4YiIvPjx0ZXh0IHg9IjE0NCIgeT0iNzAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMGYxNzJhIj5Gcm9udCBEb29yIFByZW1pdW08L3RleHQ+PHRleHQgeD0iMTQ0IiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPm9yaWdpbiByZXF1ZXN0PC90ZXh0PjxwYXRoIGQ9Ik0yNjYsODAgaDIyIGwtNiwtNSBtNiw1IGwtNiw1IiBmaWxsPSJub25lIiBzdHJva2U9IiM2NDc0OGIiIHN0cm9rZS13aWR0aD0iMiIvPjxyZWN0IHg9IjI5NCIgeT0iNDAiIHdpZHRoPSIyNDAiIGhlaWdodD0iODAiIHJ4PSIxMCIgZmlsbD0iI2Y4ZmFmYyIgc3Ryb2tlPSIjNjQ3NDhiIi8+PHRleHQgeD0iNDE0IiB5PSI3MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmEiPlByaXZhdGUgTGluazwvdGV4dD48dGV4dCB4PSI0MTQiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+YXBwcm92ZWQgY29ubmVjdGlvbjwvdGV4dD48cGF0aCBkPSJNNTM2LDgwIGgyMiBsLTYsLTUgbTYsNSBsLTYsNSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjNjQ3NDhiIiBzdHJva2Utd2lkdGg9IjIiLz48cmVjdCB4PSI1NjQiIHk9IjQwIiB3aWR0aD0iMjQwIiBoZWlnaHQ9IjgwIiByeD0iMTAiIGZpbGw9IiNmOGZhZmMiIHN0cm9rZT0iIzY0NzQ4YiIvPjx0ZXh0IHg9IjY4NCIgeT0iNzAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMGYxNzJhIj5PcmlnaW48L3RleHQ+PHRleHQgeD0iNjg0IiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPnZhbGlkYXRlcyBhY2Nlc3M8L3RleHQ+PC9zdmc+" alt="Premium reaches a supported origin through an approved Private Link connection." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTUwIiB2aWV3Qm94PSIwIDAgODM2IDE1MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJQcmVtaXVtIHJlYWNoZXMgYSBzdXBwb3J0ZWQgb3JpZ2luIHRocm91Z2ggYW4gYXBwcm92ZWQgUHJpdmF0ZSBMaW5rIGNvbm5lY3Rpb24uIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojY2JkNWUxfTwvc3R5bGU+PHJlY3QgeD0iMjQiIHk9IjQwIiB3aWR0aD0iMjQwIiBoZWlnaHQ9IjgwIiByeD0iMTAiIGZpbGw9IiMxYTI2MzEiIHN0cm9rZT0iIzY0NzQ4YiIvPjx0ZXh0IHg9IjE0NCIgeT0iNzAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4Ij5Gcm9udCBEb29yIFByZW1pdW08L3RleHQ+PHRleHQgeD0iMTQ0IiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPm9yaWdpbiByZXF1ZXN0PC90ZXh0PjxwYXRoIGQ9Ik0yNjYsODAgaDIyIGwtNiwtNSBtNiw1IGwtNiw1IiBmaWxsPSJub25lIiBzdHJva2U9IiM2NDc0OGIiIHN0cm9rZS13aWR0aD0iMiIvPjxyZWN0IHg9IjI5NCIgeT0iNDAiIHdpZHRoPSIyNDAiIGhlaWdodD0iODAiIHJ4PSIxMCIgZmlsbD0iIzFhMjYzMSIgc3Ryb2tlPSIjNjQ3NDhiIi8+PHRleHQgeD0iNDE0IiB5PSI3MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNlZDgiPlByaXZhdGUgTGluazwvdGV4dD48dGV4dCB4PSI0MTQiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+YXBwcm92ZWQgY29ubmVjdGlvbjwvdGV4dD48cGF0aCBkPSJNNTM2LDgwIGgyMiBsLTYsLTUgbTYsNSBsLTYsNSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjNjQ3NDhiIiBzdHJva2Utd2lkdGg9IjIiLz48cmVjdCB4PSI1NjQiIHk9IjQwIiB3aWR0aD0iMjQwIiBoZWlnaHQ9IjgwIiByeD0iMTAiIGZpbGw9IiMxYTI2MzEiIHN0cm9rZT0iIzY0NzQ4YiIvPjx0ZXh0IHg9IjY4NCIgeT0iNzAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4Ij5PcmlnaW48L3RleHQ+PHRleHQgeD0iNjg0IiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPnZhbGlkYXRlcyBhY2Nlc3M8L3RleHQ+PC9zdmc+" alt="Premium reaches a supported origin through an approved Private Link connection." />
</div>

#### Web application firewall

A Front Door firewall policy contains the target WAF rules; a security policy attaches it to the endpoint. Supported custom AWS match and rate-limit rules are expressed using Front Door conditions and actions, and geographic restrictions use country-match rules. An AWS `web_acl_id` is a reference, not an Azure policy.

Premium supports Microsoft-managed WAF rule sets and bot protection as well as custom rules. AWS managed groups are not the same rule sets: select the corresponding target protections and test their effect. Complex AWS conditions without a matching Front Door expression remain a reported limitation.

#### Cache behavior

Default and ordered cache behaviors become rules matched by path. A route-configuration override sets the cache duration and query-string behavior; compression is configured on the route. Check the query parameters included in the cache key, especially for personalized responses.

CloudFront's minimum, default and maximum TTLs do not map to three independent Front Door settings. The default TTL supplies the single cache duration; separate minimum and maximum constraints are reported during compilation. Forwarded-header lists and allowed-method lists also have differences. Verify the effective cache key and request handling rather than assuming that two source requests always remain distinct.

#### Rules and application code

The Rules engine can express header changes, URL or path rewrites and redirects. Those behaviors can be implemented with target rule conditions and actions on both Front Door tiers; arbitrary Lambda\@Edge or CloudFront Functions code does not run there.

Function associations that cannot be translated are omitted and reported. A standalone CloudFront function without a supported translation causes a build error. Move required application logic to a suitable runtime before cutover. CloudFront field-level encryption also has no equivalent in this mapping.

#### Domains and certificates

Each alias becomes a Front Door custom domain with a managed certificate. Complete domain validation and wait for certificate readiness before updating DNS. Front Door issues and renews that certificate; it does not copy an ACM certificate from its ARN. Review minimum TLS version and SSL support-method differences.

Supported Route 53 aliases are updated to the Front Door endpoint. CloudFront `domain_name`, `arn` and `hosted_zone_id` do not become Azure identifiers. References without a target equivalent are removed from outputs or rejected in active configuration. Update external DNS consumers and allowlists separately.

#### Operations and remaining limits

Azure's edge locations replace CloudFront price classes. Use Azure Monitor and diagnostic settings for access logs and metrics; an AWS monitoring subscription is not a Front Door setting. Review cache hit rates, origin health, latency and errors after cutover.

Cache, origin-request and response-headers policy resources need a supported distribution attachment and translation. Standalone policies, monitoring subscriptions and origin-access identities without one cause a build error. Resolve those resources together with the behavior they configure.

Provider reference: [securing Front Door origins](https://learn.microsoft.com/en-us/azure/frontdoor/origin-security).

### Azure Front Door Standard

| Operation                                                                                                           | Area             | Support      | Depth        | Notes                                                                                                                                                                                                                                                      |
| ------------------------------------------------------------------------------------------------------------------- | ---------------- | ------------ | ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Origin access & signed URLs                                                                                         | Access control   | Partial      | Most usage   | Standard reaches public origins. Restrict origin network access and validate configured origin headers; a secret header is not private networking. Private Link requires Premium. Existing CloudFront viewer signatures are not verified.                  |
| Signed URLs                                                                                                         | Access control   | Out of scope | Most usage   | CloudFront trusted-signer and trusted-key-group signed URLs are a different request authorization scheme (Front Door cannot verify CloudFront's RSA or ECDSA signatures), so signed URLs have no counterpart and are flagged during the build              |
| WAF / geo restrictions                                                                                              | Access control   | Partial      | Most usage   | Custom match, rate-limit and country rules become target WAF rules attached through a security policy. Microsoft-managed rules and bot protection require Premium. Unsupported source conditions are reported.                                             |
| Cache behaviors                                                                                                     | Cache            | Partial      | Most usage   | Path-matched rules retain cache duration and query-string behavior. CloudFront default TTL supplies a single duration; separate minimum/maximum constraints and per-behavior header/method differences are reported.                                       |
| Content delivery                                                                                                    | Content delivery | Supported    | Common       | served on Azure Front Door Standard: Tensor9 provisions a Front Door Standard profile and endpoint that front your origin, with an origin group and origins pointing at your backend; Microsoft operates the edge                                          |
| DNS cutover                                                                                                         | Content delivery | Supported    | Common       | Supported Route 53 aliases point to the target frontend. CloudFront domain\_name, arn and hosted\_zone\_id are not target identifiers; unsupported output references are removed and active configuration references cause a build error.                  |
| Custom domains + TLS                                                                                                | Domains & TLS    | Partial      | Most usage   | Custom domains use target-managed certificates. Complete domain validation before cutover; an ACM ARN supplies no certificate material. Minimum TLS-version and SSL support-method differences are reported.                                               |
| Declarative edge logic (Rules engine)                                                                               | Edge logic       | Partial      | Most usage   | Header, URL and redirect behavior can use Rules engine conditions and actions. Arbitrary function code, external calls and request-body inspection are outside this translation; unsupported associations are reported and standalone functions rejected.  |
| Policy & monitoring facets (standalone cache / origin-request / response-headers policies, monitoring subscription) | Facets           | Out of scope | Full surface | a cache, origin-request, or response-headers policy referenced by a behavior is re-expressed in that behavior's route and rules; a standalone policy claimed by no distribution, and the monitoring subscription, have no compiler and cause a build error |
| Origins                                                                                                             | Origins          | Partial      | Common       | Origin hosts become members of an origin group. Confirm unresolved addresses and review differences between source failover conditions and Front Door health-probe selection. Standard requires a public origin endpoint.                                  |

#### How it works

Tensor9 translates the CloudFront distribution into an Azure Front Door Standard profile, endpoint, origin group, origins, route and rule set. Microsoft operates the edge cache and serves requests. The customer controls the origin and the target configuration.

A custom DNS name can remain after its record and certificate are ready for Front Door. The CloudFront-generated hostname and cached objects do not transfer. Expect origin requests as the new cache fills.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTUwIiB2aWV3Qm94PSIwIDAgODM2IDE1MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJGcm9udCBEb29yIHJvdXRlcyBhIHJlcXVlc3QgdGhyb3VnaCBjYWNoZSBydWxlcyB0byBhbiBvcmlnaW4gaW4gdGhlIGNvbmZpZ3VyZWQgZ3JvdXAuIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojMzM0MTU1fTwvc3R5bGU+PHJlY3QgeD0iMjQiIHk9IjQwIiB3aWR0aD0iMjQwIiBoZWlnaHQ9IjgwIiByeD0iMTAiIGZpbGw9IiNmOGZhZmMiIHN0cm9rZT0iIzY0NzQ4YiIvPjx0ZXh0IHg9IjE0NCIgeT0iNzAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMGYxNzJhIj5DdXN0b21lciByZXF1ZXN0PC90ZXh0Pjx0ZXh0IHg9IjE0NCIgeT0iOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5jdXN0b20gZG9tYWluPC90ZXh0PjxwYXRoIGQ9Ik0yNjYsODAgaDIyIGwtNiwtNSBtNiw1IGwtNiw1IiBmaWxsPSJub25lIiBzdHJva2U9IiM2NDc0OGIiIHN0cm9rZS13aWR0aD0iMiIvPjxyZWN0IHg9IjI5NCIgeT0iNDAiIHdpZHRoPSIyNDAiIGhlaWdodD0iODAiIHJ4PSIxMCIgZmlsbD0iI2Y4ZmFmYyIgc3Ryb2tlPSIjNjQ3NDhiIi8+PHRleHQgeD0iNDE0IiB5PSI3MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmEiPkZyb250IERvb3IgU3RhbmRhcmQ8L3RleHQ+PHRleHQgeD0iNDE0IiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPnJvdXRlICsgY2FjaGUgcnVsZXM8L3RleHQ+PHBhdGggZD0iTTUzNiw4MCBoMjIgbC02LC01IG02LDUgbC02LDUiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzY0NzQ4YiIgc3Ryb2tlLXdpZHRoPSIyIi8+PHJlY3QgeD0iNTY0IiB5PSI0MCIgd2lkdGg9IjI0MCIgaGVpZ2h0PSI4MCIgcng9IjEwIiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiM2NDc0OGIiLz48dGV4dCB4PSI2ODQiIHk9IjcwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYSI+T3JpZ2luIGdyb3VwPC90ZXh0Pjx0ZXh0IHg9IjY4NCIgeT0iOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5oZWFsdGh5IG9yaWdpbjwvdGV4dD48L3N2Zz4=" alt="Front Door routes a request through cache rules to an origin in the configured group." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTUwIiB2aWV3Qm94PSIwIDAgODM2IDE1MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJGcm9udCBEb29yIHJvdXRlcyBhIHJlcXVlc3QgdGhyb3VnaCBjYWNoZSBydWxlcyB0byBhbiBvcmlnaW4gaW4gdGhlIGNvbmZpZ3VyZWQgZ3JvdXAuIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojY2JkNWUxfTwvc3R5bGU+PHJlY3QgeD0iMjQiIHk9IjQwIiB3aWR0aD0iMjQwIiBoZWlnaHQ9IjgwIiByeD0iMTAiIGZpbGw9IiMxYTI2MzEiIHN0cm9rZT0iIzY0NzQ4YiIvPjx0ZXh0IHg9IjE0NCIgeT0iNzAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4Ij5DdXN0b21lciByZXF1ZXN0PC90ZXh0Pjx0ZXh0IHg9IjE0NCIgeT0iOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5jdXN0b20gZG9tYWluPC90ZXh0PjxwYXRoIGQ9Ik0yNjYsODAgaDIyIGwtNiwtNSBtNiw1IGwtNiw1IiBmaWxsPSJub25lIiBzdHJva2U9IiM2NDc0OGIiIHN0cm9rZS13aWR0aD0iMiIvPjxyZWN0IHg9IjI5NCIgeT0iNDAiIHdpZHRoPSIyNDAiIGhlaWdodD0iODAiIHJ4PSIxMCIgZmlsbD0iIzFhMjYzMSIgc3Ryb2tlPSIjNjQ3NDhiIi8+PHRleHQgeD0iNDE0IiB5PSI3MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNlZDgiPkZyb250IERvb3IgU3RhbmRhcmQ8L3RleHQ+PHRleHQgeD0iNDE0IiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPnJvdXRlICsgY2FjaGUgcnVsZXM8L3RleHQ+PHBhdGggZD0iTTUzNiw4MCBoMjIgbC02LC01IG02LDUgbC02LDUiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzY0NzQ4YiIgc3Ryb2tlLXdpZHRoPSIyIi8+PHJlY3QgeD0iNTY0IiB5PSI0MCIgd2lkdGg9IjI0MCIgaGVpZ2h0PSI4MCIgcng9IjEwIiBmaWxsPSIjMWEyNjMxIiBzdHJva2U9IiM2NDc0OGIiLz48dGV4dCB4PSI2ODQiIHk9IjcwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkOCI+T3JpZ2luIGdyb3VwPC90ZXh0Pjx0ZXh0IHg9IjY4NCIgeT0iOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5oZWFsdGh5IG9yaWdpbjwvdGV4dD48L3N2Zz4=" alt="Front Door routes a request through cache rules to an origin in the configured group." />
</div>

#### Origins and routing

The endpoint supplies the public host. A route associates that endpoint with an origin group and the rules applied to requests. Each declared origin host becomes an origin; the group uses health probes to select available origins. This differs from CloudFront origin-group failover, so review failover conditions and origin selection.

Confirm any origin address that compilation cannot resolve. An S3 origin follows the selected storage mapping to the target endpoint. Validate the origin host header, TLS and network access against that endpoint rather than retaining an AWS-specific address.

#### Origin access

Front Door Standard needs an origin reachable through a public endpoint; it does not support Private Link origins. Use Premium with a compatible Private Link arrangement when the origin must have no public endpoint.

Restrict direct access to a public origin. The backend can validate a shared secret inserted in an origin request header, but that secret must be protected and rotated. Azure's origin-security guidance also combines the `AzureFrontDoor.Backend` network selector with validation of the expected `X-Azure-FDID` value. A header alone is not network isolation.

CloudFront OAI and OAC govern authenticated access to supported origins; OAC is not a general private-network connection. The target requires the access controls appropriate to its origin type. Neither Standard nor Premium verifies existing CloudFront viewer signed-URL or signed-cookie signatures; that viewer-authorization scheme needs a separate application design.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTUwIiB2aWV3Qm94PSIwIDAgODM2IDE1MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJTdGFuZGFyZCByZWFjaGVzIGEgcHVibGljIGVuZHBvaW50IHdob3NlIG5ldHdvcmsgYW5kIGFwcGxpY2F0aW9uIGNvbnRyb2xzIHJlc3RyaWN0IGFjY2Vzcy4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiMzMzQxNTV9PC9zdHlsZT48cmVjdCB4PSIyNCIgeT0iNDAiIHdpZHRoPSIyNDAiIGhlaWdodD0iODAiIHJ4PSIxMCIgZmlsbD0iI2Y4ZmFmYyIgc3Ryb2tlPSIjNjQ3NDhiIi8+PHRleHQgeD0iMTQ0IiB5PSI3MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmEiPkZyb250IERvb3IgU3RhbmRhcmQ8L3RleHQ+PHRleHQgeD0iMTQ0IiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPm9yaWdpbiByZXF1ZXN0PC90ZXh0PjxwYXRoIGQ9Ik0yNjYsODAgaDIyIGwtNiwtNSBtNiw1IGwtNiw1IiBmaWxsPSJub25lIiBzdHJva2U9IiM2NDc0OGIiIHN0cm9rZS13aWR0aD0iMiIvPjxyZWN0IHg9IjI5NCIgeT0iNDAiIHdpZHRoPSIyNDAiIGhlaWdodD0iODAiIHJ4PSIxMCIgZmlsbD0iI2Y4ZmFmYyIgc3Ryb2tlPSIjNjQ3NDhiIi8+PHRleHQgeD0iNDE0IiB5PSI3MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmEiPlB1YmxpYyBlbmRwb2ludDwvdGV4dD48dGV4dCB4PSI0MTQiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+cmVzdHJpY3RlZCBhY2Nlc3M8L3RleHQ+PHBhdGggZD0iTTUzNiw4MCBoMjIgbC02LC01IG02LDUgbC02LDUiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzY0NzQ4YiIgc3Ryb2tlLXdpZHRoPSIyIi8+PHJlY3QgeD0iNTY0IiB5PSI0MCIgd2lkdGg9IjI0MCIgaGVpZ2h0PSI4MCIgcng9IjEwIiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiM2NDc0OGIiLz48dGV4dCB4PSI2ODQiIHk9IjcwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYSI+T3JpZ2luPC90ZXh0Pjx0ZXh0IHg9IjY4NCIgeT0iOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj52YWxpZGF0ZXMgYWNjZXNzPC90ZXh0Pjwvc3ZnPg==" alt="Standard reaches a public endpoint whose network and application controls restrict access." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTUwIiB2aWV3Qm94PSIwIDAgODM2IDE1MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJTdGFuZGFyZCByZWFjaGVzIGEgcHVibGljIGVuZHBvaW50IHdob3NlIG5ldHdvcmsgYW5kIGFwcGxpY2F0aW9uIGNvbnRyb2xzIHJlc3RyaWN0IGFjY2Vzcy4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiNjYmQ1ZTF9PC9zdHlsZT48cmVjdCB4PSIyNCIgeT0iNDAiIHdpZHRoPSIyNDAiIGhlaWdodD0iODAiIHJ4PSIxMCIgZmlsbD0iIzFhMjYzMSIgc3Ryb2tlPSIjNjQ3NDhiIi8+PHRleHQgeD0iMTQ0IiB5PSI3MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNlZDgiPkZyb250IERvb3IgU3RhbmRhcmQ8L3RleHQ+PHRleHQgeD0iMTQ0IiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPm9yaWdpbiByZXF1ZXN0PC90ZXh0PjxwYXRoIGQ9Ik0yNjYsODAgaDIyIGwtNiwtNSBtNiw1IGwtNiw1IiBmaWxsPSJub25lIiBzdHJva2U9IiM2NDc0OGIiIHN0cm9rZS13aWR0aD0iMiIvPjxyZWN0IHg9IjI5NCIgeT0iNDAiIHdpZHRoPSIyNDAiIGhlaWdodD0iODAiIHJ4PSIxMCIgZmlsbD0iIzFhMjYzMSIgc3Ryb2tlPSIjNjQ3NDhiIi8+PHRleHQgeD0iNDE0IiB5PSI3MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNlZDgiPlB1YmxpYyBlbmRwb2ludDwvdGV4dD48dGV4dCB4PSI0MTQiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+cmVzdHJpY3RlZCBhY2Nlc3M8L3RleHQ+PHBhdGggZD0iTTUzNiw4MCBoMjIgbC02LC01IG02LDUgbC02LDUiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzY0NzQ4YiIgc3Ryb2tlLXdpZHRoPSIyIi8+PHJlY3QgeD0iNTY0IiB5PSI0MCIgd2lkdGg9IjI0MCIgaGVpZ2h0PSI4MCIgcng9IjEwIiBmaWxsPSIjMWEyNjMxIiBzdHJva2U9IiM2NDc0OGIiLz48dGV4dCB4PSI2ODQiIHk9IjcwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkOCI+T3JpZ2luPC90ZXh0Pjx0ZXh0IHg9IjY4NCIgeT0iOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij52YWxpZGF0ZXMgYWNjZXNzPC90ZXh0Pjwvc3ZnPg==" alt="Standard reaches a public endpoint whose network and application controls restrict access." />
</div>

#### Web application firewall

A Front Door firewall policy contains the target WAF rules; a security policy attaches it to the endpoint. Supported custom AWS match and rate-limit rules are expressed using Front Door conditions and actions, and geographic restrictions use country-match rules. An AWS `web_acl_id` is a reference, not an Azure policy.

Standard supports custom match rules, rate limits and country-based rules. Microsoft-managed rule sets and bot protection require Premium. A source web ACL that depends on managed groups therefore needs a different protection plan; custom rules alone do not reproduce those groups.

#### Cache behavior

Default and ordered cache behaviors become rules matched by path. A route-configuration override sets the cache duration and query-string behavior; compression is configured on the route. Check the query parameters included in the cache key, especially for personalized responses.

CloudFront's minimum, default and maximum TTLs do not map to three independent Front Door settings. The default TTL supplies the single cache duration; separate minimum and maximum constraints are reported during compilation. Forwarded-header lists and allowed-method lists also have differences. Verify the effective cache key and request handling rather than assuming that two source requests always remain distinct.

#### Rules and application code

The Rules engine can express header changes, URL or path rewrites and redirects. Those behaviors can be implemented with target rule conditions and actions on both Front Door tiers; arbitrary Lambda\@Edge or CloudFront Functions code does not run there.

Function associations that cannot be translated are omitted and reported. A standalone CloudFront function without a supported translation causes a build error. Move required application logic to a suitable runtime before cutover. CloudFront field-level encryption also has no equivalent in this mapping.

#### Domains and certificates

Each alias becomes a Front Door custom domain with a managed certificate. Complete domain validation and wait for certificate readiness before updating DNS. Front Door issues and renews that certificate; it does not copy an ACM certificate from its ARN. Review minimum TLS version and SSL support-method differences.

Supported Route 53 aliases are updated to the Front Door endpoint. CloudFront `domain_name`, `arn` and `hosted_zone_id` do not become Azure identifiers. References without a target equivalent are removed from outputs or rejected in active configuration. Update external DNS consumers and allowlists separately.

#### Operations and remaining limits

Azure's edge locations replace CloudFront price classes. Use Azure Monitor and diagnostic settings for access logs and metrics; an AWS monitoring subscription is not a Front Door setting. Review cache hit rates, origin health, latency and errors after cutover.

Cache, origin-request and response-headers policy resources need a supported distribution attachment and translation. Standalone policies, monitoring subscriptions and origin-access identities without one cause a build error. Resolve those resources together with the behavior they configure.

Provider reference: [securing Front Door origins](https://learn.microsoft.com/en-us/azure/frontdoor/origin-security).

## On DigitalOcean

### DigitalOcean CDN

| Operation                                                                                                | Area           | Support      | Depth        | Notes                                                                                                                                                                                                            |
| -------------------------------------------------------------------------------------------------------- | -------------- | ------------ | ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Origin access (OAI / OAC)                                                                                | Access control | Out of scope | Most usage   | origin access controls are omitted and reported during the build; a standalone origin access identity has no compiler and causes a build error                                                                   |
| WAF / geo restrictions / signed URLs                                                                     | Access control | Out of scope | Most usage   | the WAF association and geo restrictions drop and are reported during the build; trusted signers / key groups drop under the cache-behavior issue                                                                |
| Cache behaviors                                                                                          | Caching        | Partial      | Common       | the default behavior's default TTL is applied; other settings (path patterns, protocol policy, methods, forwarded values, min/max TTL) drops and are reported during the build                                   |
| Content delivery                                                                                         | Data plane     | Supported    | Common       | DigitalOcean's CDN edge serves the traffic from a CDN endpoint fronting one origin FQDN; only the first origin, default TTL, and first custom domain are mapped                                                  |
| Custom domains + TLS                                                                                     | Domains & TLS  | Partial      | Most usage   | the first alias becomes the CDN custom domain; any further aliases are left behind; the viewer certificate drops with a surfaced operator step to attach a DigitalOcean-managed certificate                      |
| Edge logic (Lambda\@Edge / CloudFront Functions)                                                         | Edge logic     | Out of scope | Most usage   | associations are not translated, and drop under the blanket cache-behavior issue; a standalone cloudfront\_function resource has no compiler and causes a build error                                            |
| Policy & monitoring facets (cache / origin-request / response-headers policies, monitoring subscription) | Facets         | Out of scope | Full surface | these resources are not supported by this mapping; the build reports an error                                                                                                                                    |
| Logging / price class / http version / root object                                                       | Observability  | Out of scope | Full surface | dropped and are reported during the build                                                                                                                                                                        |
| Origins                                                                                                  | Origins        | Partial      | Common       | the first origin's literal domain becomes the CDN origin; an expression-based origin becomes a configuration value you must confirm; additional origins and origin groups drop and are reported during the build |

#### How it works

Tensor9 maps a CloudFront distribution to one `digitalocean_cdn` endpoint. It copies the **first origin's domain**, the default behavior's **default TTL**, and the **first custom domain**. DigitalOcean's edge serves the requests directly.

Additional origins, ordered cache behaviors, WAF rules, and edge functions do not transfer. The build reports unsupported settings. Attach the DigitalOcean-managed certificate after the endpoint is provisioned.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTk2IiB2aWV3Qm94PSIwIDAgODM2IDE5NiIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJCZWZvcmU6IG9uIEFXUyB5b3VyIGN1c3RvbWVycyByZWFjaCBhbiBBbWF6b24gQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gdGhhdCBmcm9udHMgeW91ciBvcmlnaW4uIEFmdGVyOiBpbiB0aGUgdGFyZ2V0IGNsb3VkIHRoYXQgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gY29sbGFwc2VzIHRvIGEgc2luZ2xlIHRoaW4gRGlnaXRhbE9jZWFuIENETiBlbmRwb2ludCBvdmVyIHlvdXIgZmlyc3Qgb3JpZ2luJ3MgZG9tYWluLCB3aGljaCBEaWdpdGFsT2NlYW4ncyBlZGdlIHNlcnZlczsgVGVuc29yOSBjb21waWxlcyBpdCBhdCByZWxlYXNlLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6IzMzNDE1NX08L3N0eWxlPgo8ZGVmcz48bWFya2VyIGlkPSJkbzEiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOCIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjciIG1hcmtlckhlaWdodD0iNyIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPjxwYXRoIGQ9Ik0wLDAgTDEwLDUgTDAsMTAgeiIgZmlsbD0iIzk0YTNiOCIvPjwvbWFya2VyPjwvZGVmcz4KPHJlY3QgeD0iMTYiIHk9IjQ0IiB3aWR0aD0iMzg0IiBoZWlnaHQ9IjEzMCIgcng9IjE0IiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiNjYmQ1ZTEiIHN0cm9rZS13aWR0aD0iMS40IiBzdHJva2UtZGFzaGFycmF5PSI1IDUiLz4KPHRleHQgeD0iMzAiIHk9IjYyIiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiODsgZmlsbDojOTRhM2I4Ij5PTiBBV1MgVE9EQVk8L3RleHQ+CjxyZWN0IHg9IjMyIiB5PSI4MiIgd2lkdGg9IjEwNCIgaGVpZ2h0PSI2NiIgcng9IjExIiBmaWxsPSIjZmZmIiBzdHJva2U9IiNlMmU4ZjAiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9Ijg0IiB5PSIxMTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMGYxNzJhOyBmb250LXNpemU6MTJweCI+WW91ciBjdXN0b21lcnM8L3RleHQ+Cjx0ZXh0IHg9Ijg0IiB5PSIxMjgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj52aWV3ZXJzPC90ZXh0Pgo8bGluZSB4MT0iMTM2IiB5MT0iMTE1IiB4Mj0iMTk2IiB5Mj0iMTE1IiBzdHJva2U9IiM5NGEzYjgiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNkbzEpIi8+Cjx0ZXh0IHg9IjE2NiIgeT0iMTA2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzY0NzQ4YjsgZm9udC1zaXplOjguNXB4Ij5yZXF1ZXN0czwvdGV4dD4KPHJlY3QgeD0iMjAwIiB5PSI3OCIgd2lkdGg9IjE4NCIgaGVpZ2h0PSI3NCIgcng9IjExIiBmaWxsPSIjZmZmIiBzdHJva2U9IiNlMmU4ZjAiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjI5MiIgeT0iMTEyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYTsgZm9udC1zaXplOjEycHgiPkFtYXpvbiBDbG91ZEZyb250PC90ZXh0Pgo8dGV4dCB4PSIyOTIiIHk9IjEyOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPmRpc3RyaWJ1dGlvbiDCtyBmcm9udHMgeW91ciBvcmlnaW48L3RleHQ+CjxsaW5lIHgxPSI0MTgiIHkxPSI0MCIgeDI9IjQxOCIgeTI9IjE2NCIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuNCIvPgo8cmVjdCB4PSI0MzYiIHk9IjQ0IiB3aWR0aD0iMzg0IiBoZWlnaHQ9IjEzMCIgcng9IjE0IiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiNjYmQ1ZTEiIHN0cm9rZS13aWR0aD0iMS40IiBzdHJva2UtZGFzaGFycmF5PSI1IDUiLz4KPHRleHQgeD0iNDUwIiB5PSI2MiIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjg7IGZpbGw6IzA0Nzg1NyI+T04gVEhFIFRBUkdFVCBDTE9VRDwvdGV4dD4KPHJlY3QgeD0iNDUyIiB5PSI4MiIgd2lkdGg9IjEwNCIgaGVpZ2h0PSI2NiIgcng9IjExIiBmaWxsPSIjZmZmIiBzdHJva2U9IiNlMmU4ZjAiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjUwNCIgeT0iMTEyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYTsgZm9udC1zaXplOjEycHgiPllvdXIgY3VzdG9tZXJzPC90ZXh0Pgo8dGV4dCB4PSI1MDQiIHk9IjEyOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDYwMCAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMDU5NjY5OyBmaWxsOiMwNTk2NjkiPnNhbWUgcmVxdWVzdHM8L3RleHQ+CjxsaW5lIHgxPSI1NTYiIHkxPSIxMTUiIHgyPSI2MTIiIHkyPSIxMTUiIHN0cm9rZT0iIzk0YTNiOCIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI2RvMSkiLz4KPHRleHQgeD0iNTg0IiB5PSIxMDYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMHB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNjQ3NDhiOyBmb250LXNpemU6OC41cHg7ZmlsbDojMDA2OUZGIj5jb2xsYXBzZXMgdG88L3RleHQ+CjxyZWN0IHg9IjYxNiIgeT0iNzQiIHdpZHRoPSIxOTIiIGhlaWdodD0iODIiIHJ4PSIxMSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjMDA4MEZGIiBzdHJva2Utd2lkdGg9IjEuNiIvPgo8c3ZnIHg9IjYzMCIgeT0iOTAiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDI0IDI0Ij48ZyB0cmFuc2Zvcm09InNjYWxlKDAuMTg3NSkiIGZpbGw9IiMwMDgwRkYiPjxwYXRoIGQ9Ik02My43MjQgMTEwLjcyNVY5Mi41NDNjMTkuMzUyIDAgMzQuMjgyLTE5LjAwOCAyNi44MTctMzkuMTE4LTIuNzY1LTcuNDM4LTguNTctMTMuNDk5LTE2LjMxMi0xNi4yNTQtMTkuOTA1LTcuMTYyLTM4Ljk4MiA3LjcxNC0zOC45ODIgMjYuNzIySDE3YzAtMzAuMzAzIDI5LjU4Mi01NC4yNyA2MS45My00NC4zNTIgMTQuMSA0LjQwNyAyNS4xNTggMTUuNDI3IDI5LjU4MiAyOS40NzYgOS45NTMgMzIuMjMxLTE0LjEgNjEuNzA4LTQ0Ljc4OCA2MS43MDh6Ii8+PHBhdGggZD0iTTY0IDkyLjU0M0g0NS43NTNWNzQuNjM3SDY0djE3LjkwNnptLTE4LjI0NyAxNC4wNUgzMS45Mjl2LTE0LjA1aDEzLjgyNHYxNC4wNXptLTEzLjgyNC0xNC4wNUgyMC4zMTh2LTExLjU3aDExLjYxMXYxMS41N3oiLz48L2c+PC9zdmc+Cjx0ZXh0IHg9IjcxMiIgeT0iMTA0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYTsgZm9udC1zaXplOjEycHgiPkRpZ2l0YWxPY2VhbiBDRE48L3RleHQ+Cjx0ZXh0IHg9IjcxMiIgeT0iMTIwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+b25lIENETiBlbmRwb2ludDwvdGV4dD4KPHRleHQgeD0iNzEyIiB5PSIxMzYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5vdmVyIHlvdXIgZmlyc3Qgb3JpZ2luIMK3IERPJ3MgZWRnZTwvdGV4dD4KPC9zdmc+" alt="Before: on AWS your customers reach an Amazon CloudFront distribution that fronts your origin. After: in the target cloud that CloudFront distribution collapses to a single thin DigitalOcean CDN endpoint over your first origin's domain, which DigitalOcean's edge serves; Tensor9 compiles it at release." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTk2IiB2aWV3Qm94PSIwIDAgODM2IDE5NiIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJCZWZvcmU6IG9uIEFXUyB5b3VyIGN1c3RvbWVycyByZWFjaCBhbiBBbWF6b24gQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gdGhhdCBmcm9udHMgeW91ciBvcmlnaW4uIEFmdGVyOiBpbiB0aGUgdGFyZ2V0IGNsb3VkIHRoYXQgQ2xvdWRGcm9udCBkaXN0cmlidXRpb24gY29sbGFwc2VzIHRvIGEgc2luZ2xlIHRoaW4gRGlnaXRhbE9jZWFuIENETiBlbmRwb2ludCBvdmVyIHlvdXIgZmlyc3Qgb3JpZ2luJ3MgZG9tYWluLCB3aGljaCBEaWdpdGFsT2NlYW4ncyBlZGdlIHNlcnZlczsgVGVuc29yOSBjb21waWxlcyBpdCBhdCByZWxlYXNlLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6I2NiZDVlMX08L3N0eWxlPgo8ZGVmcz48bWFya2VyIGlkPSJkbzEiIHZpZXdCb3g9IjAgMCAxMCAxMCIgcmVmWD0iOCIgcmVmWT0iNSIgbWFya2VyV2lkdGg9IjciIG1hcmtlckhlaWdodD0iNyIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPjxwYXRoIGQ9Ik0wLDAgTDEwLDUgTDAsMTAgeiIgZmlsbD0iIzk0YTNiOCIvPjwvbWFya2VyPjwvZGVmcz4KPHJlY3QgeD0iMTYiIHk9IjQ0IiB3aWR0aD0iMzg0IiBoZWlnaHQ9IjEzMCIgcng9IjE0IiBmaWxsPSIjMWEyNjMxIiBzdHJva2U9IiMzZDRmNjYiIHN0cm9rZS13aWR0aD0iMS40IiBzdHJva2UtZGFzaGFycmF5PSI1IDUiLz4KPHRleHQgeD0iMzAiIHk9IjYyIiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiODsgZmlsbDogIzk0YTNiOCI+T04gQVdTIFRPREFZPC90ZXh0Pgo8cmVjdCB4PSIzMiIgeT0iODIiIHdpZHRoPSIxMDQiIGhlaWdodD0iNjYiIHJ4PSIxMSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI4NCIgeT0iMTEyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkODsgZm9udC1zaXplOjEycHgiPllvdXIgY3VzdG9tZXJzPC90ZXh0Pgo8dGV4dCB4PSI4NCIgeT0iMTI4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+dmlld2VyczwvdGV4dD4KPGxpbmUgeDE9IjEzNiIgeTE9IjExNSIgeDI9IjE5NiIgeTI9IjExNSIgc3Ryb2tlPSIjNDE0ZTYyIiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjZG8xKSIvPgo8dGV4dCB4PSIxNjYiIHk9IjEwNiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZvbnQtc2l6ZTo4LjVweCI+cmVxdWVzdHM8L3RleHQ+CjxyZWN0IHg9IjIwMCIgeT0iNzgiIHdpZHRoPSIxODQiIGhlaWdodD0iNzQiIHJ4PSIxMSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2IiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSIyOTIiIHk9IjExMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNlZDg7IGZvbnQtc2l6ZToxMnB4Ij5BbWF6b24gQ2xvdWRGcm9udDwvdGV4dD4KPHRleHQgeD0iMjkyIiB5PSIxMjgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5kaXN0cmlidXRpb24gwrcgZnJvbnRzIHlvdXIgb3JpZ2luPC90ZXh0Pgo8bGluZSB4MT0iNDE4IiB5MT0iNDAiIHgyPSI0MTgiIHkyPSIxNjQiIHN0cm9rZT0iIzNkNGU2NiIgc3Ryb2tlLXdpZHRoPSIxLjQiLz4KPHJlY3QgeD0iNDM2IiB5PSI0NCIgd2lkdGg9IjM4NCIgaGVpZ2h0PSIxMzAiIHJ4PSIxNCIgZmlsbD0iIzFhMjYzMSIgc3Ryb2tlPSIjM2Q0ZjY2IiBzdHJva2Utd2lkdGg9IjEuNCIgc3Ryb2tlLWRhc2hhcnJheT0iNSA1Ii8+Cjx0ZXh0IHg9IjQ1MCIgeT0iNjIiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4OyBmaWxsOiAjOTBkZWM4Ij5PTiBUSEUgVEFSR0VUIENMT1VEPC90ZXh0Pgo8cmVjdCB4PSI0NTIiIHk9IjgyIiB3aWR0aD0iMTA0IiBoZWlnaHQ9IjY2IiByeD0iMTEiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGU2NiIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iNTA0IiB5PSIxMTIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4OyBmb250LXNpemU6MTJweCI+WW91ciBjdXN0b21lcnM8L3RleHQ+Cjx0ZXh0IHg9IjUwNCIgeT0iMTI4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjAwIDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzY7IGZpbGw6ICM5MGRlYzYiPnNhbWUgcmVxdWVzdHM8L3RleHQ+CjxsaW5lIHgxPSI1NTYiIHkxPSIxMTUiIHgyPSI2MTIiIHkyPSIxMTUiIHN0cm9rZT0iIzQxNGU2MiIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI2RvMSkiLz4KPHRleHQgeD0iNTg0IiB5PSIxMDYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMHB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmb250LXNpemU6OC41cHg7ZmlsbDogIzkwYjBkZSI+Y29sbGFwc2VzIHRvPC90ZXh0Pgo8cmVjdCB4PSI2MTYiIHk9Ijc0IiB3aWR0aD0iMTkyIiBoZWlnaHQ9IjgyIiByeD0iMTEiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzAwODBGRiIgc3Ryb2tlLXdpZHRoPSIxLjYiLz4KPHN2ZyB4PSI2MzAiIHk9IjkwIiB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHZpZXdCb3g9IjAgMCAyNCAyNCI+PGcgdHJhbnNmb3JtPSJzY2FsZSgwLjE4NzUpIiBmaWxsPSIjMDA4MEZGIj48cGF0aCBkPSJNNjMuNzI0IDExMC43MjVWOTIuNTQzYzE5LjM1MiAwIDM0LjI4Mi0xOS4wMDggMjYuODE3LTM5LjExOC0yLjc2NS03LjQzOC04LjU3LTEzLjQ5OS0xNi4zMTItMTYuMjU0LTE5LjkwNS03LjE2Mi0zOC45ODIgNy43MTQtMzguOTgyIDI2LjcyMkgxN2MwLTMwLjMwMyAyOS41ODItNTQuMjcgNjEuOTMtNDQuMzUyIDE0LjEgNC40MDcgMjUuMTU4IDE1LjQyNyAyOS41ODIgMjkuNDc2IDkuOTUzIDMyLjIzMS0xNC4xIDYxLjcwOC00NC43ODggNjEuNzA4eiIvPjxwYXRoIGQ9Ik02NCA5Mi41NDNINDUuNzUzVjc0LjYzN0g2NHYxNy45MDZ6bS0xOC4yNDcgMTQuMDVIMzEuOTI5di0xNC4wNWgxMy44MjR2MTQuMDV6bS0xMy44MjQtMTQuMDVIMjAuMzE4di0xMS41N2gxMS42MTF2MTEuNTd6Ii8+PC9nPjwvc3ZnPgo8dGV4dCB4PSI3MTIiIHk9IjEwNCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNlZDg7IGZvbnQtc2l6ZToxMnB4Ij5EaWdpdGFsT2NlYW4gQ0ROPC90ZXh0Pgo8dGV4dCB4PSI3MTIiIHk9IjEyMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPm9uZSBDRE4gZW5kcG9pbnQ8L3RleHQ+Cjx0ZXh0IHg9IjcxMiIgeT0iMTM2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+b3ZlciB5b3VyIGZpcnN0IG9yaWdpbiDCtyBETydzIGVkZ2U8L3RleHQ+Cjwvc3ZnPg==" alt="Before: on AWS your customers reach an Amazon CloudFront distribution that fronts your origin. After: in the target cloud that CloudFront distribution collapses to a single thin DigitalOcean CDN endpoint over your first origin's domain, which DigitalOcean's edge serves; Tensor9 compiles it at release." />
</div>

<p className="t9-caption">Your customers reach the same content; the CloudFront distribution collapses to a single thin DigitalOcean CDN endpoint over your first origin's domain, which DigitalOcean's edge serves. Tensor9 compiles it at release and is not in the serving path.</p>

#### Supported configuration

The first origin's domain becomes `origin`, the default behavior's default TTL becomes `ttl`, and the first alias becomes `custom_domain`. The diagram shows how these three settings map. The limitations below list the settings that are omitted and reported during the build.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMzAwIiB2aWV3Qm94PSIwIDAgODM2IDMwMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJZb3VyIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIChtdWx0aXBsZSBvcmlnaW5zIGFuZCBvcmlnaW4gZ3JvdXBzLCBvcmRlcmVkIGNhY2hlIGJlaGF2aW9ycywgYWx0ZXJuYXRlIGRvbWFpbiBuYW1lcywgV0FGIGFuZCBnZW8gcmVzdHJpY3Rpb25zLCBhbmQgZWRnZSBmdW5jdGlvbnMpIGZ1bm5lbHMgZG93biB0byBhIHNpbmdsZSB0aGluIGRpZ2l0YWxvY2Vhbl9jZG4gZW5kcG9pbnQgdGhhdCBoYXMganVzdCB0aHJlZSBmaWVsZHM6IHRoZSBmaXJzdCBvcmlnaW4ncyBkb21haW4gYmVjb21lcyBvcmlnaW4sIHRoZSBkZWZhdWx0IFRUTCBiZWNvbWVzIHR0bCwgYW5kIHRoZSBmaXJzdCBhbGlhcyBiZWNvbWVzIGN1c3RvbV9kb21haW4uIEFkZGl0aW9uYWwgc2V0dGluZ3MgaXMgYSBmbGFnZ2VkLCBjdXN0b21lci12aXNpYmxlIGRyb3AuIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojMzM0MTU1fTwvc3R5bGU+CjxkZWZzPjxtYXJrZXIgaWQ9ImRvMiIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNyIgbWFya2VySGVpZ2h0PSI3IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjMDA4MEZGIi8+PC9tYXJrZXI+PG1hcmtlciBpZD0iZG8yYSIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNyIgbWFya2VySGVpZ2h0PSI3IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjZjU5ZTBiIi8+PC9tYXJrZXI+PC9kZWZzPgo8dGV4dCB4PSIyNiIgeT0iMzQiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4OyBmaWxsOiM2NDc0OGIiPlRIRSBUQVJHRVQgQ0xPVURGUk9OVCBESVNUUklCVVRJT04gwrcgUklDSDwvdGV4dD4KPHJlY3QgeD0iMjYiIHk9IjQ4IiB3aWR0aD0iMjEwIiBoZWlnaHQ9IjMyIiByeD0iOCIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuMiIvPgo8dGV4dCB4PSI0MCIgeT0iNjgiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiMzMzQxNTUiPm11bHRpcGxlIG9yaWdpbnMgKyBncm91cHM8L3RleHQ+CjxyZWN0IHg9IjI2IiB5PSI4NiIgd2lkdGg9IjIxMCIgaGVpZ2h0PSIzMiIgcng9IjgiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIgc3Ryb2tlLXdpZHRoPSIxLjIiLz4KPHRleHQgeD0iNDAiIHk9IjEwNiIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzMzNDE1NSI+b3JkZXJlZCBjYWNoZSBiZWhhdmlvcnM8L3RleHQ+CjxyZWN0IHg9IjI2IiB5PSIxMjQiIHdpZHRoPSIyMTAiIGhlaWdodD0iMzIiIHJ4PSI4IiBmaWxsPSIjZmZmIiBzdHJva2U9IiNlMmU4ZjAiIHN0cm9rZS13aWR0aD0iMS4yIi8+Cjx0ZXh0IHg9IjQwIiB5PSIxNDQiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiMzMzQxNTUiPmFsdGVybmF0ZSBkb21haW4gbmFtZXM8L3RleHQ+CjxyZWN0IHg9IjI2IiB5PSIxNjIiIHdpZHRoPSIyMTAiIGhlaWdodD0iMzIiIHJ4PSI4IiBmaWxsPSIjZmZmIiBzdHJva2U9IiNlMmU4ZjAiIHN0cm9rZS13aWR0aD0iMS4yIi8+Cjx0ZXh0IHg9IjQwIiB5PSIxODIiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiMzMzQxNTUiPldBRiArIGdlbyByZXN0cmljdGlvbnM8L3RleHQ+CjxyZWN0IHg9IjI2IiB5PSIyMDAiIHdpZHRoPSIyMTAiIGhlaWdodD0iMzIiIHJ4PSI4IiBmaWxsPSIjZmZmIiBzdHJva2U9IiNlMmU4ZjAiIHN0cm9rZS13aWR0aD0iMS4yIi8+Cjx0ZXh0IHg9IjQwIiB5PSIyMjAiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiMzMzQxNTUiPmVkZ2UgZnVuY3Rpb25zICsgcHJpY2UgY2xhc3M8L3RleHQ+Cjxwb2x5Z29uIHBvaW50cz0iMjQ2LDQ0IDUyMCwxMzYgNTIwLDE3MiAyNDYsMjM2IiBmaWxsPSIjZWZmNmZmIiBzdHJva2U9IiMwMDgwRkYiIHN0cm9rZS13aWR0aD0iMS40IiBzdHJva2UtZGFzaGFycmF5PSI1IDQiLz4KPGxpbmUgeDE9IjIzNiIgeTE9IjY0IiB4Mj0iNTE0IiB5Mj0iMTUwIiBzdHJva2U9IiM5M2M1ZmQiIHN0cm9rZS13aWR0aD0iMS40Ii8+CjxsaW5lIHgxPSIyMzYiIHkxPSIxMDIiIHgyPSI1MTQiIHkyPSIxNTIiIHN0cm9rZT0iIzkzYzVmZCIgc3Ryb2tlLXdpZHRoPSIxLjQiLz4KPGxpbmUgeDE9IjIzNiIgeTE9IjE0MCIgeDI9IjUxNCIgeTI9IjE1NCIgc3Ryb2tlPSIjOTNjNWZkIiBzdHJva2Utd2lkdGg9IjEuNCIvPgo8bGluZSB4MT0iMjM2IiB5MT0iMTc4IiB4Mj0iNTE0IiB5Mj0iMTU2IiBzdHJva2U9IiM5M2M1ZmQiIHN0cm9rZS13aWR0aD0iMS40Ii8+CjxsaW5lIHgxPSIyMzYiIHkxPSIyMTYiIHgyPSI1MTQiIHkyPSIxNTgiIHN0cm9rZT0iIzkzYzVmZCIgc3Ryb2tlLXdpZHRoPSIxLjQiLz4KPHRleHQgeD0iMzY4IiB5PSIxMjAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMHB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNjQ3NDhiOyBmb250LXNpemU6OS41cHg7ZmlsbDojMDA2OUZGIj5jb2xsYXBzZXMgdG8gb25lPC90ZXh0Pgo8bGluZSB4MT0iNTIwIiB5MT0iMTU0IiB4Mj0iNTYwIiB5Mj0iMTU0IiBzdHJva2U9IiMwMDgwRkYiIHN0cm9rZS13aWR0aD0iMi40IiBtYXJrZXItZW5kPSJ1cmwoI2RvMikiLz4KPHJlY3QgeD0iNTY0IiB5PSI5NiIgd2lkdGg9IjI0OCIgaGVpZ2h0PSIxMjIiIHJ4PSIxMiIgZmlsbD0iI2YwZjdmZiIgc3Ryb2tlPSIjMDA4MEZGIiBzdHJva2Utd2lkdGg9IjEuOSIvPgo8dGV4dCB4PSI1ODAiIHk9IjEyMCIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjg7IGZpbGw6IzAwNjlGRiI+T05FIFRISU4gRU5EUE9JTlQ8L3RleHQ+CjxzdmcgeD0iNTgwIiB5PSIxMjgiIHdpZHRoPSIxOCIgaGVpZ2h0PSIxOCIgdmlld0JveD0iMCAwIDI0IDI0Ij48ZyB0cmFuc2Zvcm09InNjYWxlKDAuMTg3NSkiIGZpbGw9IiMwMDgwRkYiPjxwYXRoIGQ9Ik02My43MjQgMTEwLjcyNVY5Mi41NDNjMTkuMzUyIDAgMzQuMjgyLTE5LjAwOCAyNi44MTctMzkuMTE4LTIuNzY1LTcuNDM4LTguNTctMTMuNDk5LTE2LjMxMi0xNi4yNTQtMTkuOTA1LTcuMTYyLTM4Ljk4MiA3LjcxNC0zOC45ODIgMjYuNzIySDE3YzAtMzAuMzAzIDI5LjU4Mi01NC4yNyA2MS45My00NC4zNTIgMTQuMSA0LjQwNyAyNS4xNTggMTUuNDI3IDI5LjU4MiAyOS40NzYgOS45NTMgMzIuMjMxLTE0LjEgNjEuNzA4LTQ0Ljc4OCA2MS43MDh6Ii8+PHBhdGggZD0iTTY0IDkyLjU0M0g0NS43NTNWNzQuNjM3SDY0djE3LjkwNnptLTE4LjI0NyAxNC4wNUgzMS45Mjl2LTE0LjA1aDEzLjgyNHYxNC4wNXptLTEzLjgyNC0xNC4wNUgyMC4zMTh2LTExLjU3aDExLjYxMXYxMS41N3oiLz48L2c+PC9zdmc+Cjx0ZXh0IHg9IjYwNCIgeT0iMTQyIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYTsgZm9udC1zaXplOjEyLjVweCI+ZGlnaXRhbG9jZWFuX2NkbjwvdGV4dD4KPHRleHQgeD0iNTgwIiB5PSIxNjgiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjNDc1NTY5OyBmaWxsOiMzMzQxNTUiPm9yaWdpbiA9IHlvdXIgZmlyc3Qgb3JpZ2luPC90ZXh0Pgo8dGV4dCB4PSI1ODAiIHk9IjE4OCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICM0NzU1Njk7IGZpbGw6IzMzNDE1NSI+dHRsID0gZGVmYXVsdCBUVEw8L3RleHQ+Cjx0ZXh0IHg9IjU4MCIgeT0iMjA4IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzQ3NTU2OTsgZmlsbDojMzM0MTU1Ij5jdXN0b21fZG9tYWluID0gZmlyc3QgYWxpYXM8L3RleHQ+CjxsaW5lIHgxPSIzNjYiIHkxPSIyMDYiIHgyPSIzNjYiIHkyPSIyNTIiIHN0cm9rZT0iI2Y1OWUwYiIgc3Ryb2tlLXdpZHRoPSIxLjYiIHN0cm9rZS1kYXNoYXJyYXk9IjQgMyIgbWFya2VyLWVuZD0idXJsKCNkbzJhKSIvPgo8dGV4dCB4PSIyODYiIHk9IjI3NCIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGI7IGZpbGw6I2I0NTMwOSI+4pazIGV2ZXJ5dGhpbmcgcmljaGVyIHRoYW4gdGhlc2UgdGhyZWUgZmllbGRzIGlzIGEgZmxhZ2dlZCwgY3VzdG9tZXItdmlzaWJsZSBkcm9wOyBzZWUgYmVsb3c8L3RleHQ+Cjwvc3ZnPg==" alt="Your CloudFront distribution (multiple origins and origin groups, ordered cache behaviors, alternate domain names, WAF and geo restrictions, and edge functions) funnels down to a single thin digitalocean_cdn endpoint that has just three fields: the first origin's domain becomes origin, the default TTL becomes ttl, and the first alias becomes custom_domain. Additional settings is a flagged, customer-visible drop." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMzAwIiB2aWV3Qm94PSIwIDAgODM2IDMwMCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJZb3VyIENsb3VkRnJvbnQgZGlzdHJpYnV0aW9uIChtdWx0aXBsZSBvcmlnaW5zIGFuZCBvcmlnaW4gZ3JvdXBzLCBvcmRlcmVkIGNhY2hlIGJlaGF2aW9ycywgYWx0ZXJuYXRlIGRvbWFpbiBuYW1lcywgV0FGIGFuZCBnZW8gcmVzdHJpY3Rpb25zLCBhbmQgZWRnZSBmdW5jdGlvbnMpIGZ1bm5lbHMgZG93biB0byBhIHNpbmdsZSB0aGluIGRpZ2l0YWxvY2Vhbl9jZG4gZW5kcG9pbnQgdGhhdCBoYXMganVzdCB0aHJlZSBmaWVsZHM6IHRoZSBmaXJzdCBvcmlnaW4ncyBkb21haW4gYmVjb21lcyBvcmlnaW4sIHRoZSBkZWZhdWx0IFRUTCBiZWNvbWVzIHR0bCwgYW5kIHRoZSBmaXJzdCBhbGlhcyBiZWNvbWVzIGN1c3RvbV9kb21haW4uIEFkZGl0aW9uYWwgc2V0dGluZ3MgaXMgYSBmbGFnZ2VkLCBjdXN0b21lci12aXNpYmxlIGRyb3AuIj48c3R5bGU+dGV4dHtmb250LWZhbWlseTpJbnRlciwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCwnU2Vnb2UgVUknLFJvYm90bywnSGVsdmV0aWNhIE5ldWUnLEFyaWFsLHNhbnMtc2VyaWY7ZmlsbDojY2JkNWUxfTwvc3R5bGU+CjxkZWZzPjxtYXJrZXIgaWQ9ImRvMiIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNyIgbWFya2VySGVpZ2h0PSI3IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjMDA4MEZGIi8+PC9tYXJrZXI+PG1hcmtlciBpZD0iZG8yYSIgdmlld0JveD0iMCAwIDEwIDEwIiByZWZYPSI4IiByZWZZPSI1IiBtYXJrZXJXaWR0aD0iNyIgbWFya2VySGVpZ2h0PSI3IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+PHBhdGggZD0iTTAsMCBMMTAsNSBMMCwxMCB6IiBmaWxsPSIjZjU5ZTBiIi8+PC9tYXJrZXI+PC9kZWZzPgo8dGV4dCB4PSIyNiIgeT0iMzQiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4OyBmaWxsOiAjYzljZmQ4Ij5USEUgVEFSR0VUIENMT1VERlJPTlQgRElTVFJJQlVUSU9OIMK3IFJJQ0g8L3RleHQ+CjxyZWN0IHg9IjI2IiB5PSI0OCIgd2lkdGg9IjIxMCIgaGVpZ2h0PSIzMiIgcng9IjgiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGU2NiIgc3Ryb2tlLXdpZHRoPSIxLjIiLz4KPHRleHQgeD0iNDAiIHk9IjY4IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2M5Y2ZkOCI+bXVsdGlwbGUgb3JpZ2lucyArIGdyb3VwczwvdGV4dD4KPHJlY3QgeD0iMjYiIHk9Ijg2IiB3aWR0aD0iMjEwIiBoZWlnaHQ9IjMyIiByeD0iOCIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2IiBzdHJva2Utd2lkdGg9IjEuMiIvPgo8dGV4dCB4PSI0MCIgeT0iMTA2IiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2M5Y2ZkOCI+b3JkZXJlZCBjYWNoZSBiZWhhdmlvcnM8L3RleHQ+CjxyZWN0IHg9IjI2IiB5PSIxMjQiIHdpZHRoPSIyMTAiIGhlaWdodD0iMzIiIHJ4PSI4IiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRlNjYiIHN0cm9rZS13aWR0aD0iMS4yIi8+Cjx0ZXh0IHg9IjQwIiB5PSIxNDQiIHN0eWxlPSJmb250OiAxMXB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmaWxsOiAjYzljZmQ4Ij5hbHRlcm5hdGUgZG9tYWluIG5hbWVzPC90ZXh0Pgo8cmVjdCB4PSIyNiIgeT0iMTYyIiB3aWR0aD0iMjEwIiBoZWlnaHQ9IjMyIiByeD0iOCIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjM2Q0ZTY2IiBzdHJva2Utd2lkdGg9IjEuMiIvPgo8dGV4dCB4PSI0MCIgeT0iMTgyIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2M5Y2ZkOCI+V0FGICsgZ2VvIHJlc3RyaWN0aW9uczwvdGV4dD4KPHJlY3QgeD0iMjYiIHk9IjIwMCIgd2lkdGg9IjIxMCIgaGVpZ2h0PSIzMiIgcng9IjgiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGU2NiIgc3Ryb2tlLXdpZHRoPSIxLjIiLz4KPHRleHQgeD0iNDAiIHk9IjIyMCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNjOWNmZDgiPmVkZ2UgZnVuY3Rpb25zICsgcHJpY2UgY2xhc3M8L3RleHQ+Cjxwb2x5Z29uIHBvaW50cz0iMjQ2LDQ0IDUyMCwxMzYgNTIwLDE3MiAyNDYsMjM2IiBmaWxsPSIjMWEyNDMxIiBzdHJva2U9IiMwMDgwRkYiIHN0cm9rZS13aWR0aD0iMS40IiBzdHJva2UtZGFzaGFycmF5PSI1IDQiLz4KPGxpbmUgeDE9IjIzNiIgeTE9IjY0IiB4Mj0iNTE0IiB5Mj0iMTUwIiBzdHJva2U9IiMzZDUwNjYiIHN0cm9rZS13aWR0aD0iMS40Ii8+CjxsaW5lIHgxPSIyMzYiIHkxPSIxMDIiIHgyPSI1MTQiIHkyPSIxNTIiIHN0cm9rZT0iIzNkNTA2NiIgc3Ryb2tlLXdpZHRoPSIxLjQiLz4KPGxpbmUgeDE9IjIzNiIgeTE9IjE0MCIgeDI9IjUxNCIgeTI9IjE1NCIgc3Ryb2tlPSIjM2Q1MDY2IiBzdHJva2Utd2lkdGg9IjEuNCIvPgo8bGluZSB4MT0iMjM2IiB5MT0iMTc4IiB4Mj0iNTE0IiB5Mj0iMTU2IiBzdHJva2U9IiMzZDUwNjYiIHN0cm9rZS13aWR0aD0iMS40Ii8+CjxsaW5lIHgxPSIyMzYiIHkxPSIyMTYiIHgyPSI1MTQiIHkyPSIxNTgiIHN0cm9rZT0iIzNkNTA2NiIgc3Ryb2tlLXdpZHRoPSIxLjQiLz4KPHRleHQgeD0iMzY4IiB5PSIxMjAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMHB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmb250LXNpemU6OS41cHg7ZmlsbDogIzkwYjBkZSI+Y29sbGFwc2VzIHRvIG9uZTwvdGV4dD4KPGxpbmUgeDE9IjUyMCIgeTE9IjE1NCIgeDI9IjU2MCIgeTI9IjE1NCIgc3Ryb2tlPSIjMDA4MEZGIiBzdHJva2Utd2lkdGg9IjIuNCIgbWFya2VyLWVuZD0idXJsKCNkbzIpIi8+CjxyZWN0IHg9IjU2NCIgeT0iOTYiIHdpZHRoPSIyNDgiIGhlaWdodD0iMTIyIiByeD0iMTIiIGZpbGw9IiMxYTI1MzEiIHN0cm9rZT0iIzAwODBGRiIgc3Ryb2tlLXdpZHRoPSIxLjkiLz4KPHRleHQgeD0iNTgwIiB5PSIxMjAiIHN0eWxlPSJmb250OiA3MDAgMTBweCBJbnRlciwgc2Fucy1zZXJpZjsgbGV0dGVyLXNwYWNpbmc6IDEuM3B4OyBmaWxsOiAjOTRhM2I4OyBmaWxsOiAjOTBiMGRlIj5PTkUgVEhJTiBFTkRQT0lOVDwvdGV4dD4KPHN2ZyB4PSI1ODAiIHk9IjEyOCIgd2lkdGg9IjE4IiBoZWlnaHQ9IjE4IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxnIHRyYW5zZm9ybT0ic2NhbGUoMC4xODc1KSIgZmlsbD0iIzAwODBGRiI+PHBhdGggZD0iTTYzLjcyNCAxMTAuNzI1VjkyLjU0M2MxOS4zNTIgMCAzNC4yODItMTkuMDA4IDI2LjgxNy0zOS4xMTgtMi43NjUtNy40MzgtOC41Ny0xMy40OTktMTYuMzEyLTE2LjI1NC0xOS45MDUtNy4xNjItMzguOTgyIDcuNzE0LTM4Ljk4MiAyNi43MjJIMTdjMC0zMC4zMDMgMjkuNTgyLTU0LjI3IDYxLjkzLTQ0LjM1MiAxNC4xIDQuNDA3IDI1LjE1OCAxNS40MjcgMjkuNTgyIDI5LjQ3NiA5Ljk1MyAzMi4yMzEtMTQuMSA2MS43MDgtNDQuNzg4IDYxLjcwOHoiLz48cGF0aCBkPSJNNjQgOTIuNTQzSDQ1Ljc1M1Y3NC42MzdINjR2MTcuOTA2em0tMTguMjQ3IDE0LjA1SDMxLjkyOXYtMTQuMDVoMTMuODI0djE0LjA1em0tMTMuODI0LTE0LjA1SDIwLjMxOHYtMTEuNTdoMTEuNjExdjExLjU3eiIvPjwvZz48L3N2Zz4KPHRleHQgeD0iNjA0IiB5PSIxNDIiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4OyBmb250LXNpemU6MTIuNXB4Ij5kaWdpdGFsb2NlYW5fY2RuPC90ZXh0Pgo8dGV4dCB4PSI1ODAiIHk9IjE2OCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNjOWNmZDgiPm9yaWdpbiA9IHlvdXIgZmlyc3Qgb3JpZ2luPC90ZXh0Pgo8dGV4dCB4PSI1ODAiIHk9IjE4OCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNjOWNmZDgiPnR0bCA9IGRlZmF1bHQgVFRMPC90ZXh0Pgo8dGV4dCB4PSI1ODAiIHk9IjIwOCIgc3R5bGU9ImZvbnQ6IDExcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZpbGw6ICNjOWNmZDgiPmN1c3RvbV9kb21haW4gPSBmaXJzdCBhbGlhczwvdGV4dD4KPGxpbmUgeDE9IjM2NiIgeTE9IjIwNiIgeDI9IjM2NiIgeTI9IjI1MiIgc3Ryb2tlPSIjZjU5ZTBiIiBzdHJva2Utd2lkdGg9IjEuNiIgc3Ryb2tlLWRhc2hhcnJheT0iNCAzIiBtYXJrZXItZW5kPSJ1cmwoI2RvMmEpIi8+Cjx0ZXh0IHg9IjI4NiIgeT0iMjc0IiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkODsgZmlsbDogI2RlYjI5MCI+4pazIGV2ZXJ5dGhpbmcgcmljaGVyIHRoYW4gdGhlc2UgdGhyZWUgZmllbGRzIGlzIGEgZmxhZ2dlZCwgY3VzdG9tZXItdmlzaWJsZSBkcm9wOyBzZWUgYmVsb3c8L3RleHQ+Cjwvc3ZnPg==" alt="Your CloudFront distribution (multiple origins and origin groups, ordered cache behaviors, alternate domain names, WAF and geo restrictions, and edge functions) funnels down to a single thin digitalocean_cdn endpoint that has just three fields: the first origin's domain becomes origin, the default TTL becomes ttl, and the first alias becomes custom_domain. Additional settings is a flagged, customer-visible drop." />
</div>

<p className="t9-caption">The distinct DigitalOcean move: your CloudFront distribution funnels down to a single CDN endpoint that has three fields: the first origin becomes origin , the default TTL becomes ttl , and the first alias becomes custom\_domain . Additional settings falls away as a flagged drop.</p>

#### How traffic flows

Once built, your customers' requests reach **DigitalOcean's CDN edge**, which serves from your **first origin**, the bucket or app behind the distribution. DigitalOcean operates the edge and Tensor9 is not in the serving path. A **Route 53 alias** that pointed at the distribution **retargets to the `digitalocean_cdn` endpoint**, so the name your customers resolve is unchanged; only its target moves.

What consumers depend on survives: the CDN's **endpoint and its id** are passed through to anything that read them. What is left behind is the distribution's own edge identity: `domain_name`, `arn`, and `hosted_zone_id` have no DigitalOcean equivalent. A reference to one resolves only **inside an output** (the output is removed with a flagged issue); anywhere else it **causes a build error** rather than resolving to the wrong host.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjUwIiB2aWV3Qm94PSIwIDAgODM2IDI1MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJUcmFmZmljIHBhdGg6IHlvdXIgY3VzdG9tZXJzIHJlYWNoIERpZ2l0YWxPY2VhbidzIENETiBlZGdlLCB3aGljaCBzZXJ2ZXMgZnJvbSB5b3VyIGZpcnN0IG9yaWdpbi4gSWRlbnRpdHk6IGEgUm91dGUgNTMgYWxpYXMgdGhhdCBwb2ludGVkIGF0IHRoZSBkaXN0cmlidXRpb24gcmV0YXJnZXRzIHRvIHRoZSBkaWdpdGFsb2NlYW5fY2RuIGVuZHBvaW50LCBhbmQgdGhlIGVuZHBvaW50IHBsdXMgaXRzIGlkIGFyZSBwYXNzZWQgdGhyb3VnaCB0byB5b3VyIGNvbnN1bWVycy4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiMzMzQxNTV9PC9zdHlsZT4KPGRlZnM+PG1hcmtlciBpZD0iZG8zIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiM5NGEzYjgiLz48L21hcmtlcj48bWFya2VyIGlkPSJkbzNiIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiMwMDgwRkYiLz48L21hcmtlcj48L2RlZnM+Cjx0ZXh0IHg9IjI2IiB5PSIzNCIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjg7IGZpbGw6IzY0NzQ4YiI+VEhFIFNFUlZJTkcgUEFUSDwvdGV4dD4KPHJlY3QgeD0iMjYiIHk9IjQ2IiB3aWR0aD0iMTIwIiBoZWlnaHQ9IjcwIiByeD0iMTEiIGZpbGw9IiNmZmYiIHN0cm9rZT0iI2UyZThmMCIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iODYiIHk9Ijc4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYTsgZm9udC1zaXplOjEycHgiPllvdXIgY3VzdG9tZXJzPC90ZXh0Pgo8dGV4dCB4PSI4NiIgeT0iOTQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj52aWV3ZXJzPC90ZXh0Pgo8bGluZSB4MT0iMTQ2IiB5MT0iODEiIHgyPSIyMDAiIHkyPSI4MSIgc3Ryb2tlPSIjOTRhM2I4IiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjZG8zKSIvPgo8dGV4dCB4PSIxNzMiIHk9IjcyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzY0NzQ4YjsgZm9udC1zaXplOjguNXB4Ij5yZXF1ZXN0czwvdGV4dD4KPHJlY3QgeD0iMjA0IiB5PSI0MCIgd2lkdGg9IjIwNiIgaGVpZ2h0PSI4MiIgcng9IjExIiBmaWxsPSIjZmZmIiBzdHJva2U9IiMwMDgwRkYiIHN0cm9rZS13aWR0aD0iMS43Ii8+CjxzdmcgeD0iMjE4IiB5PSI1NiIgd2lkdGg9IjIwIiBoZWlnaHQ9IjIwIiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxnIHRyYW5zZm9ybT0ic2NhbGUoMC4xODc1KSIgZmlsbD0iIzAwODBGRiI+PHBhdGggZD0iTTYzLjcyNCAxMTAuNzI1VjkyLjU0M2MxOS4zNTIgMCAzNC4yODItMTkuMDA4IDI2LjgxNy0zOS4xMTgtMi43NjUtNy40MzgtOC41Ny0xMy40OTktMTYuMzEyLTE2LjI1NC0xOS45MDUtNy4xNjItMzguOTgyIDcuNzE0LTM4Ljk4MiAyNi43MjJIMTdjMC0zMC4zMDMgMjkuNTgyLTU0LjI3IDYxLjkzLTQ0LjM1MiAxNC4xIDQuNDA3IDI1LjE1OCAxNS40MjcgMjkuNTgyIDI5LjQ3NiA5Ljk1MyAzMi4yMzEtMTQuMSA2MS43MDgtNDQuNzg4IDYxLjcwOHoiLz48cGF0aCBkPSJNNjQgOTIuNTQzSDQ1Ljc1M1Y3NC42MzdINjR2MTcuOTA2em0tMTguMjQ3IDE0LjA1SDMxLjkyOXYtMTQuMDVoMTMuODI0djE0LjA1em0tMTMuODI0LTE0LjA1SDIwLjMxOHYtMTEuNTdoMTEuNjExdjExLjU3eiIvPjwvZz48L3N2Zz4KPHRleHQgeD0iMzA3IiB5PSI3MCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMi41cHgiPkRpZ2l0YWxPY2VhbiBDRE48L3RleHQ+Cjx0ZXh0IHg9IjMwNyIgeT0iODYiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5lZGdlIHNlcnZlcyB0aGUgdHJhZmZpYzwvdGV4dD4KPHRleHQgeD0iMzA3IiB5PSIxMDIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2MDAgMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzA1OTY2OTsgZmlsbDojMDA2OUZGIj5mcm9tIHlvdXIgZmlyc3Qgb3JpZ2luPC90ZXh0Pgo8bGluZSB4MT0iNDEwIiB5MT0iODEiIHgyPSI0NjQiIHkyPSI4MSIgc3Ryb2tlPSIjOTRhM2I4IiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjZG8zKSIvPgo8dGV4dCB4PSI0MzciIHk9IjcyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzY0NzQ4YjsgZm9udC1zaXplOjguNXB4Ij5vcmlnaW4gZmV0Y2g8L3RleHQ+CjxyZWN0IHg9IjQ2OCIgeT0iNDYiIHdpZHRoPSIxNTAiIGhlaWdodD0iNzAiIHJ4PSIxMSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI1NDMiIHk9Ijc4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYTsgZm9udC1zaXplOjEycHgiPllvdXIgZmlyc3Qgb3JpZ2luPC90ZXh0Pgo8dGV4dCB4PSI1NDMiIHk9Ijk0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+YnVja2V0IG9yIGFwcDwvdGV4dD4KPGxpbmUgeDE9IjE2IiB5MT0iMTQwIiB4Mj0iODIwIiB5Mj0iMTQwIiBzdHJva2U9IiNlMmU4ZjAiIHN0cm9rZS13aWR0aD0iMS4yIiBzdHJva2UtZGFzaGFycmF5PSI0IDQiLz4KPHRleHQgeD0iMjYiIHk9IjE2NCIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjg7IGZpbGw6IzAwNjlGRiI+VEhFIEVORFBPSU5UIElERU5USVRZIFRIQVQgQ0FSUklFUzwvdGV4dD4KPHJlY3QgeD0iMjYiIHk9IjE3NiIgd2lkdGg9IjE2OCIgaGVpZ2h0PSI1OCIgcng9IjExIiBmaWxsPSIjZmZmIiBzdHJva2U9IiNlMmU4ZjAiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjExMCIgeT0iMjAwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYTsgZm9udC1zaXplOjExLjVweCI+Um91dGUgNTMgYWxpYXM8L3RleHQ+Cjx0ZXh0IHg9IjExMCIgeT0iMjE4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzQ3NTU2OTsgZm9udC1zaXplOjEwcHgiPmFwcC5leGFtcGxlLmNvbSDCtyB1bmNoYW5nZWQ8L3RleHQ+CjxsaW5lIHgxPSIxOTQiIHkxPSIyMDUiIHgyPSIyNDYiIHkyPSIyMDUiIHN0cm9rZT0iIzAwODBGRiIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI2RvM2IpIi8+Cjx0ZXh0IHg9IjIyMCIgeT0iMTk2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzY0NzQ4YjsgZm9udC1zaXplOjhweDtmaWxsOiMwMDY5RkYiPnJldGFyZ2V0cyB0bzwvdGV4dD4KPHJlY3QgeD0iMjUwIiB5PSIxNzYiIHdpZHRoPSIyMzYiIGhlaWdodD0iNTgiIHJ4PSIxMSIgZmlsbD0iI2YwZjdmZiIgc3Ryb2tlPSIjMDA4MEZGIiBzdHJva2Utd2lkdGg9IjEuNyIvPgo8c3ZnIHg9IjI2NCIgeT0iMTg4IiB3aWR0aD0iMTgiIGhlaWdodD0iMTgiIHZpZXdCb3g9IjAgMCAyNCAyNCI+PGcgdHJhbnNmb3JtPSJzY2FsZSgwLjE4NzUpIiBmaWxsPSIjMDA4MEZGIj48cGF0aCBkPSJNNjMuNzI0IDExMC43MjVWOTIuNTQzYzE5LjM1MiAwIDM0LjI4Mi0xOS4wMDggMjYuODE3LTM5LjExOC0yLjc2NS03LjQzOC04LjU3LTEzLjQ5OS0xNi4zMTItMTYuMjU0LTE5LjkwNS03LjE2Mi0zOC45ODIgNy43MTQtMzguOTgyIDI2LjcyMkgxN2MwLTMwLjMwMyAyOS41ODItNTQuMjcgNjEuOTMtNDQuMzUyIDE0LjEgNC40MDcgMjUuMTU4IDE1LjQyNyAyOS41ODIgMjkuNDc2IDkuOTUzIDMyLjIzMS0xNC4xIDYxLjcwOC00NC43ODggNjEuNzA4eiIvPjxwYXRoIGQ9Ik02NCA5Mi41NDNINDUuNzUzVjc0LjYzN0g2NHYxNy45MDZ6bS0xOC4yNDcgMTQuMDVIMzEuOTI5di0xNC4wNWgxMy44MjR2MTQuMDV6bS0xMy44MjQtMTQuMDVIMjAuMzE4di0xMS41N2gxMS42MTF2MTEuNTd6Ii8+PC9nPjwvc3ZnPgo8dGV4dCB4PSIzNzYiIHk9IjIwMCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMS41cHgiPmRpZ2l0YWxvY2Vhbl9jZG4gZW5kcG9pbnQ8L3RleHQ+Cjx0ZXh0IHg9IjM3NiIgeT0iMjE4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+RGlnaXRhbE9jZWFuJ3MgZWRnZSBhbnN3ZXJzPC90ZXh0Pgo8bGluZSB4MT0iNDg2IiB5MT0iMjA1IiB4Mj0iNTM4IiB5Mj0iMjA1IiBzdHJva2U9IiM5NGEzYjgiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNkbzMpIi8+Cjx0ZXh0IHg9IjUxMiIgeT0iMTk2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogIzY0NzQ4YjsgZm9udC1zaXplOjhweCI+ZW5kcG9pbnQgKyBpZDwvdGV4dD4KPHJlY3QgeD0iNTQyIiB5PSIxNzYiIHdpZHRoPSIyNzgiIGhlaWdodD0iNTgiIHJ4PSIxMSIgZmlsbD0iI2ZmZiIgc3Ryb2tlPSIjZTJlOGYwIiBzdHJva2Utd2lkdGg9IjEuNSIvPgo8dGV4dCB4PSI2ODEiIHk9IjIwMiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICMwZjE3MmE7IGZvbnQtc2l6ZToxMnB4Ij5Zb3VyIGNvbnN1bWVyczwvdGV4dD4KPHRleHQgeD0iNjgxIiB5PSIyMTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5yZWFkIHRoZSBDRE4gZW5kcG9pbnQgKyBpZCwgcGFzc2VkIHRocm91Z2g8L3RleHQ+Cjwvc3ZnPg==" alt="Traffic path: your customers reach DigitalOcean's CDN edge, which serves from your first origin. Identity: a Route 53 alias that pointed at the distribution retargets to the digitalocean_cdn endpoint, and the endpoint plus its id are passed through to your consumers." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMjUwIiB2aWV3Qm94PSIwIDAgODM2IDI1MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJUcmFmZmljIHBhdGg6IHlvdXIgY3VzdG9tZXJzIHJlYWNoIERpZ2l0YWxPY2VhbidzIENETiBlZGdlLCB3aGljaCBzZXJ2ZXMgZnJvbSB5b3VyIGZpcnN0IG9yaWdpbi4gSWRlbnRpdHk6IGEgUm91dGUgNTMgYWxpYXMgdGhhdCBwb2ludGVkIGF0IHRoZSBkaXN0cmlidXRpb24gcmV0YXJnZXRzIHRvIHRoZSBkaWdpdGFsb2NlYW5fY2RuIGVuZHBvaW50LCBhbmQgdGhlIGVuZHBvaW50IHBsdXMgaXRzIGlkIGFyZSBwYXNzZWQgdGhyb3VnaCB0byB5b3VyIGNvbnN1bWVycy4iPjxzdHlsZT50ZXh0e2ZvbnQtZmFtaWx5OkludGVyLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LCdTZWdvZSBVSScsUm9ib3RvLCdIZWx2ZXRpY2EgTmV1ZScsQXJpYWwsc2Fucy1zZXJpZjtmaWxsOiNjYmQ1ZTF9PC9zdHlsZT4KPGRlZnM+PG1hcmtlciBpZD0iZG8zIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiM5NGEzYjgiLz48L21hcmtlcj48bWFya2VyIGlkPSJkbzNiIiB2aWV3Qm94PSIwIDAgMTAgMTAiIHJlZlg9IjgiIHJlZlk9IjUiIG1hcmtlcldpZHRoPSI3IiBtYXJrZXJIZWlnaHQ9IjciIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIj48cGF0aCBkPSJNMCwwIEwxMCw1IEwwLDEwIHoiIGZpbGw9IiMwMDgwRkYiLz48L21hcmtlcj48L2RlZnM+Cjx0ZXh0IHg9IjI2IiB5PSIzNCIgc3R5bGU9ImZvbnQ6IDcwMCAxMHB4IEludGVyLCBzYW5zLXNlcmlmOyBsZXR0ZXItc3BhY2luZzogMS4zcHg7IGZpbGw6ICM5NGEzYjg7IGZpbGw6ICNjOWNmZDgiPlRIRSBTRVJWSU5HIFBBVEg8L3RleHQ+CjxyZWN0IHg9IjI2IiB5PSI0NiIgd2lkdGg9IjEyMCIgaGVpZ2h0PSI3MCIgcng9IjExIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRlNjYiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9Ijg2IiB5PSI3OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDY1MCAxMy41cHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNlZDg7IGZvbnQtc2l6ZToxMnB4Ij5Zb3VyIGN1c3RvbWVyczwvdGV4dD4KPHRleHQgeD0iODYiIHk9Ijk0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+dmlld2VyczwvdGV4dD4KPGxpbmUgeDE9IjE0NiIgeTE9IjgxIiB4Mj0iMjAwIiB5Mj0iODEiIHN0cm9rZT0iIzQxNGU2MiIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI2RvMykiLz4KPHRleHQgeD0iMTczIiB5PSI3MiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZvbnQtc2l6ZTo4LjVweCI+cmVxdWVzdHM8L3RleHQ+CjxyZWN0IHg9IjIwNCIgeT0iNDAiIHdpZHRoPSIyMDYiIGhlaWdodD0iODIiIHJ4PSIxMSIgZmlsbD0iIzI2MjYyNiIgc3Ryb2tlPSIjMDA4MEZGIiBzdHJva2Utd2lkdGg9IjEuNyIvPgo8c3ZnIHg9IjIxOCIgeT0iNTYiIHdpZHRoPSIyMCIgaGVpZ2h0PSIyMCIgdmlld0JveD0iMCAwIDI0IDI0Ij48ZyB0cmFuc2Zvcm09InNjYWxlKDAuMTg3NSkiIGZpbGw9IiMwMDgwRkYiPjxwYXRoIGQ9Ik02My43MjQgMTEwLjcyNVY5Mi41NDNjMTkuMzUyIDAgMzQuMjgyLTE5LjAwOCAyNi44MTctMzkuMTE4LTIuNzY1LTcuNDM4LTguNTctMTMuNDk5LTE2LjMxMi0xNi4yNTQtMTkuOTA1LTcuMTYyLTM4Ljk4MiA3LjcxNC0zOC45ODIgMjYuNzIySDE3YzAtMzAuMzAzIDI5LjU4Mi01NC4yNyA2MS45My00NC4zNTIgMTQuMSA0LjQwNyAyNS4xNTggMTUuNDI3IDI5LjU4MiAyOS40NzYgOS45NTMgMzIuMjMxLTE0LjEgNjEuNzA4LTQ0Ljc4OCA2MS43MDh6Ii8+PHBhdGggZD0iTTY0IDkyLjU0M0g0NS43NTNWNzQuNjM3SDY0djE3LjkwNnptLTE4LjI0NyAxNC4wNUgzMS45Mjl2LTE0LjA1aDEzLjgyNHYxNC4wNXptLTEzLjgyNC0xNC4wNUgyMC4zMTh2LTExLjU3aDExLjYxMXYxMS41N3oiLz48L2c+PC9zdmc+Cjx0ZXh0IHg9IjMwNyIgeT0iNzAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4OyBmb250LXNpemU6MTIuNXB4Ij5EaWdpdGFsT2NlYW4gQ0ROPC90ZXh0Pgo8dGV4dCB4PSIzMDciIHk9Ijg2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+ZWRnZSBzZXJ2ZXMgdGhlIHRyYWZmaWM8L3RleHQ+Cjx0ZXh0IHg9IjMwNyIgeT0iMTAyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjAwIDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM5MGRlYzY7IGZpbGw6ICM5MGIwZGUiPmZyb20geW91ciBmaXJzdCBvcmlnaW48L3RleHQ+CjxsaW5lIHgxPSI0MTAiIHkxPSI4MSIgeDI9IjQ2NCIgeTI9IjgxIiBzdHJva2U9IiM0MTRlNjIiIHN0cm9rZS13aWR0aD0iMiIgbWFya2VyLWVuZD0idXJsKCNkbzMpIi8+Cjx0ZXh0IHg9IjQzNyIgeT0iNzIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMHB4ICdTRiBNb25vJywgdWktbW9ub3NwYWNlLCAnSmV0QnJhaW5zIE1vbm8nLCBNZW5sbywgbW9ub3NwYWNlOyBmaWxsOiAjYzljZmQ4OyBmb250LXNpemU6OC41cHgiPm9yaWdpbiBmZXRjaDwvdGV4dD4KPHJlY3QgeD0iNDY4IiB5PSI0NiIgd2lkdGg9IjE1MCIgaGVpZ2h0PSI3MCIgcng9IjExIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRlNjYiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjU0MyIgeT0iNzgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4OyBmb250LXNpemU6MTJweCI+WW91ciBmaXJzdCBvcmlnaW48L3RleHQ+Cjx0ZXh0IHg9IjU0MyIgeT0iOTQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5idWNrZXQgb3IgYXBwPC90ZXh0Pgo8bGluZSB4MT0iMTYiIHkxPSIxNDAiIHgyPSI4MjAiIHkyPSIxNDAiIHN0cm9rZT0iIzNkNGU2NiIgc3Ryb2tlLXdpZHRoPSIxLjIiIHN0cm9rZS1kYXNoYXJyYXk9IjQgNCIvPgo8dGV4dCB4PSIyNiIgeT0iMTY0IiBzdHlsZT0iZm9udDogNzAwIDEwcHggSW50ZXIsIHNhbnMtc2VyaWY7IGxldHRlci1zcGFjaW5nOiAxLjNweDsgZmlsbDogIzk0YTNiODsgZmlsbDogIzkwYjBkZSI+VEhFIEVORFBPSU5UIElERU5USVRZIFRIQVQgQ0FSUklFUzwvdGV4dD4KPHJlY3QgeD0iMjYiIHk9IjE3NiIgd2lkdGg9IjE2OCIgaGVpZ2h0PSI1OCIgcng9IjExIiBmaWxsPSIjMjYyNjI2IiBzdHJva2U9IiMzZDRlNjYiIHN0cm9rZS13aWR0aD0iMS41Ii8+Cjx0ZXh0IHg9IjExMCIgeT0iMjAwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkODsgZm9udC1zaXplOjExLjVweCI+Um91dGUgNTMgYWxpYXM8L3RleHQ+Cjx0ZXh0IHg9IjExMCIgeT0iMjE4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZm9udC1zaXplOjEwcHgiPmFwcC5leGFtcGxlLmNvbSDCtyB1bmNoYW5nZWQ8L3RleHQ+CjxsaW5lIHgxPSIxOTQiIHkxPSIyMDUiIHgyPSIyNDYiIHkyPSIyMDUiIHN0cm9rZT0iIzAwODBGRiIgc3Ryb2tlLXdpZHRoPSIyIiBtYXJrZXItZW5kPSJ1cmwoI2RvM2IpIi8+Cjx0ZXh0IHg9IjIyMCIgeT0iMTk2IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTBweCAnU0YgTW9ubycsIHVpLW1vbm9zcGFjZSwgJ0pldEJyYWlucyBNb25vJywgTWVubG8sIG1vbm9zcGFjZTsgZmlsbDogI2M5Y2ZkODsgZm9udC1zaXplOjhweDtmaWxsOiAjOTBiMGRlIj5yZXRhcmdldHMgdG88L3RleHQ+CjxyZWN0IHg9IjI1MCIgeT0iMTc2IiB3aWR0aD0iMjM2IiBoZWlnaHQ9IjU4IiByeD0iMTEiIGZpbGw9IiMxYTI1MzEiIHN0cm9rZT0iIzAwODBGRiIgc3Ryb2tlLXdpZHRoPSIxLjciLz4KPHN2ZyB4PSIyNjQiIHk9IjE4OCIgd2lkdGg9IjE4IiBoZWlnaHQ9IjE4IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxnIHRyYW5zZm9ybT0ic2NhbGUoMC4xODc1KSIgZmlsbD0iIzAwODBGRiI+PHBhdGggZD0iTTYzLjcyNCAxMTAuNzI1VjkyLjU0M2MxOS4zNTIgMCAzNC4yODItMTkuMDA4IDI2LjgxNy0zOS4xMTgtMi43NjUtNy40MzgtOC41Ny0xMy40OTktMTYuMzEyLTE2LjI1NC0xOS45MDUtNy4xNjItMzguOTgyIDcuNzE0LTM4Ljk4MiAyNi43MjJIMTdjMC0zMC4zMDMgMjkuNTgyLTU0LjI3IDYxLjkzLTQ0LjM1MiAxNC4xIDQuNDA3IDI1LjE1OCAxNS40MjcgMjkuNTgyIDI5LjQ3NiA5Ljk1MyAzMi4yMzEtMTQuMSA2MS43MDgtNDQuNzg4IDYxLjcwOHoiLz48cGF0aCBkPSJNNjQgOTIuNTQzSDQ1Ljc1M1Y3NC42MzdINjR2MTcuOTA2em0tMTguMjQ3IDE0LjA1SDMxLjkyOXYtMTQuMDVoMTMuODI0djE0LjA1em0tMTMuODI0LTE0LjA1SDIwLjMxOHYtMTEuNTdoMTEuNjExdjExLjU3eiIvPjwvZz48L3N2Zz4KPHRleHQgeD0iMzc2IiB5PSIyMDAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4OyBmb250LXNpemU6MTEuNXB4Ij5kaWdpdGFsb2NlYW5fY2RuIGVuZHBvaW50PC90ZXh0Pgo8dGV4dCB4PSIzNzYiIHk9IjIxOCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPkRpZ2l0YWxPY2VhbidzIGVkZ2UgYW5zd2VyczwvdGV4dD4KPGxpbmUgeDE9IjQ4NiIgeTE9IjIwNSIgeDI9IjUzOCIgeTI9IjIwNSIgc3Ryb2tlPSIjNDE0ZTYyIiBzdHJva2Utd2lkdGg9IjIiIG1hcmtlci1lbmQ9InVybCgjZG8zKSIvPgo8dGV4dCB4PSI1MTIiIHk9IjE5NiIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDEwcHggJ1NGIE1vbm8nLCB1aS1tb25vc3BhY2UsICdKZXRCcmFpbnMgTW9ubycsIE1lbmxvLCBtb25vc3BhY2U7IGZpbGw6ICNjOWNmZDg7IGZvbnQtc2l6ZTo4cHgiPmVuZHBvaW50ICsgaWQ8L3RleHQ+CjxyZWN0IHg9IjU0MiIgeT0iMTc2IiB3aWR0aD0iMjc4IiBoZWlnaHQ9IjU4IiByeD0iMTEiIGZpbGw9IiMyNjI2MjYiIHN0cm9rZT0iIzNkNGU2NiIgc3Ryb2tlLXdpZHRoPSIxLjUiLz4KPHRleHQgeD0iNjgxIiB5PSIyMDIiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4OyBmb250LXNpemU6MTJweCI+WW91ciBjb25zdW1lcnM8L3RleHQ+Cjx0ZXh0IHg9IjY4MSIgeT0iMjE4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+cmVhZCB0aGUgQ0ROIGVuZHBvaW50ICsgaWQsIHBhc3NlZCB0aHJvdWdoPC90ZXh0Pgo8L3N2Zz4=" alt="Traffic path: your customers reach DigitalOcean's CDN edge, which serves from your first origin. Identity: a Route 53 alias that pointed at the distribution retargets to the digitalocean_cdn endpoint, and the endpoint plus its id are passed through to your consumers." />
</div>

<p className="t9-caption">Requests reach DigitalOcean's CDN edge, which serves from your first origin. A Route 53 alias that pointed at the distribution retargets to the digitalocean\_cdn endpoint, and the endpoint and its id are passed through to your consumers.</p>

#### Limitations

△ Where CloudFront and DigitalOcean CDN diverge, limitations

* **Additional origins & origin groups.** Only your first origin's domain becomes the CDN origin; additional origins and origin-group failover drop and are flagged during the build.
* **Path patterns & ordered behaviors.** A distribution routes by path pattern across ordered behaviors; the CDN endpoint has one behavior, so the patterns and their ordering drop and are flagged during the build.
* **Per-behavior and min/max TTLs.** Only the default behavior's default TTL becomes the endpoint's `ttl`; per-behavior TTLs and the separate minimum and maximum TTLs drop and are flagged during the build.
* **Allowed & cached methods.** The allowed- and cached-method lists have no knob on the CDN endpoint; they drop and are flagged during the build.
* **The redirect-to-HTTPS viewer policy.** The DigitalOcean CDN endpoint serves over HTTPS by default; CloudFront's configurable viewer-protocol-policy knob (redirect-to-HTTPS / HTTPS-only) is not an endpoint setting here, so the knob drops and is flagged during the build.
* **WAF & geo restrictions.** An attached AWS WAF web ACL and geo restrictions have no attach point on the CDN endpoint; they drop and are flagged during the build.
* **Origin access & signed URLs.** Origin access (OAI / OAC) and trusted-signer signed URLs drop; the origin-access companion is removed with a flagged issue, and a standalone origin access identity causes a build error.
* **Edge functions.** Lambda\@Edge and CloudFront Functions associations have no edge-compute analog on DigitalOcean's CDN; they drop, and a standalone function causes a build error.
* **Price class, logging, HTTP version, root object.** DigitalOcean serves from its own edge footprint, so there is no price-class tier selector; the logging config, HTTP-version toggle, and default-root-object rewrite drop and are flagged during the build.
* **The viewer certificate has no equivalent.** The ACM viewer certificate has no equivalent; the endpoint takes a DigitalOcean-managed certificate for its custom domain instead.

#### Other considerations

* **DNS cutover.** A Route 53 alias that pointed at the distribution retargets to the digitalocean\_cdn endpoint; the name your customers resolve is unchanged, only its target moves. Cutting that record over is a step you own, and the CDN's endpoint and its id are passed through to any consumer that read them.
* **Attach the managed certificate.** The endpoint takes a DigitalOcean-managed certificate for its custom domain, and the build flags an operator step to attach it, a one-time action you complete after the CDN is provisioned.
* **One distribution maps to one endpoint.** The CDN endpoint stands in for a single distribution. Where a distribution cannot collapse cleanly (a standalone edge function or origin access identity with no distribution to attach to, or several distributions spread across modules), the build stops rather than guessing, and asks you to restructure so one distribution maps to one endpoint.

## On Google Cloud

### Cloud CDN

| Operation                                                                                                | Area             | Support      | Depth        | Notes                                                                                                                                                                                                                                     |
| -------------------------------------------------------------------------------------------------------- | ---------------- | ------------ | ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Origin access (OAI / OAC)                                                                                | Access control   | Partial      | Most usage   | configure private bucket IAM or the HTTP origin's access controls separately. Attaching a backend to the load balancer does not prevent direct access. An origin access identity without a supported translation causes a build error     |
| Signed URLs                                                                                              | Access control   | Partial      | Most usage   | Cloud CDN uses HMAC signed URLs and cookies. Replace the CloudFront RSA/ECDSA signer and issue new URLs; configure origin access separately.                                                                                              |
| WAF & geo restrictions                                                                                   | Access control   | Out of scope | Most usage   | Automatic WAF/geo translation is outside this mapping. Configure Cloud Armor separately; backend buckets support a narrower edge security policy than backend services.                                                                   |
| Cache behaviors                                                                                          | Cache            | Partial      | Most usage   | Backend cdn\_policy retains cache mode, default/max/client TTLs, negative caching and cache-key settings. URL-map matches select paths; per-behavior header forwarding and method differences are reported.                               |
| Content delivery                                                                                         | Content delivery | Supported    | Common       | served on Google Cloud CDN: enable\_cdn = true plus a cdn\_policy on the external load balancer's backend inside your Google Cloud project; the load balancer fronts it with a URL map, HTTPS proxy, and forwarding rule                  |
| DNS cutover                                                                                              | Content delivery | Supported    | Common       | Supported Route 53 aliases point to the target frontend. CloudFront domain\_name, arn and hosted\_zone\_id are not target identifiers; unsupported output references are removed and active configuration references cause a build error. |
| Custom domains + TLS                                                                                     | Domains & TLS    | Partial      | Most usage   | Custom domains use target-managed certificates. Complete domain validation before cutover; an ACM ARN supplies no certificate material. Minimum TLS-version and SSL support-method differences are reported.                              |
| Edge logic (Lambda\@Edge / CloudFront Functions)                                                         | Edge logic       | Out of scope | Most usage   | Cloud CDN does not run Lambda\@Edge or CloudFront Functions code. Unsupported associations are omitted and reported; standalone functions cause a build error.                                                                            |
| Policy & monitoring facets (cache / origin-request / response-headers policies, monitoring subscription) | Facets           | Out of scope | Full surface | these resources are not supported by this mapping; the build reports an error                                                                                                                                                             |
| Origins                                                                                                  | Origins          | Partial      | Common       | The first HTTP origin becomes a backend service; a bucket origin becomes a backend bucket. Confirm unresolved origin addresses. Additional origins and origin groups are omitted and reported.                                            |

#### How it works

Tensor9 translates the CloudFront distribution into a Google external Application Load Balancer with Cloud CDN enabled on its backend. A forwarding rule supplies the public address, an HTTPS proxy terminates TLS, and a URL map selects the backend. Google operates the cache and serves requests; Tensor9 provisions the resources in the customer's project.

A custom DNS name can remain in use after its record points to the new frontend and its certificate is ready. The CloudFront-generated hostname and existing cached objects do not move to Google. Plan for cache misses during cutover.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTUwIiB2aWV3Qm94PSIwIDAgODM2IDE1MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJSZXF1ZXN0cyBwYXNzIHRocm91Z2ggdGhlIEdvb2dsZSBsb2FkIGJhbGFuY2VyIGFuZCBjYWNoZSB0byB0aGUgc2VsZWN0ZWQgb3JpZ2luLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6IzMzNDE1NX08L3N0eWxlPjxyZWN0IHg9IjI0IiB5PSI0MCIgd2lkdGg9IjI0MCIgaGVpZ2h0PSI4MCIgcng9IjEwIiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiM2NDc0OGIiLz48dGV4dCB4PSIxNDQiIHk9IjcwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYSI+Q3VzdG9tZXIgcmVxdWVzdDwvdGV4dD48dGV4dCB4PSIxNDQiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+Y3VzdG9tIGRvbWFpbjwvdGV4dD48cGF0aCBkPSJNMjY2LDgwIGgyMiBsLTYsLTUgbTYsNSBsLTYsNSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjNjQ3NDhiIiBzdHJva2Utd2lkdGg9IjIiLz48cmVjdCB4PSIyOTQiIHk9IjQwIiB3aWR0aD0iMjQwIiBoZWlnaHQ9IjgwIiByeD0iMTAiIGZpbGw9IiNmOGZhZmMiIHN0cm9rZT0iIzY0NzQ4YiIvPjx0ZXh0IHg9IjQxNCIgeT0iNzAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMGYxNzJhIj5Hb29nbGUgbG9hZCBiYWxhbmNlcjwvdGV4dD48dGV4dCB4PSI0MTQiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+VVJMIG1hcCArIENsb3VkIENETjwvdGV4dD48cGF0aCBkPSJNNTM2LDgwIGgyMiBsLTYsLTUgbTYsNSBsLTYsNSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjNjQ3NDhiIiBzdHJva2Utd2lkdGg9IjIiLz48cmVjdCB4PSI1NjQiIHk9IjQwIiB3aWR0aD0iMjQwIiBoZWlnaHQ9IjgwIiByeD0iMTAiIGZpbGw9IiNmOGZhZmMiIHN0cm9rZT0iIzY0NzQ4YiIvPjx0ZXh0IHg9IjY4NCIgeT0iNzAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjMGYxNzJhIj5PcmlnaW48L3RleHQ+PHRleHQgeD0iNjg0IiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICM2NDc0OGIiPmJ1Y2tldCBvciBIVFRQIGJhY2tlbmQ8L3RleHQ+PC9zdmc+" alt="Requests pass through the Google load balancer and cache to the selected origin." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTUwIiB2aWV3Qm94PSIwIDAgODM2IDE1MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJSZXF1ZXN0cyBwYXNzIHRocm91Z2ggdGhlIEdvb2dsZSBsb2FkIGJhbGFuY2VyIGFuZCBjYWNoZSB0byB0aGUgc2VsZWN0ZWQgb3JpZ2luLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6I2NiZDVlMX08L3N0eWxlPjxyZWN0IHg9IjI0IiB5PSI0MCIgd2lkdGg9IjI0MCIgaGVpZ2h0PSI4MCIgcng9IjEwIiBmaWxsPSIjMWEyNjMxIiBzdHJva2U9IiM2NDc0OGIiLz48dGV4dCB4PSIxNDQiIHk9IjcwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkOCI+Q3VzdG9tZXIgcmVxdWVzdDwvdGV4dD48dGV4dCB4PSIxNDQiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+Y3VzdG9tIGRvbWFpbjwvdGV4dD48cGF0aCBkPSJNMjY2LDgwIGgyMiBsLTYsLTUgbTYsNSBsLTYsNSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjNjQ3NDhiIiBzdHJva2Utd2lkdGg9IjIiLz48cmVjdCB4PSIyOTQiIHk9IjQwIiB3aWR0aD0iMjQwIiBoZWlnaHQ9IjgwIiByeD0iMTAiIGZpbGw9IiMxYTI2MzEiIHN0cm9rZT0iIzY0NzQ4YiIvPjx0ZXh0IHg9IjQxNCIgeT0iNzAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4Ij5Hb29nbGUgbG9hZCBiYWxhbmNlcjwvdGV4dD48dGV4dCB4PSI0MTQiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+VVJMIG1hcCArIENsb3VkIENETjwvdGV4dD48cGF0aCBkPSJNNTM2LDgwIGgyMiBsLTYsLTUgbTYsNSBsLTYsNSIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjNjQ3NDhiIiBzdHJva2Utd2lkdGg9IjIiLz48cmVjdCB4PSI1NjQiIHk9IjQwIiB3aWR0aD0iMjQwIiBoZWlnaHQ9IjgwIiByeD0iMTAiIGZpbGw9IiMxYTI2MzEiIHN0cm9rZT0iIzY0NzQ4YiIvPjx0ZXh0IHg9IjY4NCIgeT0iNzAiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiA2NTAgMTMuNXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZWQ4Ij5PcmlnaW48L3RleHQ+PHRleHQgeD0iNjg0IiB5PSI5OCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgc3R5bGU9ImZvbnQ6IDExcHggSW50ZXIsIHNhbnMtc2VyaWY7IGZpbGw6ICNjOWNmZDgiPmJ1Y2tldCBvciBIVFRQIGJhY2tlbmQ8L3RleHQ+PC9zdmc+" alt="Requests pass through the Google load balancer and cache to the selected origin." />
</div>

#### Origins and cache configuration

A bucket origin uses a CDN-enabled backend bucket; a custom HTTP origin uses a backend service. Confirm any origin address that compilation cannot resolve. This mapping selects the first origin; additional origins and CloudFront origin-group failover require separate configuration and are reported during compilation.

Supported path behaviors become URL-map matchers. Each backend has a `cdn_policy` for cache mode, default, maximum and client TTLs, negative caching, and the cache key's host, path and query settings. Behaviors sharing a backend also share its cache policy. Check whether the source needs different policies for those paths.

The origin-headers cache mode respects the origin's `Cache-Control` instructions. For example, a policy might set default and client TTLs to 3600 seconds, a maximum of 86400 seconds, and cache a 404 response for 120 seconds; these are illustrative settings, not promised deployment defaults. Per-behavior forwarded-header lists and allowed-method lists are not fully preserved. Review the reported differences before caching authenticated or user-specific responses.

#### Origin connectivity and access

The load balancer's backend configuration identifies where requests go; being in the same project does not make an origin reachable or private. Configure the network path, firewall rules, DNS, and backend access for the selected origin type. A custom origin can be outside the project and may need additional connectivity.

CloudFront origin access control authenticates requests to supported origins; it is distinct from a private network connection. On Google, private bucket access uses the appropriate bucket IAM grant. An HTTP origin needs its own controls to reject direct or unauthorized requests. Attaching a backend to a load balancer does not, by itself, make that load balancer the only way to reach it.

Provisioning uses the deployment's Google identity. Limit that identity's resource permissions separately from the access rules governing viewer and origin requests.

#### Signed URLs and cookies

CloudFront signed URLs and cookies use a public/private key pair: RSA or ECDSA. Cloud CDN uses a shared HMAC signing key. Update the application that issues signed URLs to use the Cloud CDN format and key; previously issued CloudFront signatures will not validate there.

Viewer authorization and origin protection are separate. Configure private bucket access where applicable. For an HTTP origin, follow Google's requirements to validate signed requests and decide whether to reject unsigned requests. Adding a signing key alone does not make every path private.

<div className="t9-diagram-scroll" role="region" aria-label="Scrollable diagram" tabIndex={0}>
  <img className="t9-diagram-light" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTUwIiB2aWV3Qm94PSIwIDAgODM2IDE1MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJUaGUgYXBwbGljYXRpb24gc2lnbnMgYSBDbG91ZCBDRE4gcmVxdWVzdDsgdGhlIGVkZ2UgdmFsaWRhdGVzIGl0LCB3aGlsZSBvcmlnaW4gYWNjZXNzIHJlcXVpcmVzIHNlcGFyYXRlIGNvbnRyb2xzLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6IzMzNDE1NX08L3N0eWxlPjxyZWN0IHg9IjI0IiB5PSI0MCIgd2lkdGg9IjI0MCIgaGVpZ2h0PSI4MCIgcng9IjEwIiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiM2NDc0OGIiLz48dGV4dCB4PSIxNDQiIHk9IjcwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYSI+QXBwbGljYXRpb24gc2lnbmVyPC90ZXh0Pjx0ZXh0IHg9IjE0NCIgeT0iOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj5DbG91ZCBDRE4gSE1BQyBrZXk8L3RleHQ+PHBhdGggZD0iTTI2Niw4MCBoMjIgbC02LC01IG02LDUgbC02LDUiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzY0NzQ4YiIgc3Ryb2tlLXdpZHRoPSIyIi8+PHJlY3QgeD0iMjk0IiB5PSI0MCIgd2lkdGg9IjI0MCIgaGVpZ2h0PSI4MCIgcng9IjEwIiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiM2NDc0OGIiLz48dGV4dCB4PSI0MTQiIHk9IjcwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYSI+Q2xvdWQgQ0ROPC90ZXh0Pjx0ZXh0IHg9IjQxNCIgeT0iOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjNjQ3NDhiIj52YWxpZGF0ZXMgc2lnbmVkIHJlcXVlc3Q8L3RleHQ+PHBhdGggZD0iTTUzNiw4MCBoMjIgbC02LC01IG02LDUgbC02LDUiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzY0NzQ4YiIgc3Ryb2tlLXdpZHRoPSIyIi8+PHJlY3QgeD0iNTY0IiB5PSI0MCIgd2lkdGg9IjI0MCIgaGVpZ2h0PSI4MCIgcng9IjEwIiBmaWxsPSIjZjhmYWZjIiBzdHJva2U9IiM2NDc0OGIiLz48dGV4dCB4PSI2ODQiIHk9IjcwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzBmMTcyYSI+UHJvdGVjdGVkIG9yaWdpbjwvdGV4dD48dGV4dCB4PSI2ODQiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogIzY0NzQ4YiI+c2VwYXJhdGUgYWNjZXNzIGNvbnRyb2xzPC90ZXh0Pjwvc3ZnPg==" alt="The application signs a Cloud CDN request; the edge validates it, while origin access requires separate controls." />

  <img className="t9-diagram-dark" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4MzYiIGhlaWdodD0iMTUwIiB2aWV3Qm94PSIwIDAgODM2IDE1MCIgcm9sZT0iaW1nIiBhcmlhLWxhYmVsPSJUaGUgYXBwbGljYXRpb24gc2lnbnMgYSBDbG91ZCBDRE4gcmVxdWVzdDsgdGhlIGVkZ2UgdmFsaWRhdGVzIGl0LCB3aGlsZSBvcmlnaW4gYWNjZXNzIHJlcXVpcmVzIHNlcGFyYXRlIGNvbnRyb2xzLiI+PHN0eWxlPnRleHR7Zm9udC1mYW1pbHk6SW50ZXIsLWFwcGxlLXN5c3RlbSxCbGlua01hY1N5c3RlbUZvbnQsJ1NlZ29lIFVJJyxSb2JvdG8sJ0hlbHZldGljYSBOZXVlJyxBcmlhbCxzYW5zLXNlcmlmO2ZpbGw6I2NiZDVlMX08L3N0eWxlPjxyZWN0IHg9IjI0IiB5PSI0MCIgd2lkdGg9IjI0MCIgaGVpZ2h0PSI4MCIgcng9IjEwIiBmaWxsPSIjMWEyNjMxIiBzdHJva2U9IiM2NDc0OGIiLz48dGV4dCB4PSIxNDQiIHk9IjcwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkOCI+QXBwbGljYXRpb24gc2lnbmVyPC90ZXh0Pjx0ZXh0IHg9IjE0NCIgeT0iOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij5DbG91ZCBDRE4gSE1BQyBrZXk8L3RleHQ+PHBhdGggZD0iTTI2Niw4MCBoMjIgbC02LC01IG02LDUgbC02LDUiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzY0NzQ4YiIgc3Ryb2tlLXdpZHRoPSIyIi8+PHJlY3QgeD0iMjk0IiB5PSI0MCIgd2lkdGg9IjI0MCIgaGVpZ2h0PSI4MCIgcng9IjEwIiBmaWxsPSIjMWEyNjMxIiBzdHJva2U9IiM2NDc0OGIiLz48dGV4dCB4PSI0MTQiIHk9IjcwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkOCI+Q2xvdWQgQ0ROPC90ZXh0Pjx0ZXh0IHg9IjQxNCIgeT0iOTgiIHRleHQtYW5jaG9yPSJtaWRkbGUiIHN0eWxlPSJmb250OiAxMXB4IEludGVyLCBzYW5zLXNlcmlmOyBmaWxsOiAjYzljZmQ4Ij52YWxpZGF0ZXMgc2lnbmVkIHJlcXVlc3Q8L3RleHQ+PHBhdGggZD0iTTUzNiw4MCBoMjIgbC02LC01IG02LDUgbC02LDUiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzY0NzQ4YiIgc3Ryb2tlLXdpZHRoPSIyIi8+PHJlY3QgeD0iNTY0IiB5PSI0MCIgd2lkdGg9IjI0MCIgaGVpZ2h0PSI4MCIgcng9IjEwIiBmaWxsPSIjMWEyNjMxIiBzdHJva2U9IiM2NDc0OGIiLz48dGV4dCB4PSI2ODQiIHk9IjcwIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogNjUwIDEzLjVweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2VkOCI+UHJvdGVjdGVkIG9yaWdpbjwvdGV4dD48dGV4dCB4PSI2ODQiIHk9Ijk4IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBzdHlsZT0iZm9udDogMTFweCBJbnRlciwgc2Fucy1zZXJpZjsgZmlsbDogI2M5Y2ZkOCI+c2VwYXJhdGUgYWNjZXNzIGNvbnRyb2xzPC90ZXh0Pjwvc3ZnPg==" alt="The application signs a Cloud CDN request; the edge validates it, while origin access requires separate controls." />
</div>

#### Web application firewall

This distribution mapping does not automatically translate the AWS web ACL or geographic restrictions. Configure Google Cloud Armor separately if those controls are required.

A backend security policy supports managed WAF rules, custom rules and rate controls on a backend service. A backend bucket supports the narrower edge security policy, which does not provide the same managed-rule and rate-limiting features. Choose the policy type for the selected backend and test both allowed and blocked requests.

#### Edge functions and encryption

Cloud CDN does not execute Lambda\@Edge or CloudFront Functions code. Move application code to a suitable runtime and reconnect the request flow when that behavior is required. The translation reports omitted function associations; a standalone CloudFront function without a supported translation causes a build error.

CloudFront field-level encryption encrypts selected request fields at the edge. It is a separate feature, not a customer function runtime, and this mapping does not reproduce it.

#### Custom domains, TLS and cutover

Each supported alias receives a Google-managed certificate on the HTTPS proxy. Validate domain ownership and wait for certificate readiness before changing DNS. An ACM reference does not supply certificate material; the source minimum TLS version and SSL support method are not copied field for field. Verify the target TLS policy.

Supported Route 53 aliases are updated to the Google frontend address. CloudFront `domain_name`, `arn`, and `hosted_zone_id` are not native Google identifiers. References without a target equivalent are removed from outputs or rejected in active configuration; review consumers outside the translated stack.

#### Operations and remaining limits

Google's edge locations replace CloudFront's price-class selection. Configure Cloud Logging and Cloud Monitoring for the target; AWS access-log and additional-metrics settings are not copied as distribution attributes. Monitor cache hits, origin requests and errors after cutover.

Standalone cache, origin-request, response-headers policy, monitoring-subscription, or origin-access-identity resources that have no supported attachment cannot be translated. Review those resources and the per-behavior differences with the distribution before deployment.

Provider references: [content access control](https://docs.cloud.google.com/cdn/docs/authenticate-content) and [signed URLs](https://docs.cloud.google.com/cdn/docs/using-signed-urls).

## On Scaleway

### Scaleway Edge Services

| Operation                                        | Area           | Support      | Depth        | Notes                                                                                                                                                                                                                                          |
| ------------------------------------------------ | -------------- | ------------ | ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Origin access (OAI / OAC)                        | Access control | Out of scope | Most usage   | origin access controls are not projected                                                                                                                                                                                                       |
| WAF / geo restrictions / signed URLs             | Access control | Out of scope | Most usage   | Edge Services HAS a waf stage, but the build does not emit one from a CloudFront WAF association; geo restrictions and signed-URL key groups have no mapping                                                                                   |
| Cache behaviors                                  | Caching        | Partial      | Common       | the default behavior's default TTL becomes the cache stage's TTL; per-path ordered cache behaviors are NOT mapped, so the default behavior applies to every path                                                                               |
| Price class / HTTP version / default root object | Configuration  | Out of scope | Full surface | not projected                                                                                                                                                                                                                                  |
| Content delivery                                 | Data plane     | Supported    | Common       | Scaleway's edge serves the traffic through an Edge Services PIPELINE rather than a single endpoint resource: a pipeline plus a backend stage, a cache stage and a DNS stage, each its own resource                                             |
| Custom domains + TLS                             | Domains & TLS  | Partial      | Most usage   | the first alias becomes the DNS stage's domain; the viewer certificate's ACM ARN, minimum protocol version and SNI mode do not project field-for-field                                                                                         |
| Edge logic (Lambda\@Edge / CloudFront Functions) | Edge logic     | Out of scope | Most usage   | edge function associations are not translated                                                                                                                                                                                                  |
| Access logging                                   | Observability  | Out of scope | Full surface | CloudFront's S3 access logging has no Edge Services stage analog - Scaleway surfaces edge logs through Cockpit instead, and the build does not wire that                                                                                       |
| Origins                                          | Origins        | Partial      | Common       | the first origin's domain becomes the backend stage's origin; an expression-based origin is threaded as a build variable you set. See the backend-stage note below - which KIND of backend the stage points at is not inferred from a hostname |

## Existing data and credentials

Selecting a backend does not copy existing data, credentials or access policies. Plan and verify migration separately before changing an application's endpoint. Do not assume an identifier, credential or encrypted value from the origin service works unchanged on the target.

## Configure, tune and debug

Start with [setup](/cloud-adapter/getting-started/overview) and [configuration](/cloud-adapter/configuration/overview). Use [tuning](/cloud-adapter/tuning/overview) to understand supported request tags, [debugging](/cloud-adapter/debugging/overview) to investigate a request, and [High Fidelity Cloud Emulators](/cloud-adapter/local-testing/overview) to validate a bounded reproduction.
