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
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/aws/cloudfront/downloadUnzip 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?
| Goal | Reference |
|---|---|
| Decide whether CloudFront is the right layer, see how it integrates, create a distribution, tune caching, or choose pricing | when to use CloudFront |
| Serve a custom domain over HTTPS, manage ACM certificates, or run many domains with a certificate per tenant | managing 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 token | securing your content |
| Get visibility into traffic with standard and real-time logs, and analyze them | CloudFront 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
route53skill).
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
- ATTRIBUTION.mdAdded by AutoGineer931 B
- LICENSELicence file added by AutoGineer9.9 KiB
- NOTICELicence file added by AutoGineer67 B
- SKILL.md5.1 KiB
- references/cloudfront-observability.md10.5 KiB
- references/managing-certificates-with-cloudfront.md13.8 KiB
- references/multi-tenant-distributions.md13.3 KiB
- references/protecting-your-origins.md12.6 KiB
- references/securing-your-content.md14.9 KiB
- references/when-to-use-cloudfront.md15.4 KiB
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
| Question | Control |
|---|---|
| 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
| Choice | Use when |
|---|---|
| Signed URLs | A single file, or a client without cookie support. Signature, policy, and expiration go in query-string parameters |
| Signed cookies | Many 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, ortoken.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-identityYou 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.GeoRestrictionblock). Fetch the current config and ETag, set theRestrictions.GeoRestrictionblock, then pass the full modified config back as an inline JSON string (use an inline JSON string, not afile://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
authorizationheader, (b) reject a missing or over-length token with a 401, and (c) verify the token's signature (for example, validate the JWT signature withcrypto.subtlein a CloudFront Functions runtime that supports it) before returningevent.request. Author the function code to do all three.Create the function with your authored, signature-verifying code (replace
{function_code}with it), and setRuntimeto 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
SecurityHeadersPolicyis 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'sResponseHeadersPolicyId, then pass the full modified config back as an inline JSON string (use an inline JSON string, not afile://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...}'
3. Confirm origin locking and surface the console link
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 inputdistribution_idparameter: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/E1ABCDEF2GHIJKTroubleshooting
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
Serve private content with signed URLs and signed cookies (Amazon CloudFront Developer Guide)
Decide to use signed URLs or signed cookies (Amazon CloudFront Developer Guide)
Restrict the geographic distribution of your content (Amazon CloudFront Developer Guide)
Mutual TLS authentication with CloudFront (Viewer mTLS) (Amazon CloudFront Developer Guide)
Enable mutual TLS for CloudFront distributions (Amazon CloudFront Developer Guide)
Customize at the edge with CloudFront Functions and Lambda@Edge (Amazon CloudFront Developer Guide)
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