Generated banner for Cloudfront
Generated logo for Cloudfront

Cloudfront

AWSOfficialPublished by AWS

  • Skill
  • Tool integration
  • Cloud and DevOps
  • Apache-2.0
  • No issues found

From the author

Configures Amazon CloudFront content delivery across six workflows: when to use CloudFront and how it fits with AWS WAF, Shield, CloudFront Functions, Lambda@Edge, Route 53, and origins (creating a distribution, caching, and Flat Rate Pricing (FRP) versus pay-as-you-go pricing); managing custom-domain TLS certificates (ACM in us-east-1); configuring multi-tenant distributions; protecting origins with origin access control (OAC), VPC origins, and origin mutual TLS (mTLS); securing content with signed URLs and cookies, geographic restrictions, viewer mutual TLS, and edge token validation; and observing traffic with standard and real-time logs. Applicable when the customer wants to put CloudFront in front of content, choose pricing, lock an origin, restrict who can view content, or analyze logs. Not applicable for the Route 53 DNS side of a CloudFront custom domain or failover between distributions, or for pure-Route 53 DNS work (see the route53 skill).
— the description by AWS

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

This skill provides domain expertise for managing Amazon CloudFront distributions. It covers the full lifecycle of content delivery, from initial architectural decisions and distribution creation to securing origins and content, managing TLS certificates, and configuring traffic observability. The skill acts as a router, directing users to specific reference procedures for tasks such as setting up multi-tenant distributions, implementing origin access control, or choosing between standard and real-time logging. It emphasizes that CloudFront and its associated ACM certificates must be managed in the us-east-1 region.

What it does

  • Guides decisions on when to use CloudFront and how it integrates with other AWS services.
  • Manages custom domain TLS certificates via ACM in us-east-1.
  • Configures origin protection using OAC, VPC origins, and mTLS.
  • Secures content delivery with signed URLs, cookies, and geographic restrictions.
  • Sets up standard and real-time logging for traffic observability.
  • Supports multi-tenant distribution configurations for shared settings.

When to use it

  • When you need to create or configure a CloudFront distribution.
  • When you need to secure your origin so it is only reachable via CloudFront.
  • When you need to manage custom domain certificates for your distribution.
  • When you need to restrict content access based on identity, location, or tokens.
  • When you need to analyze traffic patterns using standard or real-time logs.

Advantages

  • Provides structured procedures for complex configurations like multi-tenant setups.
  • Clarifies the distinction between origin protection and content security.
  • Centralizes guidance on AWS service integrations like WAF and Lambda@Edge.
  • Ensures correct regional configuration for ACM certificates.
  • Offers clear decision frameworks for choosing logging strategies.

Usage examples

“How do I restrict my S3 origin so it can only be accessed through CloudFront?”
The agent will guide you through the protecting-your-origins reference to implement Origin Access Control (OAC) or VPC origins.
“Should I use standard or real-time logs for my CloudFront distribution?”
The agent will help you choose based on your need for complete audit records versus fast, sampled anomaly detection.
“I am getting an error when attaching my ACM certificate to CloudFront.”
The agent will verify if your certificate was requested in us-east-1 and provide steps to correct the region if necessary.

Install

  1. Download the skill as a ZIP:

    https://mp-staging.autogineer.com/agent-skills/aws/cloudfront/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip cloudfront.zip -d .agents/skills

Documentation by AWS

Amazon CloudFront

Overview

Domain expertise for configuring Amazon CloudFront content delivery: deciding when to use CloudFront and how it fits the wider architecture, managing custom-domain certificates and multi-tenant distributions, protecting origins, securing content, and observing traffic.

This skill is a router. Each customer task maps to a procedure file under references/. Read the matching reference in full before acting, then follow its constraints and steps. The reference files are self-contained: each carries its own decision tables, constraints, procedure, and troubleshooting.

Execute commands using the AWS MCP server when connected (sandboxed execution, audit logging, observability). Fall back to the AWS CLI otherwise. CloudFront is a global service; its API calls and the AWS Certificate Manager (ACM) certificates it uses are made in us-east-1 regardless of where the customer's application runs.

Which CloudFront task do you need?

GoalReference
Decide whether CloudFront is the right layer, see how it integrates, create a distribution, tune caching, or choose pricingwhen to use CloudFront
Serve a custom domain over HTTPS, manage ACM certificates, or run many domains with a certificate per tenantmanaging certificates with CloudFront
Make CloudFront the only way to reach the origin (S3 OAC, VPC origins, origin mutual TLS, security groups)protecting your origins
Limit who can view content by identity, location, client certificate, or auth tokensecuring your content
Get visibility into traffic with standard and real-time logs, and analyze themCloudFront observability
Serve multiple domains through shared configuration with per-tenant customization (SaaS, platform)multi-tenant distributions

