With the Fastly resources for CloudFormation, you can kick a CDN with health-checks for new projects simply, efficiently, and consistently.
Project build pipelines and other project-bootstrap infrastructure can also be included as part of the CloudFormation, so organizations can have a quick and common way to bootstrap a new project.
This demo will use the following types:
Fastly::Services::Service
- to create a new Fastly delivery service.Fastly::Services::Domain
- to attach a domain to a Fastly delivery service.Fastly::Services::Backend
- to attach a host/backend to a Fastly delivery service.Fastly::Services::Healthcheck
- to define a health-check for a Fastly delivery service.
Typically in Fastly, you will need to create a delivery service for you CDN. This resource is the starting point for the others, and only take a name as a required argument. Let's create parameter in our stack to capture this:
Parameters:
DeliveryServiceName:
Type: String
Description: Name of the delivery service in Fastly
We can define our new delivery service as follows:
DeliveryService:
Type: Fastly::Services::Service
Properties:
Name: !Ref DeliveryServiceName
Please note the Fastly::Services::Service
does offer more properties. Please check the documentation.
A domain represents the domain name through which visitors will retrieve content. There can be multiple domains for a delivery service.
In this example, we are going to attach two domain: acme.co.uk
and acme.cn
:
UKDomain:
Type: Fastly::Services::Domain
Properties:
Name: acme.co.uk
Comment: This is a specific domain to access the ACME public webpage in the UK
ServiceId: !GetAtt DeliveryService.Id
VersionId: !GetAtt DeliveryService.LatestVersionId
ChinaDomain:
Type: Fastly::Services::Domain
Properties:
Name: acme.cn
Comment: This is a specific domain to access the ACME public webpage in China
ServiceId: !GetAtt DeliveryService.Id
VersionId: !GetAtt DeliveryService.LatestVersionId
Now we can create health check for these domains. Healthchecks are used to customize the way Fastly checks on your Backends. If an origin server is marked unhealthy due to health checks, Fastly will stop attempting to send requests to it. If all origin servers are marked unhealthy, Fastly will attempt to serve stale. If no stale object is available, a 503 will be returned to the client.
UKHealthcheck:
Type: Fastly::Services::Healthcheck
Properties:
ServiceId: !GetAtt DeliveryService.Id
VersionId: !GetAtt DeliveryService.LatestVersionId
Name: Heathcheck for the UK
CheckInterval: 60000
Host: !GetAtt UKDomain.DomainName
Initial: 1
Path: "/"
Threshold: 1
Timeout: 5000
Window: 2
ChinaHealthcheck:
Type: Fastly::Services::Healthcheck
Properties:
ServiceId: !GetAtt DeliveryService.Id
VersionId: !GetAtt DeliveryService.LatestVersionId
Name: Heathcheck for China (Mainland)
CheckInterval: 60000
Host: !GetAtt ChinaDomain.DomainName
Initial: 1
Path: "/"
Threshold: 1
Timeout: 5000
Window: 2
Now that we have domains and health checks created, we can tie everything together with backends. A Backend (also sometimes called an origin server) is a server identified by IP address or hostname, from which Fastly will fetch your content. There can be multiple backends attached to a service, but each backend is specific to one service. By default, the first backend added to a service configuration will be used for all requests (provided it meets any conditions attached to it). If multiple backends are defined for a service, the first one that has no attached conditions, or whose condition is satisfied for the current request, will be used.
UKBackend:
Type: Fastly::Services::Backend
DependsOn: UKHealthcheck
Properties:
ServiceId: !GetAtt DeliveryService.Id
VersionId: !GetAtt DeliveryService.LatestVersionId
Name: !GetAtt UKDomain.DomainName
Address: !GetAtt UKDomain.DomainName
Port: 443
UseSsl: true
MinTlsVersion: "1.2"
Healthcheck: !GetAtt UKHealthcheck.HealthcheckName
ChinaBackend:
Type: Fastly::Services::Backend
DependsOn: ChinaHealthcheck
Properties:
ServiceId: !GetAtt DeliveryService.Id
VersionId: !GetAtt DeliveryService.LatestVersionId
Name: !GetAtt ChinaDomain.DomainName
Address: !GetAtt ChinaDomain.DomainName
Port: 443
UseSsl: true
MinTlsVersion: "1.2"
Healthcheck: !GetAtt ChinaHealthcheck.HealthcheckName
As a result, we now have one delivery service in fastly
which has 2 domains acme.co.uk
and acme.cn
along with to corresponding hosts and health checks