ESEN

← Fine print by exam

Amazon Web Services · Associate

SAA-C03 · AWS Certified Solutions Architect - Associate (SAA-C03)

AWS Certified Solutions Architect - Associate

Scale-to-zero async worker with dead-letter

Reliability● verified 34 days ago◌ no external reviewer

The queue's visibility timeout must be at least 6 times the Lambda timeout

If the function takes longer than the visibility timeout, the message becomes visible again and another invocation picks it up while the first is still processing: guaranteed duplicates. AWS recommends a visibility timeout ≥ 6× the function timeout. The module computes and validates it.

⚑ Report outdated

See it in the pattern →

Reliability● verified 34 days ago◌ no external reviewer

In Standard queues, the message expires in the DLQ based on when it entered the original queue

When moving a message to the DLQ, SQS keeps the original enqueue timestamp (in FIFO it resets). If the DLQ has the same retention as the source queue, messages can vanish from the DLQ almost immediately. Set the DLQ retention longer than the source (the module uses the maximum, 14 days).

⚑ Report outdated

See it in the pattern →

Operations● verified 34 days ago◌ no external reviewer

Limit the event source mapping's concurrency, not just the function's

scaling_config.maximum_concurrency limits how many concurrent instances of the function the queue can invoke. It's an event source mapping setting, independent of the function's reserved concurrency and free of charge, and it keeps one queue from using all of the reserved concurrency or the account's concurrency quota. Note: the reserved concurrency must be greater than or equal to the sum of the maximums of all the function's event sources; otherwise Lambda might throttle your messages.

⚑ Report outdated

See it in the pattern →

Secretless CI/CD deployments (OIDC federation)

Security● verified 34 days ago◌ no external reviewer

IAM requires a sub condition, but accepts one that still leaves the door open

GitHub's issuer is the same for every organization: without scoping sub, any GitHub repository could assume your role. That's why IAM rejects creating or updating a trust policy for that provider when the sub (or job_workflow_ref) condition is missing or is just a wildcard. But "repo:*" or "repo:my-org/*" pass validation. The real boundary is yours to set: this module uses StringEquals with one sub per environment.

⚑ Report outdated

See it in the pattern →

Reliability● verified 34 days ago◌ no external reviewer

The session lasts 1 hour by default, and role chaining caps it at 1 hour regardless

AssumeRoleWithWebIdentity grants 3600 s by default; you can request up to the role's MaxSessionDuration (12 h max), and asking for more makes the call fail. If you assume another role from it (role chaining, common in multi-account), the session is capped at 1 hour. A long apply that runs past the limit fails mid-way with a half-written state.

⚑ Report outdated

See it in the pattern →

Hybrid private DNS (on-premises ↔ cloud)

Cost● verified 34 days ago◌ no external reviewer

Each endpoint IP is an ENI billed hourly, and the minimum is two per endpoint

Route 53 Resolver charges per ENI per hour, plus queries, and each endpoint needs at least two IPs in different AZs. Inbound plus outbound is four ENIs billing around the clock even with zero queries. In GCP the inbound policy and forwarding zones have no hourly charge. With several accounts, centralize the endpoints in the hub and share the rules with RAM instead of repeating them.

⚑ Report outdated

See it in the pattern →

See it in the pattern →

Private object ingestion with expiration (TTL)

Cost● verified 34 days ago◌ no external reviewer

Expiration is asynchronous, but billing stops at the expiration date

S3 queues expirations and processes them asynchronously: anywhere from days to weeks can pass between the expiration date and the actual deletion. You're not charged for the expiration or for the storage time of an object that has already expired.

⚑ Report outdated

See it in the pattern →

Cost● verified 34 days ago◌ no external reviewer

On a versioned bucket, Expiration deletes nothing

With versioning on, the Expiration action only adds a delete marker and the version becomes noncurrent, which is still billed. You also need NoncurrentVersionExpiration (and to clean orphaned delete markers). This pattern leaves the bucket unversioned on purpose: the TTL is the desired behavior.

⚑ Report outdated

See it in the pattern →

See it in the pattern →

Security● verified 34 days ago◌ no external reviewer

Block Public Access and disabled ACLs are default on new buckets (but declare them anyway)

By default, Object Ownership is BucketOwnerEnforced and all ACLs are disabled. AWS announced that, starting in April 2023, S3 would enable Block Public Access and disable ACLs on all new buckets, with no change for existing ones. Still declare them in IaC: declaring the state prevents drift if someone edits them in the console.

⚑ Report outdated

See it in the pattern →

Networking● verified 34 days ago◌ no external reviewer

The Gateway Endpoint is free, but only works within the VPC and region

It's a route table entry with no hourly or per-GB charge, which is why it's the default for S3. But it's not reachable from on-premises (VPN/Direct Connect) or from another region. For those cases you need an Interface Endpoint, which is billed hourly per AZ and is the real equivalent of Azure Private Endpoint.

⚑ Report outdated

See it in the pattern →

IAM● verified 34 days ago◌ no external reviewer

A Deny on aws:SourceVpce locks you out too

An explicit Deny beats any Allow, including the admin's. If the policy denies all s3:* outside the endpoint, the console and the CI pipeline (outside the VPC) lose access, and you can end up unable to edit the bucket policy itself. This module limits the Deny to object operations and lets you exclude break-glass principals via aws:PrincipalArn.

⚑ Report outdated

See it in the pattern →

Zero Trust private web API with passwordless PostgreSQL

IAM● verified 34 days ago◌ no external reviewer

The IAM database user is created with SQL, and with rds_iam it stops accepting passwords

Enabling IAM auth on the instance doesn't create any user. You must run CREATE USER app; GRANT rds_iam TO app; plus table GRANTs. In PostgreSQL, for a user with rds_iam (including master) IAM auth takes precedence over the password: don't grant it to master if you need it as break-glass.

⚑ Report outdated

See it in the pattern →

Reliability● verified 34 days ago◌ no external reviewer

The IAM auth token lasts 15 minutes and is only used to open the connection

The token expires after 15 minutes and is used only to authenticate: it doesn't affect the session once established, but if you try to connect with an expired token, the connection is rejected.

⚑ Report outdated

See it in the pattern →

Cost● verified 34 days ago◌ no external reviewer

Fargate in a private subnet without NAT needs several paid VPC endpoints

To pull the image without internet egress, the task needs ECR (api and dkr) interface endpoints, plus the S3 gateway endpoint (where ECR stores layers). If it uses the awslogs log driver, it also needs the CloudWatch Logs interface endpoint. Each interface endpoint is billed hourly per AZ. The alternative (NAT Gateway) is also billed hourly and per GB.

⚑ Report outdated

See it in the pattern →

Security● verified 34 days ago◌ no external reviewer

HTTPS on an internal ALB still needs an SSL server certificate

To create an HTTPS listener you must deploy at least one SSL server certificate (from ACM or IAM). ACM cannot validate resources in a VPC private hosted zone or any other private domain, even if the ALB is internal. ACM does not validate domain ownership for imported certificates or for certificates signed by a private CA.

⚑ Report outdated

See it in the pattern →

Security● verified 34 days ago◌ no external reviewer

Let Secrets Manager manage the master user password

With manage_master_user_password = true, RDS generates the master password and stores it in Secrets Manager. The Terraform provider doesn't allow combining it with password, and RDS doesn't support it in some scenarios (for example Blue/Green deployments), so decide upfront.

⚑ Report outdated

See it in the pattern →