Routing notes

  • Choosing the layer and creating a distribution vs the rest. Whether CloudFront is the right entry layer, what it integrates with, creating a distribution, caching, and pricing live in the when-to-use reference. The other references assume a distribution exists and configure one aspect of it.

  • Protecting origins vs securing content. Locking the origin so it is reachable only through CloudFront (OAC, VPC origins, origin mTLS) is the protecting-your-origins reference. Restricting which viewers can see content (signed URLs and cookies, geographic restrictions, viewer mTLS, edge token validation) is the securing-your-content reference. They are paired: a content control only holds when the origin is also locked.

  • Viewer mTLS vs origin mTLS. Authenticating the client to CloudFront (viewer mTLS) is content security. Authenticating CloudFront to the origin (origin mTLS) is origin protection. Different controls, different references.

  • Custom domain certificate vs Route 53 DNS cutover. Requesting and validating the ACM certificate and adding the alternate domain name is the managing-certificates reference here. Pointing the domain's DNS at the distribution, including the zone apex alias and any failover, is Route 53 DNS work (see the route53 skill).

Cross-service work

Pointing a custom domain's DNS at a CloudFront distribution, or failing over between distributions with Route 53 records, is cross-service work spanning CloudFront and Route 53. Use this skill for the CloudFront-side configuration only.

Additional Resources

Files

references/securing-your-content.md

Securing Your Content

Overview

Domain expertise for limiting who can view content served through CloudFront, using four controls that answer different questions:

  • Identity: signed URLs or signed cookies, backed by a trusted key group.

  • Location: built-in geographic restrictions, by country, across the whole distribution.

  • Client certificate: viewer mutual TLS (viewer mTLS), where the client presents a certificate CloudFront validates against a trust store.

  • Authorization token: a CloudFront function on the viewer-request event that validates an OAuth bearer token or JSON Web Token (JWT) at the edge.

All four only hold if the origin cannot be reached directly. Pair every content control with origin locking (see protecting-your-origins).

Does not cover locking the origin (see protecting-your-origins), custom domains (see managing-certificates-with-cloudfront), or creating the distribution (see when-to-use-cloudfront).

Execute commands using the AWS MCP server when connected (sandboxed execution, audit logging, observability). Fall back to the AWS CLI otherwise.

Table of Contents

  • Overview

  • Decision: which content control

  • Identity: signed URLs vs signed cookies

  • Location: geographic restrictions

  • Client certificate: viewer mutual TLS

  • Authorization token: validate at the edge with CloudFront Functions

  • Pair every control with origin locking

  • Procedure

  • Troubleshooting

  • Security Considerations

  • Additional Resources

Decision: which content control

QuestionControl
Is this viewer authorized (paying, licensed)?Signed URLs or signed cookies
Is this viewer in an allowed country?Geographic restrictions
Does this client hold a valid certificate?Viewer mutual TLS
Does this request carry a valid auth token?CloudFront function on viewer-request

Constraints:

  • You MUST ask whether the customer is gating on identity, location, client certificate, or token, and route to the matching control rather than letting one stand in for another

  • You MAY combine controls; they are independent

Identity: signed URLs vs signed cookies

ChoiceUse when
Signed URLsA single file, or a client without cookie support. Signature, policy, and expiration go in query-string parameters
Signed cookiesMany files, or no change to the URL is acceptable. Same data goes in cookies; the URL is unchanged

Constraints:

  • You MUST set up trusted key groups on the distribution and have the application issue the signed URL or cookies. The legacy CloudFront key pairs approach is deprecated and MUST NOT be used for new implementations

  • You MUST store the private signing key in AWS Secrets Manager (or AWS Systems Manager Parameter Store SecureString), not on disk or in application config, so the key is not exposed

  • You MUST match the choice to one file versus many, and to whether any URL change is acceptable

Location: geographic restrictions

Constraints:

  • You MUST explain geographic restrictions apply to the whole distribution at the country level, not per path

  • You SHOULD route per-path or finer-than-country needs to separate distributions or a third-party geolocation approach

Client certificate: viewer mutual TLS

Constraints:

  • You MUST create the trust store from a PEM CA bundle in S3, then enable viewer mutual authentication on the distribution

  • You MUST select required mode to reject any client without a valid certificate (optional lets unauthenticated clients through; passthrough forwards the raw certificate to the origin)

  • You MUST disable HTTP/3 and confirm every cache behavior uses HTTPS-only or redirect-HTTP-to-HTTPS before enabling mTLS

  • You SHOULD note the trust store reads the CA bundle from S3 only at creation time, so rotation needs a manual trust store update

