SAP-C03 Containers, Auto Scaling, Ingress and Edge: ECS, EKS, Fargate, VPC Lattice, ECR, Load Balancers and CloudFront
Container, scaling, ingress and edge architecture is the part of SAP-C03 Task 1.1 that decides how microservices run on AWS: which orchestrator and capacity they use, how they find and authorize each other, how their images are secured and cleaned up, how they scale, how traffic enters them and what logic runs at the CloudFront edge. At Professional level the questions describe a multi-account estate with several constraints at once (existing Kubernetes tooling, overlapping CIDRs, a protocol that is not HTTP, a cost ceiling, no servers to manage) and every option is a workable AWS design; the right one is the only design that meets every stated requirement. This lesson covers Skills 1.1.6 to 1.1.11: Amazon ECS, Amazon EKS and AWS Fargate; Amazon VPC Lattice and ECS Service Connect; Amazon ECR scanning and lifecycle policies; Lambda, ECS and Kubernetes scaling; ALB, NLB, API Gateway and the AWS Load Balancer Controller; and CloudFront Functions versus Lambda@Edge. Event-driven, serverless and multi-tenant patterns from the same task are covered in the companion lesson.
On this page10 sections
- Choosing between Amazon ECS and Amazon EKS, and between Fargate and EC2
- What Fargate cannot run, and how to mix Fargate, EC2 and Fargate Spot
- Service-to-service communication: ECS Service Connect vs Amazon VPC Lattice
- Amazon VPC Lattice: service networks, sharing and IAM auth
- Amazon ECS Service Connect configuration and behaviour
- Managing container images in Amazon ECR: scanning, immutability and lifecycle policies
- Scaling serverless workloads: Lambda concurrency controls
- Scaling containers: ECS service auto scaling, capacity providers, HPA, Cluster Autoscaler and Karpenter
- Designing ingress: ALB, NLB, API Gateway and the AWS Load Balancer Controller
- Edge architectures: CloudFront Functions vs Lambda@Edge
- Choose Amazon ECS or Amazon EKS, and Fargate, Fargate Spot or EC2 capacity, from existing tooling, team skills, workload needs and operational overhead
- Design service-to-service communication with ECS Service Connect or Amazon VPC Lattice, including cross-account sharing and IAM auth policies, now that AWS App Mesh is past end of support
- Configure Amazon ECR basic or enhanced scanning, tag immutability, deployment gating and lifecycle policies
- Apply Lambda reserved, provisioned and event-source maximum concurrency, and scale ECS and EKS workloads and their capacity with the right metrics
- Select ALB, NLB, API Gateway REST or HTTP APIs as the ingress, and configure the AWS Load Balancer Controller for Fargate pods and shared ALBs
- Decide between CloudFront Functions and Lambda@Edge, the trigger event, and the cache-key design for a latency requirement
Choosing between Amazon ECS and Amazon EKS, and between Fargate and EC2
Choose Amazon EKS when the organization already depends on Kubernetes (manifests, Helm charts, GitOps tools such as Argo CD, custom operators and CRDs) or needs Kubernetes portability; choose Amazon ECS when the team has no Kubernetes investment and wants the least to learn and operate. Both are managed control planes, so neither requires you to run masters or etcd. The second, separate decision is where tasks or pods run: on AWS Fargate (no servers to patch, scale or right-size) or on EC2 capacity you manage through Auto Scaling groups, managed node groups or Karpenter.
| Requirement in the scenario | Points to | What the alternatives add |
|---|---|---|
| Keep existing Kubernetes manifests, Helm, operators; stop running the control plane | Amazon EKS (managed node groups or Fargate) | ECS needs every chart rewritten as task definitions; self-managed Kubernetes on EC2 (kOps) keeps the control-plane work |
| Small team, no Kubernetes skills, no servers, least overhead | Amazon ECS on Fargate | EKS adds Kubernetes operations; EC2 capacity adds patching and scaling |
| GPUs, DaemonSets, privileged containers, custom AMIs | EC2 capacity (alongside Fargate if wanted) | Fargate cannot host them |
Per-service permissions come from the workload identity, not from the infrastructure. On ECS, each task definition gets its own task role, which the application code uses for AWS API calls. The task execution role is different: the ECS agent assumes it to pull images from Amazon ECR, fetch secrets for the task and send logs. Sharing one broad execution role, or one broad task role, across services breaks least privilege. On EKS the equivalent is EKS Pod Identity (or IAM roles for service accounts), which maps a Kubernetes service account to an IAM role.
What Fargate cannot run, and how to mix Fargate, EC2 and Fargate Spot
Fargate cannot run GPU workloads, privileged containers or Kubernetes DaemonSets, because there is no node you control: each pod or task gets its own isolated compute environment. On EKS, pods are sent to Fargate only when they match a Fargate profile (namespace and optional labels); a pod that needs a GPU or a DaemonSet that needs node-level access stays Pending, because no Fargate setting provides that capability, and node autoscalers manage EC2 nodes, not Fargate. The fix is mixed capacity: add EC2 managed node groups (with GPU instance types where needed) for those workloads and keep everything else on Fargate. A node-level agent on Fargate has to run as a sidecar in each pod instead, and only if it does not need privileged mode.
Capacity provider strategies on ECS
An ECS service can spread tasks across capacity providers such as FARGATE and FARGATE_SPOT (or Auto Scaling group providers). A strategy has two numbers per provider:
- base: the minimum number of tasks placed on that provider first. Only one provider in a strategy may have a base greater than zero.
- weight: after the base is met, remaining tasks are split in proportion to the weights. FARGATE weight 1 with FARGATE_SPOT weight 3 puts about three of every four extra tasks on Spot.
Put the guaranteed baseline (base) on regular FARGATE, never on Spot: if Spot capacity is unavailable, ECS does not fall back to regular Fargate, so a Spot baseline can go unmet.
Handling Fargate Spot interruptions
When AWS reclaims Fargate Spot capacity, the task receives a two-minute warning (also published as an ECS task state change event to Amazon EventBridge) and the container receives SIGTERM. ECS sends SIGKILL after the container's stopTimeout, which defaults to 30 seconds and can be raised to 120 seconds on Fargate. To avoid losing in-flight work, the application must catch SIGTERM, stop taking new work (for example, stop receiving SQS messages) and finish or checkpoint the current item, and stopTimeout must be long enough for that. EC2 Spot Instance interruption warnings do not apply to Fargate tasks.
Service-to-service communication: ECS Service Connect vs Amazon VPC Lattice
For microservice communication and observability on AWS, use Amazon ECS Service Connect when every service runs on ECS, and Amazon VPC Lattice when services span compute types (EC2, ECS, EKS, Lambda), VPCs or accounts and need IAM-based request authorization. Both are managed: neither asks you to run your own Envoy sidecars. AWS App Mesh reached end of support on 30 September 2026, and AWS points its users to Service Connect for ECS and to VPC Lattice for cross-VPC and cross-account traffic, so App Mesh is never a design choice for new work.
| Need | ECS Service Connect | Amazon VPC Lattice |
|---|---|---|
| Compute supported | ECS services only | EC2 instances, IP targets, ECS, EKS (via the Gateway API controller), Lambda, ALBs |
| Short names and discovery | Client aliases in an AWS Cloud Map namespace | Service DNS names (custom domain names possible) |
| Resilience | Automatic retries, outlier detection removes unhealthy tasks | Health checks on target groups, weighted routing |
| Metrics | Per-service connection and HTTP metrics in CloudWatch (with appProtocol set) | Request, error and latency metrics and access logs per service |
| Authorization | Network controls (security groups) | IAM auth policies per service network and per service |
| Cross-VPC / cross-account | Namespaces can be shared through AWS RAM; tasks still need network reachability | Built in: share through AWS RAM, works with overlapping CIDRs, no peering or route tables |
Neighbouring options solve less. AWS Cloud Map DNS discovery alone gives names but no proxy, so no retries and no HTTP status metrics. Internal ALBs per service add infrastructure to manage and give no client-side retries. AWS PrivateLink tolerates overlapping CIDRs but needs an endpoint service and interface endpoints per service and cannot authorize individual IAM roles per request. Transit Gateway requires non-overlapping address space and offers only network-level controls.
Amazon VPC Lattice: service networks, sharing and IAM auth
VPC Lattice connects clients to services through a service network: a logical boundary that holds services (each with listeners, rules and target groups) and associations. A client VPC reaches every service in a service network once the VPC is associated with it (or through a service network VPC endpoint); traffic is routed by Lattice, not by your route tables, so VPC CIDRs may overlap.
Cross-account setup
- The owning account (often a central networking account) creates the service network and shares it through AWS Resource Access Manager with other accounts or the whole organization. Services can be shared the same way.
- Service owners associate their services with the shared service network.
- Consumer accounts create a service network VPC association for each client VPC. No VPC peering, transit gateway attachment or private hosted zone is required.
Auth policies and SigV4
With auth type AWS_IAM, Lattice evaluates IAM-style auth policies at two levels, and a request must be allowed by both: the service network policy (typically a coarse guardrail such as "principals in my organization") and the service policy (fine-grained, for example "only the billing role may call vpc-lattice-svcs:Invoke on these paths"). Auth policies apply to HTTP and HTTPS listeners. Lattice can only identify the caller when the request is signed with SigV4 (or SigV4A) for the vpc-lattice-svcs service, using the caller's IAM credentials (with an unsigned-payload header). An unsigned request is anonymous, so a policy that allows only specific roles or organization members returns HTTP 403. Read the symptom: a 403 means the request reached Lattice and was denied by policy; a timeout or refused connection points at the network path instead.
Amazon ECS Service Connect configuration and behaviour
Service Connect gives ECS services short names, retries, outlier detection and traffic metrics by having ECS inject and manage a proxy in every task; you configure it, you never maintain the proxy container. Two pieces of configuration make it work:
- Task definition: the container's port mapping gets a name, and an
appProtocol(http,http2orgrpc) so the proxy can produce protocol-aware metrics such as 5xx counts. - ECS service: Service Connect is turned on with an AWS Cloud Map namespace (shared by every service that should talk to each other, across clusters), the port name, a discovery name and the client alias (DNS name and port) that callers use.
A service is either a client service (it only calls others) or a client-server service (it also publishes endpoints). The behaviour most often tested: running tasks do not learn about endpoints added after they started. When a new client-server service joins the namespace, services deployed afterwards can reach it, but a long-running client cannot until you start a new deployment of that client. The proxy receives its endpoint list when the task launches, so only new tasks pick up new endpoints.
Managing container images in Amazon ECR: scanning, immutability and lifecycle policies
ECR offers two scan types, chosen for the whole registry (you cannot mix them per repository):
| Basic scanning | Enhanced scanning (Amazon Inspector) | |
|---|---|---|
| Packages covered | Operating system packages | Operating system and programming-language packages (for example Python, Java, Node.js libraries) |
| When it scans | On push, or manually | On push, or continuously (rescans when new CVEs are published) |
| Multi-account view | Per account | Inspector with a delegated administrator account shows findings across the organization |
With enhanced scanning, the registry scanning configuration holds rules that pair a frequency (continuous or scan on push) with repository name filters (wildcards allowed). If a repository matches both a continuous and a scan-on-push filter, continuous wins; a repository that matches no filter is not scanned. That lets you rescan production repositories continuously and scan everything else once at push to control Inspector charges. Amazon GuardDuty Runtime Monitoring is a different control: it watches running workloads for threats, not images for CVEs.
Gating deployments and pinning releases
Tag immutability rejects any push that would move an existing tag, so a release tag permanently identifies one image and the repository enforces it whoever pushes, so IAM push permissions alone cannot give that guarantee. To stop vulnerable images reaching production, a pipeline stage waits for the image's enhanced scan to complete, reads its findings and fails on the severities you set (for example CRITICAL). Deploying by image digest is another way to pin exactly what runs.
Lifecycle policies
A lifecycle policy removes unneeded images automatically with no code. Each rule has a rulePriority (lower numbers are evaluated first) and a selection:
tagStatus:untagged,tagged(withtagPrefixList, such asrelease-, ortagPatternListwith wildcards, such asrelease-*) orany(which must have the highestrulePrioritynumber, so it is evaluated last).countType:sinceImagePushedwith acountUnitof days (age-based, for example expire untagged images after 7 days) orimageCountMoreThan(count-based, for example keep the newest 20 release images).
Two rules govern how a policy reads: tag patterns match literally except where they contain a wildcard, and the count type decides the behaviour (a count rule keeps a number of images, an age rule expires images by time). Lifecycle policies are ECR's built-in retention mechanism; tag immutability governs overwrites, not retention.
Scaling serverless workloads: Lambda concurrency controls
Lambda scaling is governed by concurrency, and each control solves a different problem:
| Control | What it does | Use it when |
|---|---|---|
| Reserved concurrency | Sets aside part of the account's Regional pool for one function and caps it there; no extra charge | A critical function must always be able to scale, or a noisy function must be limited |
| Provisioned concurrency | Keeps initialized execution environments ready on a version or alias (not $LATEST); billed while configured | Cold starts break a latency target |
| Application Auto Scaling for provisioned concurrency | Scheduled actions or target tracking on provisioned concurrency utilization | Demand is predictable (schedule it) or varies (track utilization), to avoid paying for idle warm capacity |
| SnapStart | Starts new environments from a cached snapshot | Supported runtimes only (Java, Python, .NET); not Node.js, and not combined with provisioned concurrency |
| Maximum concurrency on an SQS event source mapping | Limits how many concurrent invocations the SQS poller makes (2 to 1,000) | An SQS consumer must stay within a concurrency cap without throttling |
Two traps recur. First, provisioned concurrency also guarantees capacity, but it costs money and targets cold starts; if latency is fine and the need is a guaranteed share of the pool, reserved concurrency is the cheaper answer. Without reserved concurrency every function draws from one shared pool, however large that pool is. Second, capping an SQS-triggered function with reserved concurrency alone lets the poller keep scaling; its invocations are throttled, the batches return to the queue, each counts as a receive, and after maxReceiveCount healthy messages land in the dead-letter queue with no code error. Set maximum concurrency on the event source mapping instead, and keep reserved concurrency at or above the total maximum concurrency of the function's SQS sources.
Scaling containers: ECS service auto scaling, capacity providers, HPA, Cluster Autoscaler and Karpenter
Container scaling has two layers that must both work: the number of tasks or pods, and the capacity they run on. With Fargate only the first layer exists; with EC2 capacity you also have to scale instances.
Amazon ECS service auto scaling
ECS services scale through Application Auto Scaling with target tracking, step or scheduled policies. Target tracking works only on a metric that falls proportionally as tasks are added, so pick it from the workload:
- CPU or memory bound: average CPU or memory utilization.
- Request bound behind an ALB (for example I/O-bound tasks waiting on a database, with low CPU):
ALBRequestCountPerTarget, with the target set to the request rate one task handles comfortably. The load balancer's totalRequestCountdoes not change as tasks are added, so totals across the load balancer do not suit target tracking; per-target metrics exist for this reason. - Queue workers: backlog per task (visible SQS messages divided by running tasks, built with CloudWatch metric math), with the target equal to the backlog one task can clear in an acceptable time. Raw queue depth does not scale proportionally.
Scheduled scaling suits known, repeating patterns; step scaling adds or removes fixed increments when an alarm breaches; target tracking is the usual choice when a metric reflects load per task.
ECS on EC2: capacity providers
If tasks sit in PROVISIONING because the cluster lacks room, or scale-in terminates instances that still run tasks, use an Auto Scaling group capacity provider with managed scaling (ECS publishes a capacity metric based on the tasks it needs to place and scales the group to it) and managed termination protection (instances running tasks are protected from scale-in). Managed scaling responds to tasks waiting for placement rather than to instance utilization, and it replaces custom scaling and draining code.
Amazon EKS: Horizontal Pod Autoscaler and node scaling
The Horizontal Pod Autoscaler scales a Deployment's replicas on metrics from the Kubernetes Metrics Server (or custom and external metrics through an adapter). Utilization is measured against the containers' resource requests, so a pod template without CPU requests leaves the HPA showing unknown and never scaling, even when kubectl top works. Pods also need nodes:
| Cluster Autoscaler | Karpenter | |
|---|---|---|
| How it adds nodes | Grows predefined Auto Scaling groups / managed node groups | Reads pending pods' requirements and launches suitable EC2 instances directly |
| Instance diversity | Each node group needs instance types of similar size (a mixed-instances policy is possible), so diverse shapes and purchase options mean several predefined groups | One NodePool can allow a broad set of instance types and both Spot and On-Demand |
| Removing waste | Scales down empty or underused nodes within each group | Consolidation (WhenEmptyOrUnderutilized) removes or replaces underused nodes, within disruption budgets |
Karpenter's advantage comes from flexibility: the broader the instance requirements a NodePool allows, the better it can fit pods and consolidate nodes. Disruption budgets limit how many nodes may be voluntarily disrupted at once, and consolidation is a voluntary disruption, so a budget that allows none also stops consolidation. Amazon EKS Auto Mode runs Karpenter-based node management for you if the team does not want to operate it.
Designing ingress: ALB, NLB, API Gateway and the AWS Load Balancer Controller
Pick the front door from the protocol and the features the scenario names, then from cost at the traffic pattern:
| Front door | Choose it for | It cannot |
|---|---|---|
| Application Load Balancer | HTTP/HTTPS, HTTP/2 and gRPC (gRPC target groups, gRPC health checks, routing by method path /package.Service/Method); host, path and header rules; OIDC/Cognito authentication and JWT validation of access tokens (machine-to-machine); Lambda targets; AWS WAF | Carry non-HTTP protocols, give a static IP per AZ, or be a PrivateLink endpoint service on its own; throttle per route |
| Network Load Balancer | TCP, UDP and TLS (any protocol, such as MQTT or a custom binary protocol); static IP or Elastic IP per AZ; client IP preservation; PrivateLink endpoint services; very high connection rates | Route by path, host or gRPC method (it can only split by listener port) |
| API Gateway REST API | Usage plans and API keys (per-client throttling and quotas), AWS WAF, response caching, request validation, private APIs | Be cheap at very high steady volume |
| API Gateway HTTP API | Lower per-request price, JWT authorizers (for example trusting an Amazon Cognito user pool), Lambda and IAM authorizers, route-level throttling | Usage plans, API keys, AWS WAF association or caching |
Two combinations recur. To offer an HTTP API privately to many customer VPCs with overlapping CIDRs and route by path, put an NLB endpoint service in front of an ALB (an NLB can register an ALB-type target group). And for steady, very high traffic that uses no API Gateway features, an internal ALB with Lambda targets is usually far cheaper than any per-request API pricing, because ALB charges by hours and capacity units; moving from a REST API to an HTTP API reduces the cost but keeps it per request.
TCP or TLS listener on an NLB
An NLB listener decides where TLS ends. A TLS listener terminates TLS at the NLB: it holds a certificate from AWS Certificate Manager, applies a security policy and sends traffic to targets decrypted (or re-encrypted). A TCP listener on the same port passes the encrypted byte stream through untouched, so TLS terminates at the targets, which hold the certificates. Choose TCP passthrough when encryption must be end to end, when the targets authenticate clients with mutual TLS (device certificates, for example), or when the application protocol inside TLS, such as MQTT, is handled entirely by the targets; choose a TLS listener to offload certificate management and decryption from the targets. Either way the NLB never needs to understand the protocol inside the connection.
Client IP preservation on an NLB
For instance targets, client IP preservation is on by default. For IP targets with TCP or TLS it is off by default and is turned on with the target group attribute preserve_client_ip.enabled=true (then the targets' security groups must allow the clients' addresses). Proxy protocol v2 is the alternative only when the application can parse its header. An ALB passes the client address in X-Forwarded-For instead.
AWS Load Balancer Controller on EKS
- An Ingress becomes an ALB; a Service of type LoadBalancer with
aws-load-balancer-type: externalbecomes an NLB. The controller creates load balancers as internal unless the scheme annotation saysinternet-facing. - Target type:
instanceregisters worker nodes on a NodePort;ipregisters pod IPs directly. Pods on Fargate can only be IP targets, so an Ingress for Fargate pods needsalb.ingress.kubernetes.io/target-type: ipand an NLB Service needsaws-load-balancer-nlb-target-type: ip. - IngressGroups: Ingresses that share the same
alb.ingress.kubernetes.io/group.nameare merged into one ALB, while each team still owns its Ingress object.group.ordersets precedence (lower values are evaluated first), so a catch-all/Ingress gets the highest order. Theload-balancer-nameannotation only names an ALB; it does not merge Ingresses. - TargetGroupBinding attaches a Service to a load balancer created outside Kubernetes.
Edge architectures: CloudFront Functions vs Lambda@Edge
Use CloudFront Functions for lightweight, high-volume logic on viewer events (URL rewrites, redirects, header and cookie manipulation, cache-key normalization, simple token checks) and Lambda@Edge when the logic needs network calls, the request body, more time or memory, or origin events.
| CloudFront Functions | Lambda@Edge | |
|---|---|---|
| Events | Viewer request, viewer response | Viewer request/response and origin request/response |
| Runtime and speed | JavaScript, sub-millisecond start, lowest cost | Node.js or Python, slower start, higher cost |
| Network access | None | Yes (can call external APIs and AWS services) |
| Request body | No | Yes (when body access is enabled) |
| Changing data without redeploying | CloudFront KeyValueStore | No environment variables; read from an external store over the network |
Where the trigger sits matters as much as which service. Viewer request functions run on every request, before the cache is checked; origin request functions run only on cache misses. So logic that must apply to cached objects too (authorization, a redirect for every visitor) belongs on viewer request, and a check that needs an outbound call to a third-party API, such as introspecting an opaque token, has to be Lambda@Edge on viewer request.
Keep cache keys narrow
Every header, cookie or query string in the cache policy becomes part of the cache key and fragments the cache. Include only what changes the response: for an A/B test, only the variant cookie, never all cookies. Values that the origin or a function needs but that do not change the cached object belong in an origin request policy. Headers that CloudFront generates, such as the viewer-country header, must be added to a cache or origin request policy before an origin-facing function or the origin receives them.
Tip. Expect long multi-account scenarios with several stated constraints, and options that are all real AWS designs; each wrong option misses one constraint. Common angles: an existing Kubernetes estate versus a team with no Kubernetes skills; workloads Fargate cannot host; capacity provider base and weight; Fargate Spot interruption handling; mixed compute or overlapping CIDRs that separate VPC Lattice from Service Connect, PrivateLink and Transit Gateway; troubleshooting symptoms such as a client that cannot resolve a new Service Connect endpoint, an HPA showing unknown utilization, tasks stuck in PROVISIONING or Lattice returning 403; reading ECR lifecycle and scanning rules; choosing the right Lambda concurrency control; picking the target-tracking metric; matching protocol, static IP, PrivateLink and API features to ALB, NLB, REST or HTTP API; AWS Load Balancer Controller annotations; and the CloudFront trigger event and function type. Several items are Select TWO, where each correct option satisfies a different requirement in the stem.
- Existing Kubernetes tooling plus no control plane to run means Amazon EKS; no Kubernetes skills and no servers means Amazon ECS on Fargate.
- One task role per task definition gives per-service least privilege; the task execution role is only for pulling images, secrets and logs.
- Fargate cannot run GPUs, DaemonSets or privileged containers; add EC2 capacity for them. Put a capacity provider's base on regular FARGATE, because Fargate Spot never falls back.
- Fargate Spot sends SIGTERM; catch it and raise stopTimeout (default 30 seconds, maximum 120) so work can finish or checkpoint.
- Service Connect is for ECS-only meshes and needs client redeployments to see new endpoints; VPC Lattice covers mixed compute, many accounts and overlapping CIDRs, with IAM auth policies that need SigV4-signed requests.
- ECR enhanced scanning (Amazon Inspector) adds language packages and continuous rescans; continuous filters win over scan-on-push filters, and unmatched repositories are not scanned.
- Reserved concurrency guarantees and caps; provisioned concurrency removes cold starts on a version or alias; SQS consumers are capped with event-source maximum concurrency.
- Target-track a metric that falls as capacity grows: ALBRequestCountPerTarget or backlog per task, not total RequestCount or raw queue depth; HPA needs resource requests.
- NLB for non-HTTP protocols, static IPs and PrivateLink; ALB for Layer 7 routing and gRPC; REST API for usage plans, keys and WAF; HTTP API for cheaper JWT-authorized APIs.
- CloudFront Functions with KeyValueStore for light viewer-side logic; Lambda@Edge for network calls, body access and origin events; keep cache keys to what changes the response.
Frequently asked questions
When should I choose Amazon EKS over Amazon ECS?
Choose Amazon EKS when the organization already relies on Kubernetes manifests, Helm charts, GitOps tools or custom operators, or needs Kubernetes portability, and wants AWS to run the control plane. Choose Amazon ECS, usually on AWS Fargate, when the team has no Kubernetes investment and wants the least to learn and operate.
What can't AWS Fargate run?
AWS Fargate cannot run GPU workloads, privileged containers or Kubernetes DaemonSets, because each task or pod runs in its own isolated environment with no node you control. Those workloads need EC2 capacity, such as EKS managed node groups or ECS Auto Scaling group capacity providers, which can run alongside Fargate.
What replaces AWS App Mesh?
AWS App Mesh reached end of support on 30 September 2026. AWS recommends Amazon ECS Service Connect for service-to-service communication between ECS services, and Amazon VPC Lattice for traffic that spans VPCs, accounts or compute types such as EC2, EKS and Lambda.
Why does Amazon VPC Lattice return HTTP 403 when the network path works?
An HTTP 403 from VPC Lattice means an auth policy denied the request. With the AWS_IAM auth type, Lattice identifies the caller only if the request is signed with SigV4 or SigV4A for the vpc-lattice-svcs service; an unsigned request is anonymous, so policies that allow only specific roles or organization members deny it. Both the service network and the service policy must allow the caller.
What is the difference between ECR basic and enhanced scanning?
Amazon ECR basic scanning checks operating system packages, on push or manually. Enhanced scanning uses Amazon Inspector to check operating system and programming-language packages, can rescan continuously when new vulnerabilities are published, and can be managed across an organization from a delegated administrator account. The scan type applies to the whole registry.
Should I use reserved or provisioned concurrency for a Lambda function?
Use reserved concurrency, which is free, to guarantee or cap a function's share of the account's concurrency. Use provisioned concurrency, which is billed, only to remove cold starts; it is set on a version or alias and can be scheduled or target-tracked with Application Auto Scaling. For an SQS-triggered function, cap scaling with maximum concurrency on the event source mapping.
When does an NLB need to sit in front of an ALB?
Put a Network Load Balancer in front of an Application Load Balancer when you need something only an NLB offers, such as an AWS PrivateLink endpoint service or static IP addresses, together with Layer 7 features only an ALB offers, such as path-based routing. The NLB registers the ALB as an ALB-type target group.
Should I use CloudFront Functions or Lambda@Edge?
Use CloudFront Functions for short JavaScript logic on viewer request or viewer response events, such as rewrites, redirects and header changes, at the lowest latency and cost, with CloudFront KeyValueStore for data that changes. Use Lambda@Edge when the logic needs network calls, the request body, more compute time or origin request and origin response events.
Source
This lesson covers the "Architecture Design and Implementation Built for the Cloud" domain of the official SAP-C03 exam guide. Vendors revise their guides — check the source for the current version.
- AWS Certified Solutions Architect – Professional (SAP-C03) exam guide — Amazon Web Services
Sign up free to mark lessons complete, bookmark topics and track your exam readiness.