Authorization token: validate at the edge with CloudFront Functions

Constraints:

  • You SHOULD validate an OAuth bearer token or JWT in a CloudFront function on the viewer-request event when the logic is lightweight and viewer-facing

  • You MUST route token checks that need network access or origin-facing events to Lambda@Edge

  • You MUST publish the function to the LIVE stage before associating it with the distribution

Pair every control with origin locking

A content control only holds if access is forced through CloudFront. While the origin URL is directly reachable, viewers bypass the control entirely.

Constraints:

  • You MUST pair every content control with an origin-locking mechanism: origin access control for an S3 origin, or VPC origins or origin mTLS for a custom origin (see protecting-your-origins)

  • You MUST NOT present a content control as complete while the origin is still directly reachable

Procedure

Overview

This procedure selects the content control by question, applies it, pairs it with origin locking, and surfaces the console link.

Parameters
  • distribution_id (required): The distribution to secure.

  • control (required): signed, geo, viewer-mtls, or token.

  • gate_detail (required): The key group, country list, trust store source, or token type.

Constraints for parameter acquisition:

  • You MUST ask what the customer is gating on upfront

  • You MUST confirm the origin-locking plan before calling the setup complete

Steps
1. Verify dependencies

Constraints:

  • You MUST confirm credentials with aws sts get-caller-identity

  • You MUST confirm the origin is locked or plan to lock it (see protecting-your-origins)

2. Apply the chosen control

Constraints:

  • For identity, you MUST configure a trusted key group and have the application issue signed URLs or cookies. Create the key group, then reference it from the cache behavior's TrustedKeyGroups:

    aws cloudfront create-key-group --key-group-config \
      '{"Name":"paid-users","Items":["{publicKeyId}"]}'
  • For location, you MUST set the geographic restriction allowlist or denylist on the distribution by updating its config (the Restrictions.GeoRestriction block). Fetch the current config and ETag, set the Restrictions.GeoRestriction block, then pass the full modified config back as an inline JSON string (use an inline JSON string, not a file:// reference, for portability across execution environments):

    aws cloudfront get-distribution-config --id {distribution_id}
    # set Restrictions.GeoRestriction in the returned DistributionConfig, then put it back.
    # RestrictionType is an AWS API enum; its only allowed values are "whitelist" (allowlist),
    # "blacklist" (denylist), and "none" — use the API's exact token here for the allowlist case:
    aws cloudfront update-distribution --id {distribution_id} --if-match {etag} \
      --distribution-config '{"CallerReference":"...","Restrictions":{"GeoRestriction":{"RestrictionType":"whitelist","Quantity":1,"Items":["US"]}}, ...rest of the unchanged config...}'
  • For client certificate, you MUST create the trust store, disable HTTP/3, set all behaviors to HTTPS, and enable viewer mutual authentication in required mode. Create the trust store from the PEM CA bundle in S3:

    aws cloudfront create-trust-store --name {name} \
      --s3-bucket {bucket} --s3-object-key {ca-bundle.pem}
  • For token, you MUST write a CloudFront function on viewer-request that validates the token, then publish and associate it.

  • ⚠️ You MUST implement real signature verification before publishing. A function that only checks token presence and length does not verify authenticity — any arbitrary string passes, which is a false sense of security. The validation logic below is described as steps, not as runnable code, so it is not deployed as-is: the function MUST (a) read the bearer token from the authorization header, (b) reject a missing or over-length token with a 401, and (c) verify the token's signature (for example, validate the JWT signature with crypto.subtle in a CloudFront Functions runtime that supports it) before returning event.request. Author the function code to do all three.

  • Create the function with your authored, signature-verifying code (replace {function_code} with it), and set Runtime to the current CloudFront Functions runtime that supports your code — do not hardcode a runtime string that ages; check the available runtimes in the CloudFront Developer Guide (CloudFront Functions) and select the latest supported one for {runtime}:

    aws cloudfront create-function --name {name} \
      --function-config '{"Comment":"token-check","Runtime":"{runtime}"}' \
      --function-code '{function_code}'
  • Only after the function performs signature verification, publish and associate it:

    aws cloudfront publish-function --name {name} --if-match {etag}
  • You MUST also attach a response headers policy that adds browser security headers (HSTS, Content-Security-Policy, X-Frame-Options, X-Content-Type-Options) to complement these access controls, since they defend against different browser-based attacks (clickjacking, MIME sniffing, protocol downgrade). The AWS managed SecurityHeadersPolicy is a starting point. Look up its current id by name (do not hardcode a UUID — managed policy ids can change), fetch the current config and ETag, set the behavior's ResponseHeadersPolicyId, then pass the full modified config back as an inline JSON string (use an inline JSON string, not a file:// reference, for portability across execution environments):

    # resolve the managed SecurityHeadersPolicy id by name (do not hardcode a UUID):
    aws cloudfront list-response-headers-policies --type managed \
      --query "ResponseHeadersPolicyList.Items[?ResponseHeadersPolicy.ResponseHeadersPolicyConfig.Name=='Managed-SecurityHeadersPolicy'].ResponseHeadersPolicy.Id | [0]" --output text
    aws cloudfront get-distribution-config --id {distribution_id}
    # set DefaultCacheBehavior.ResponseHeadersPolicyId to the resolved managed SecurityHeadersPolicy id
    # in the returned DistributionConfig, then put it back:
    aws cloudfront update-distribution --id {distribution_id} --if-match {etag} \
      --distribution-config '{"CallerReference":"...","DefaultCacheBehavior":{"ResponseHeadersPolicyId":"{security_headers_policy_id}", ...}, ...rest of the unchanged config...}'

Constraints:

  • You MUST confirm the origin cannot be reached directly before calling the control complete

  • You MUST present the distribution detail console link, filling {distributionId} from the input distribution_id parameter:

    https://us-east-1.console.aws.amazon.com/cloudfront/v4/home?region=us-east-1#/distributions/{distributionId}
Example
Example input
{
  "distribution_id": "E1ABCDEF2GHIJK",
  "control": "signed",
  "gate_detail": "trusted-key-group: paid-users"
}
Example output
Configured trusted key group paid-users on E1ABCDEF2GHIJK for signed URLs.
Origin locked with origin access control so the signing cannot be bypassed.
Verify in the console:
https://us-east-1.console.aws.amazon.com/cloudfront/v4/home?region=us-east-1#/distributions/E1ABCDEF2GHIJK

Troubleshooting

Viewers still download files directly despite signed URLs

The origin is directly reachable, so signing is bypassed. Lock the origin (see protecting-your-origins).

Geographic restrictions do not apply to only part of the content

Geographic restrictions apply to the whole distribution at the country level. Use separate distributions or a third-party geolocation approach for finer control.

Enabling viewer mTLS returns a configuration error

HTTP/3 is enabled or a cache behavior allows HTTP. Disable HTTP/3 and set every behavior to HTTPS, then enable mTLS.

Clients without a certificate are still allowed through

The validation mode is optional or passthrough. Use required mode to reject clients without a valid certificate.

A token-validation function association fails

The function was not published to the LIVE stage. Publish it, then associate it.

Security Considerations

  • Origin locking is mandatory. Every content control here is bypassed while the origin is directly reachable. Pair each control with origin access control, VPC origins, or origin mTLS (see protecting-your-origins) before calling it complete.

  • Rotate signing keys. Signed URLs and cookies stay valid until they expire. Rotate the keys in the trusted key group on a schedule and on suspected compromise, and keep expirations short.

  • Rotate the viewer mTLS trust store. The trust store reads the CA bundle from S3 only at creation time, so rotating or revoking a CA requires a manual trust store update; stale CAs keep granting access.

  • Avoid permissive geographic restrictions. Country-level allowlists or denylists apply to the whole distribution. Overly broad lists weaken the control; confirm the list matches the actual policy.

  • Add browser security headers. Attach a response headers policy (HSTS, CSP, X-Frame-Options, X-Content-Type-Options) so the access controls are complemented by defenses against clickjacking, MIME sniffing, and protocol downgrade.

  • Pair access controls with AWS WAF for defense in depth. Signed URLs, geographic restrictions, viewer mTLS, and token validation gate who reaches content, but they do not filter malicious requests at Layer 7. Attach an AWS WAF web ACL with baseline rules (the AWS Managed Rules Core Rule Set and Known Bad Inputs rule group) to the distribution for comprehensive edge protection.

  • Audit content-access changes with CloudTrail. Enable AWS CloudTrail to record the CloudFront management API calls that change access controls (cloudfront:CreateFunction, cloudfront:PublishFunction, cloudfront:UpdateDistribution) for a compliance and forensic audit trail.

Additional Resources

Requirements and compatibility

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta

“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.

Needs: Needs an MCP server

Security

No issues found by our static scan· No issues found

A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.

Attribution and licence

Published by
AWS
Publisher
AWS (Official)
Source
aws/agent-toolkit-for-aws · skills/specialized-skills/networking-and-content-delivery-skills/cloudfront · commit 0a218f8
Licence
Apache License 2.0 (redistribution allowed)
  • LICENSE (added by AutoGineer from LICENSE)
  • NOTICE (added by AutoGineer from NOTICE)
  • ATTRIBUTION.md (written by AutoGineer)
Synced

AutoGineer is not affiliated with or endorsed by AWS.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download cloudfront.zip