<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <id>https://cloud-rosetta-stone.vercel.app/en/changes/</id>
  <title>Letra Chica — What changed in the fine print</title>
  <link rel="self" href="https://cloud-rosetta-stone.vercel.app/en/feed.xml"/>
  <link href="https://cloud-rosetta-stone.vercel.app/en/changes/"/>
  <updated>2026-10-24T00:00:00Z</updated>
  <rights>CC BY-SA 4.0</rights>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#6d37065-centralized-audit-logging-aws-org-trail-validation-failures-dont-block</id>
    <title>[Fixed] [AWS] CloudTrail creates the organization trail in member accounts even if the bucket or key validation fails</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/centralized-audit-logging/all/#aws-org-trail-validation-failures-dont-block"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">CloudTrail creates the organization trail in member accounts even if a resource validation fails; the documentation gives an incorrect bucket policy and insufficient permissions to encrypt with a KMS key as examples. A successful apply doesn't prove there is delivery. Check get-trail-status: if there is a problem with the bucket, the LatestDeliveryError field shows the S3 error (it only appears for problems with the destination bucket, not for requests that time out). Fix it with the bucket policy, or by creating another bucket and calling update-trail.</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#6d37065-centralized-audit-logging-aws-org-bucket-policy-needs-org-statement</id>
    <title>[Fixed] [AWS] In the official example, an organization trail's bucket policy needs its own statement and the logs are accessible only to management</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/centralized-audit-logging/all/#aws-org-bucket-policy-needs-org-statement"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">&lt;ins&gt;Scope of the source: the official example is a bucket owned by the organization's management account; the documentation doesn't cover a bucket in another account (such as this module's log archive account), so test it in a non-production environment. &lt;/ins&gt;The bucket of an organization trail needs a policy that lets CloudTrail write the organization's logs: the official example has three statements (GetBucketAcl, PutObject on the management account prefix and PutObject on the AWSLogs/o-&amp;lt;organization id&amp;gt;/ prefix). The aws:SourceArn must be the ARN of a trail owned by the management account, using that account's ID. That policy doesn't give access to users in member accounts: by default, the organization's log files are accessible only to the management account. List explicitly who you want to grant read access to and don't assume member accounts can read.</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#6d37065-centralized-audit-logging-aws-opt-in-home-region</id>
    <title>[Fixed] [AWS] If a multi-Region trail's home Region is opt-in, only accounts that enabled that Region send activity</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/centralized-audit-logging/all/#aws-opt-in-home-region"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">If the organization trail is multi-Region and its home Region is an opt-in Region, member accounts don't send activity to the trail unless they opt into that Region; the documentation's example is Europe (Spain): only accounts that enabled it send their activity. Organization trails created in the console are multi-Region. Choose a Region that is enabled by default as the home Region, or verify that each account enabled the Region; if an account doesn't show up in the bucket, check this point.</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#6d37065-centralized-audit-logging-aws-misconfigured-trail-redelivery-charges</id>
    <title>[Fixed] [AWS] A misconfigured trail retries delivery for 30 days and those attempts are charged</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/centralized-audit-logging/all/#aws-misconfigured-trail-redelivery-charges"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">If the trail is misconfigured (for example, the bucket is unreachable), CloudTrail attempts to redeliver the log files to the bucket for 30 days, and those delivery attempts are subject to standard CloudTrail charges. To avoid charges on a misconfigured trail you need to delete it. Fix the bucket policy and the key policy before creating the trail (in Terraform, with a depends_on of the trail on both) and check get-trail-status afterwards.</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#004f543-preventive-guardrails-aws-test-in-an-ou-before-the-root</id>
    <title>[Fixed] [AWS] Test SCPs and RCPs in an OU or test accounts before moving up to the root; removing FullAWSAccess without a replacement cuts all actions</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/preventive-guardrails/all/#aws-test-in-an-ou-before-the-root"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">AWS strongly recommends not attaching an SCP to the root without testing its impact on the accounts: create an OU and move accounts into it one at a time, or in small groups, so you don't lock anyone out of key services. For RCPs it recommends starting with test accounts, moving up through the OUs and reviewing CloudTrail for Access Denied errors. Also, don't remove the FullAWSAccess policy without modifying it or replacing it with another that has the allowed actions: otherwise all AWS actions from member accounts fail. For an S3 policy, after each change check the effective policy of representative accounts with DescribeEffectivePolicy.</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#ff55dad-protected-origin-cdn-azure-private-link-origin-needs-anonymous-or-sas</id>
    <title>[Fixed] [Azure] With Private Link to storage, a container without anonymous access requires authorized requests, for example with SAS</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/protected-origin-cdn/all/#azure-private-link-origin-needs-anonymous-or-sas"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">Front Door's guide for a Storage origin says that if the blob or container doesn't permit anonymous access, requests against it must be authorized, for example with shared access signatures, and lists as a common mistake not using SAS against an account that doesn't allow anonymous access. According to the same guide, public internet access to the account is disabled once the private endpoint is enabled. &lt;del&gt;So you have to choose:&lt;/del&gt;&lt;ins&gt;If&lt;/ins&gt; &lt;del&gt;a&lt;/del&gt;&lt;ins&gt;the&lt;/ins&gt; container &lt;del&gt;with anonymous&lt;/del&gt;&lt;ins&gt;doesn't&lt;/ins&gt; &lt;del&gt;blob&lt;/del&gt;&lt;ins&gt;permit&lt;/ins&gt; &lt;del&gt;read,&lt;/del&gt;&lt;ins&gt;anonymous&lt;/ins&gt; &lt;del&gt;reachable&lt;/del&gt;&lt;ins&gt;access,&lt;/ins&gt; &lt;del&gt;only&lt;/del&gt;&lt;ins&gt;don't&lt;/ins&gt; &lt;del&gt;through&lt;/del&gt;&lt;ins&gt;connect&lt;/ins&gt; the &lt;del&gt;private endpoint, or SAS on requests. Decide explicitly and&lt;/del&gt;&lt;ins&gt;origin&lt;/ins&gt; &lt;del&gt;don't&lt;/del&gt;&lt;ins&gt;without&lt;/ins&gt; &lt;del&gt;leave&lt;/del&gt;&lt;ins&gt;authorizing&lt;/ins&gt; the &lt;del&gt;container private without SAS.&lt;/del&gt;&lt;ins&gt;requests.&lt;/ins&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#ff55dad-protected-origin-cdn-gcp-public-bucket-defeats-signed-urls</id>
    <title>[Fixed] [GCP] If the bucket stays public, signed URLs don't protect the content</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/protected-origin-cdn/all/#gcp-public-bucket-defeats-signed-urls"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">For signed URLs to protect the content, the origin must not grant public access: the documentation says to remove the allUsers (and allAuthenticatedUsers, if applicable) read permissions from the bucket, which is commonly left public during testing. Even without public access, anyone who already has permission on the bucket, such as OWNER, can access Cloud Storage without a signed URL. And a signed URL gives time-limited access to anyone who holds it, whether or not they have a Google Account. &lt;ins&gt;The same page warns that Cloud CDN doesn't block requests without a Signature query parameter or Cloud-CDN-Cookie cookie (it rejects those with invalid parameters) and that the origin must validate signatures and accept or reject unsigned requests. &lt;/ins&gt;Check that the bucket has neither allUsers nor allAuthenticatedUsers before calling the entry closed, and sign only HTTPS URLs.</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#3a7ea88-centralized-audit-logging-azure-activity-log-default-retention</id>
    <title>[New] [Azure] The Activity Log is deleted after 90 days; to keep it longer you have to export it with a diagnostic setting</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/centralized-audit-logging/all/#azure-activity-log-default-retention"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">Azure Monitor collects the Activity Log with no configuration, but it retains events for 90 days and then deletes them. To keep them longer you have to create a diagnostic setting that sends them to another destination (a Log Analytics workspace, a storage account or Event Hubs). It matters for one specific reason: the Activity Log is the only place that stores who created a resource. If you were already exporting with log profiles (the legacy method), disable that configuration when you create the diagnostic setting.&lt;p&gt;&lt;small&gt;feat(content): patrón borrador centralized-audit-logging con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#3a7ea88-centralized-audit-logging-azure-management-group-setting-misses-subscription-events</id>
    <title>[New] [Azure] A diagnostic setting on the management group doesn't capture every subscription-level event</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/centralized-audit-logging/all/#azure-management-group-setting-misses-subscription-events"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">A management group diagnostic setting exports the events of that group and of the groups below it, but not every subscription-level event: Azure Resource Manager writes a hierarchy property that isn't required, and resource providers outside ARM don't populate it. Subscription-level events without that property don't reach a management group setting, not even the root one. Also create a diagnostic setting per subscription with all categories. If both export to the same destination you receive duplicate events: combine them with a query that uses a hash of all fields.&lt;p&gt;&lt;small&gt;feat(content): patrón borrador centralized-audit-logging con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#3a7ea88-centralized-audit-logging-azure-destination-in-another-subscription-needs-rbac</id>
    <title>[New] [Azure] The destination can be in another subscription if whoever creates the setting has RBAC access to both</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/centralized-audit-logging/all/#azure-destination-in-another-subscription-needs-rbac"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">A diagnostic setting's destination doesn't have to be in the same subscription as the resource sending the logs, as long as whoever configures the setting has the appropriate RBAC access to both subscriptions. For a destination in another Microsoft Entra tenant, the documentation says to use Azure Lighthouse. The destination must also exist before you create the setting. Plan the permissions of the identity that applies the Terraform on the central subscription and on every source subscription.&lt;p&gt;&lt;small&gt;feat(content): patrón borrador centralized-audit-logging con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#3a7ea88-centralized-audit-logging-azure-storage-destination-requirements</id>
    <title>[New] [Azure] A destination storage account with virtual networks must allow trusted services and can't be Premium</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/centralized-audit-logging/all/#azure-storage-destination-requirements"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">Diagnostic settings can't access a storage account with virtual networks enabled, unless you enable &amp;quot;Allow trusted Microsoft services to bypass this firewall&amp;quot; on the account. Premium storage accounts aren't supported as a destination; Standard ones are. To archive the Activity Log (audit, static analysis or backup), the diagnostic settings documentation recommends sending data to immutable storage to prevent modification, with an immutability policy configured on the account.&lt;p&gt;&lt;small&gt;feat(content): patrón borrador centralized-audit-logging con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#3a7ea88-centralized-audit-logging-azure-activity-log-ingestion-cost</id>
    <title>[New] [Azure] Exporting the Activity Log to Log Analytics has no ingestion charge; retention is charged only past 90 days</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/centralized-audit-logging/all/#azure-activity-log-ingestion-cost"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">There are no data ingestion charges for activity logs in a Log Analytics workspace, and retention charges apply only to the period beyond the default 90 days. The rule is about the Activity Log: don't extend it to other data you send to the same workspace. As an alternative, the diagnostic settings documentation says a storage account might be less expensive than other options and can be kept indefinitely.&lt;p&gt;&lt;small&gt;feat(content): patrón borrador centralized-audit-logging con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#3a7ea88-centralized-audit-logging-aws-org-trail-validation-failures-dont-block</id>
    <title>[New] [AWS] CloudTrail creates the organization trail in member accounts even if the bucket or key validation fails</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/centralized-audit-logging/all/#aws-org-trail-validation-failures-dont-block"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">CloudTrail creates the organization trail in member accounts even if a resource validation fails; the documentation gives an incorrect bucket policy and insufficient permissions to encrypt with a KMS key as examples. A successful apply doesn't prove there is delivery. Check get-trail-status: if there is a problem with the bucket, the LatestDeliveryError field shows the S3 error (it only appears for problems with the destination bucket, not for requests that time out). Fix it with the bucket policy, or by creating another bucket and calling update-trail.&lt;p&gt;&lt;small&gt;feat(content): patrón borrador centralized-audit-logging con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#3a7ea88-centralized-audit-logging-aws-org-bucket-policy-needs-org-statement</id>
    <title>[New] [AWS] An organization trail's bucket policy needs its own statement, and by default only management reads the logs</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/centralized-audit-logging/all/#aws-org-bucket-policy-needs-org-statement"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">The bucket of an organization trail needs a policy that lets CloudTrail write the organization's logs: the official example has three statements (GetBucketAcl, PutObject on the management account prefix and PutObject on the AWSLogs/o-&amp;lt;organization id&amp;gt;/ prefix). The aws:SourceArn must be the ARN of a trail owned by the management account, using that account's ID. That policy doesn't give access to users in member accounts: by default, the organization's log files are accessible only to the management account. List explicitly who you want to grant read access to and don't assume member accounts can read.&lt;p&gt;&lt;small&gt;feat(content): patrón borrador centralized-audit-logging con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#3a7ea88-centralized-audit-logging-aws-opt-in-home-region</id>
    <title>[New] [AWS] If a multi-Region trail's home Region is opt-in, only accounts that enabled that Region send activity</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/centralized-audit-logging/all/#aws-opt-in-home-region"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">If the organization trail is multi-Region and its home Region is an opt-in Region, member accounts don't send activity to the trail unless they opt into that Region; the documentation's example is Europe (Spain): only accounts that enabled it send their activity. Organization trails created in the console are multi-Region. Choose a Region that is enabled by default as the home Region, or verify that each account enabled the Region; if an account doesn't show up in the bucket, check this point.&lt;p&gt;&lt;small&gt;feat(content): patrón borrador centralized-audit-logging con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#3a7ea88-centralized-audit-logging-aws-kms-decrypt-before-enabling</id>
    <title>[New] [AWS] Logs encrypted with KMS can only be read by whoever has kms:Decrypt: grant it before attaching the key to the trail</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/centralized-audit-logging/all/#aws-kms-decrypt-before-enabling"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">Users who have encrypt permissions but no decrypt permissions can't read the encrypted logs; the documentation says to give decrypt permissions to all users who need them before you add the key to the trail configuration. Also, if encryption is enabled on a trail and the KMS key is disabled or its policy isn't correctly configured for CloudTrail, CloudTrail can't deliver logs. The key policy needs GenerateDataKey* for CloudTrail with aws:SourceArn, kms:DescribeKey, decryption for the service, and kms:Decrypt for readers with the aws:cloudtrail:arn encryption context condition.&lt;p&gt;&lt;small&gt;feat(content): patrón borrador centralized-audit-logging con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#3a7ea88-centralized-audit-logging-aws-log-file-validation-is-not-automatic</id>
    <title>[New] [AWS] Enabling integrity validation delivers digest files, but validates nothing</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/centralized-audit-logging/all/#aws-log-file-validation-is-not-automatic"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">With integrity validation enabled, CloudTrail creates a hash for every log file it delivers and, every hour, delivers a signed digest file to the bucket, in a folder separate from the log files. Enabling it doesn't validate the integrity of the files: that is done afterwards, with the AWS CLI or a tool of your own. The CLI validates files in the location where CloudTrail delivered them; if you move the logs elsewhere, you need your own tool. Define who runs the validation and how often.&lt;p&gt;&lt;small&gt;feat(content): patrón borrador centralized-audit-logging con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#3a7ea88-centralized-audit-logging-aws-misconfigured-trail-redelivery-charges</id>
    <title>[New] [AWS] A misconfigured trail retries delivery for 30 days and those attempts are charged</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/centralized-audit-logging/all/#aws-misconfigured-trail-redelivery-charges"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">If the trail is misconfigured (for example, the bucket is unreachable), CloudTrail attempts to redeliver the log files to the bucket for 30 days, and those delivery attempts are subject to standard CloudTrail charges. To avoid charges on a misconfigured trail you need to delete it. Fix the bucket policy and the key policy before creating the trail (in Terraform, with a depends_on of the trail on both) and check get-trail-status afterwards.&lt;p&gt;&lt;small&gt;feat(content): patrón borrador centralized-audit-logging con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#3a7ea88-centralized-audit-logging-gcp-include-children-defaults-to-false</id>
    <title>[New] [GCP] An organization or folder sink with includeChildren set to false only exports the parent resource's own logs</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/centralized-audit-logging/all/#gcp-include-children-defaults-to-false"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">includeChildren applies only to sinks owned by organizations and folders, and its default is false: in that case only the logs owned by the sink's parent resource are available for export, not those of the projects it contains. With true, the logs of all contained projects, folders and billing accounts are also available, and whether an entry is exported depends on the sink's filter. Set it to true explicitly (in gcloud, --include-children) and, if you want to limit the children, filter on the project part of the log name.&lt;p&gt;&lt;small&gt;feat(content): patrón borrador centralized-audit-logging con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#3a7ea88-centralized-audit-logging-gcp-writer-identity-needs-destination-access</id>
    <title>[New] [GCP] The sink doesn't export until its writer identity has write permission on the destination</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/centralized-audit-logging/all/#gcp-writer-identity-needs-destination-access"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">The sink's writerIdentity must have permission to write to the destination or the entries aren't exported. Logging creates and manages that service account, and you grant the destination permissions yourself (they aren't needed if the destination is a log bucket in the same project as the sink; here it's in another project, so they are). For all destinations Logs Writer is required (roles/logging.logWriter, with the logging.logEntries.route permission) and, for a log bucket, Logs Bucket Writer (roles/logging.bucketWriter). To grant them you need Owner on the project that contains the destination. Logging uses the same service account for all sinks of one resource (project, folder, organization or billing account).&lt;p&gt;&lt;small&gt;feat(content): patrón borrador centralized-audit-logging con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#3a7ea88-centralized-audit-logging-gcp-admin-activity-not-stored-in-destination-project</id>
    <title>[New] [GCP] If the destination is a project, Admin Activity and System Event logs aren't stored in it without a sink of its own</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/centralized-audit-logging/all/#gcp-admin-activity-not-stored-in-destination-project"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">Admin Activity and System Event audit logs are stored in the _Required bucket of the project that generated them, and you can't configure, exclude or disable them. If you route them to another project, they don't pass through the destination project's _Default or _Required sinks and, consequently, aren't stored there. To store them you have to create a sink in the destination project or update its _Default sink. A log bucket as destination is different: it isn't a destination that reroutes entries, so the sinks of the project that hosts it don't reprocess them. The documentation recommends a project as the destination of an aggregated sink; this pattern points straight at the bucket.&lt;p&gt;&lt;small&gt;feat(content): patrón borrador centralized-audit-logging con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#3a7ea88-centralized-audit-logging-gcp-intercepting-sink-hides-logs-from-child-sinks</id>
    <title>[New] [GCP] An aggregated sink that intercepts takes logs away from the child projects' sinks</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/centralized-audit-logging/all/#gcp-intercepting-sink-hides-logs-from-child-sinks"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">An aggregated sink that intercepts prevents entries from reaching the sinks in child resources, except the _Required ones where they originate; one that doesn't intercept doesn't change how entries are routed to other sinks. A sink that intercepts requires includeChildren set to true and a project as destination. If a team needs independent control over how certain logs are routed, verify that the intercepting sink doesn't take them. The aggregated sinks guide recommends testing the configuration first with a non-intercepting one and adding contact information to the description of the intercepting one.&lt;p&gt;&lt;small&gt;feat(content): patrón borrador centralized-audit-logging con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#3a7ea88-centralized-audit-logging-gcp-vpc-sc-ingress-for-sink-identity</id>
    <title>[New] [GCP] A destination inside a VPC Service Controls perimeter requires an ingress rule for the sink's identity</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/centralized-audit-logging/all/#gcp-vpc-sc-ingress-for-sink-identity"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">Routing entries to a resource protected by a service perimeter requires adding an ingress rule to the perimeter that allows access from the sink's service account. If an aggregated sink routes to a Cloud Storage bucket inside a perimeter, the rule's identity type must be ANY_IDENTITY: you can't use ANY_SERVICE_ACCOUNT or ANY_USER_ACCOUNT for that destination. Non-aggregated sinks don't need that rule. If the central project is going to be in a perimeter, add the rule before creating the sink.&lt;p&gt;&lt;small&gt;feat(content): patrón borrador centralized-audit-logging con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#3a7ea88-centralized-audit-logging-gcp-data-access-logs-enabled-at-the-source</id>
    <title>[New] [GCP] Data Access logs are enabled at the source, at organization or folder level; the sink only routes what exists</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/centralized-audit-logging/all/#gcp-data-access-logs-enabled-at-the-source"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">Except for BigQuery, Data Access audit logs are disabled by default and you must enable them explicitly; they are written to the project whose data is accessed. Enabling them in an organization applies to all existing and new projects and folders, and in a project you can't disable a log enabled in its parent organization. Enabling them might result in additional log usage charges. The aggregated sink doesn't change that configuration: it filters and routes the entries that exist. The data-access-logs-off-by-default gotcha of the app-secrets pattern covers the Secret Manager case.&lt;p&gt;&lt;small&gt;feat(content): patrón borrador centralized-audit-logging con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#3a7ea88-centralized-audit-logging-gcp-bucket-retention-and-lock</id>
    <title>[New] [GCP] A bucket's retention in an organization or folder can't be extended, and locking a bucket is irreversible</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/centralized-audit-logging/all/#gcp-bucket-retention-and-lock"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">You can't extend the retention period of a log bucket that is in a folder or organization; the documented alternative is a sink that routes to a bucket in a project and configuring retention there, as this pattern does. If you extend retention, the rules apply going forward and not retroactively, and logs can't be recovered after the applicable retention period ends. Locking a bucket is irreversible: it also locks the bucket's retention policy and you can't delete the bucket until every entry has fulfilled the period. To prevent accidentally deleting a project that contains a locked bucket, add a lien to it. The console doesn't support locking: use gcloud (--locked) or the API. You can't change the bucket's region after creating it.&lt;p&gt;&lt;small&gt;feat(content): patrón borrador centralized-audit-logging con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#e42985e-preventive-guardrails-azure-deny-blocks-changes-on-noncompliant-accounts</id>
    <title>[New] [Azure] With deny, an existing account that doesn't comply can't take configuration changes until it's fixed</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/preventive-guardrails/all/#azure-deny-blocks-changes-on-noncompliant-accounts"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">The deny effect stops the request to create or update a resource that matches the rule: it comes back as a 403 (Forbidden) before reaching the resource provider. When existing resources are evaluated, those that match the rule are marked non-compliant. The Azure Storage documentation adds the consequence: with this policy assigned, nobody can make configuration changes to an existing account whose anonymous access doesn't comply, until allowBlobPublicAccess is set to false. Before assigning with deny, inventory the non-compliant accounts and fix them, so a team's first configuration change doesn't fail with a 403.&lt;p&gt;&lt;small&gt;feat(content): patrón preventive-guardrails (borrador) con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#e42985e-preventive-guardrails-azure-audit-does-not-block</id>
    <title>[New] [Azure] With the audit effect, the account with anonymous access is created anyway</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/preventive-guardrails/all/#azure-audit-does-not-block"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">The audit effect creates a warning when a resource isn't compliant, but doesn't stop the request. If the assignment stays on audit, the storage account is created with anonymous access and only shows up as non-compliant in the compliance report, which per the documentation can take several minutes to become available after the assignment is created. Use audit to measure and deny to prevent. The module takes the effect from a parameter (effect) and denies by default.&lt;p&gt;&lt;small&gt;feat(content): patrón preventive-guardrails (borrador) con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#e42985e-preventive-guardrails-azure-donotenforce-evaluates-without-blocking</id>
    <title>[New] [Azure] In DoNotEnforce mode the assignment evaluates compliance without applying the effect</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/preventive-guardrails/all/#azure-donotenforce-evaluates-without-blocking"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">enforcementMode controls the outcome of a policy on resources without initiating the effect. With DoNotEnforce the effect isn't applied when a resource is created or updated and no Activity log entries are written; the documentation recommends it for testing a new assignment, reviewing the compliance impact or validating the logic before enforcing. Consequence: while that mode lasts, requests that violate the rule aren't rejected, and there are no denials in the Activity log to review: the impact is read in the compliance report. Assign first with enforce = false, review which accounts come out non-compliant, and switch to enforce = true once the result is the expected one.&lt;p&gt;&lt;small&gt;feat(content): patrón preventive-guardrails (borrador) con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#e42985e-preventive-guardrails-azure-exemption-expiry-is-optional</id>
    <title>[New] [Azure] An Azure Policy exemption only expires if you set expiresOn, and once expired it stays as a record</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/preventive-guardrails/all/#azure-exemption-expiry-is-optional"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">expiresOn is an optional property that sets when the resource or hierarchy is no longer exempt. When the date arrives the exemption isn't deleted: it's kept as a record, but it's no longer honored. The metadata accepts custom fields (the documentation gives requestedBy, approvedBy, approvedOn and ticketRef as examples) and, to create one, you need the exempt/Action verb on the assignment in addition to Microsoft.Authorization/policyExemptions/write. The documentation recommends exemptions for time-bound scenarios where the resource should still be tracked; notScopes, by contrast, excludes the scope from evaluation. Require expiresOn and metadata on who requested and approved it (the module asks for them), reserve exempt/Action for the approver, and review exemptions regularly, deleting expired ones.&lt;p&gt;&lt;small&gt;feat(content): patrón preventive-guardrails (borrador) con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#e42985e-preventive-guardrails-aws-scp-skips-management-account-and-slr</id>
    <title>[New] [AWS] SCPs don't reach the management account or service-linked roles</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/preventive-guardrails/all/#aws-scp-skips-management-account-and-slr"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">SCPs affect only member accounts: they don't restrict users or roles in the management account and they don't affect any service-linked role. An action performed with the permissions of a service-linked role can't be restricted with an SCP either. Consequence: a resource created from the management account falls outside the guardrail. Keep workloads out of the management account. The declarative policies documentation adds that, unlike SCPs and RCPs, they govern service-linked roles; if that gap matters to you, consider a declarative policy for that configuration.&lt;p&gt;&lt;small&gt;feat(content): patrón preventive-guardrails (borrador) con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#e42985e-preventive-guardrails-aws-scp-does-not-cover-external-principals</id>
    <title>[New] [AWS] An SCP doesn't stop external principals accessing an organization's bucket; that's what RCPs are for</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/preventive-guardrails/all/#aws-scp-does-not-cover-external-principals"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">SCPs restrict users and roles of the organization's accounts and don't affect those from accounts outside it. In the documentation's example, the bucket policy of account A's bucket (inside the organization) grants access to users in account B (external): A's SCP doesn't apply to those users. An RCP does apply to A's bucket even when account B accesses it. The documentation says to use an SCP to limit principals in your accounts and an RCP to restrict external principals accessing resources in your accounts, and Amazon S3 is among the services that support RCPs. RCPs don't affect resources in the management account either. For exposure to outside the organization, an SCP alone isn't enough.&lt;p&gt;&lt;small&gt;feat(content): patrón preventive-guardrails (borrador) con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#e42985e-preventive-guardrails-aws-s3-policy-scope-is-the-exception</id>
    <title>[New] [AWS] An S3 policy applies to all S3 resources in the accounts it reaches: the exception is handled by OU or account</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/preventive-guardrails/all/#aws-s3-policy-scope-is-the-exception"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">An S3 policy defines the configuration of all Amazon S3 resources in the accounts within its scope and overrides the account-level configuration. With @@assign set to &amp;quot;all&amp;quot;, the four Block Public Access settings are enabled together (BlockPublicAcls, BlockPublicPolicy, IgnorePublicAcls, RestrictPublicBuckets); the documentation describes only the values &amp;quot;all&amp;quot; and &amp;quot;none&amp;quot;. The best-practices guide says that, if some accounts need public buckets for a legitimate reason (for example, a static website), you should use OU-level or account-level attachments to exclude them, or consolidate that need in dedicated accounts. And if you want to manage Block Public Access at the account level, you must disable the S3 policy type at the organization. Design the OUs so an exception is an OU or account of its own, not a loose bucket in a general account.&lt;p&gt;&lt;small&gt;feat(content): patrón preventive-guardrails (borrador) con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#e42985e-preventive-guardrails-aws-s3-policy-ignores-existing-public-access-does-not-remove-it</id>
    <title>[New] [AWS] With the S3 policy, public access that already existed is ignored; it isn't removed</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/preventive-guardrails/all/#aws-s3-policy-ignores-existing-public-access-does-not-remove-it"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">BlockPublicAcls and BlockPublicPolicy don't change permissions that already grant public access to S3 resources. IgnorePublicAcls ignores all ACLs that grant public access and RestrictPublicBuckets ignores public and cross-account access for buckets or access points with policies that grant public access. If the S3 policy is detached, accounts revert to their previous account-level configuration, so what is ignored today can take effect again depending on how that configuration was. Inventory and fix public permissions instead of relying only on their being ignored.&lt;p&gt;&lt;small&gt;feat(content): patrón preventive-guardrails (borrador) con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#e42985e-preventive-guardrails-aws-test-in-an-ou-before-the-root</id>
    <title>[New] [AWS] Test the policy in an OU before attaching it to the root; removing FullAWSAccess without a replacement cuts all actions</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/preventive-guardrails/all/#aws-test-in-an-ou-before-the-root"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">AWS strongly recommends not attaching an SCP to the root without testing its impact on the accounts: create an OU and move accounts into it one at a time, or in small groups, so you don't lock anyone out of key services. For RCPs it recommends starting with test accounts, moving up through the OUs and reviewing CloudTrail for Access Denied errors. Also, don't remove the FullAWSAccess policy without modifying it or replacing it with another that has the allowed actions: otherwise all AWS actions from member accounts fail. For an S3 policy, after each change check the effective policy of representative accounts with DescribeEffectivePolicy.&lt;p&gt;&lt;small&gt;feat(content): patrón preventive-guardrails (borrador) con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#e42985e-preventive-guardrails-aws-disabling-scp-type-detaches-everything</id>
    <title>[New] [AWS] Disabling the SCP policy type in a root detaches all SCPs, and the attachments are lost</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/preventive-guardrails/all/#aws-disabling-scp-type-detaches-everything"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">When you disable the SCP policy type in a root, all SCPs are automatically detached from all Organizations entities (OUs, organization and accounts). If you re-enable them, the root reverts to only the FullAWSAccess policy that is attached by default to all entities; the earlier attachments are lost and aren't automatically recoverable, although you can reattach them manually. Consequence: SCP-based guardrails stop applying all at once. Restrict who can disable policy types and, after re-enabling the type, verify the attachments.&lt;p&gt;&lt;small&gt;feat(content): patrón preventive-guardrails (borrador) con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#e42985e-preventive-guardrails-gcp-existing-public-grants-are-overridden-not-removed</id>
    <title>[New] [GCP] With the constraint enforced, allUsers permissions that already existed stay in place, overridden</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/preventive-guardrails/all/#gcp-existing-public-grants-are-overridden-not-removed"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">With public access prevention applied, requests authorized with allUsers and allAuthenticatedUsers fail with a 401 or 403, and existing IAM policies and ACLs that grant access to those principals remain in place but are overridden. If prevention is later turned off for the project, folder or organization, those existing permissions take effect and the data becomes accessible to the public. In the other direction, applying it to existing resources can break an application that depends on allUsers. Before applying it, inventory the public resources (Cloud Asset Inventory shows the policies of all buckets in a project, folder or organization; usage logs help see who reads them) and clean up the public bindings instead of leaving them overridden.&lt;p&gt;&lt;small&gt;feat(content): patrón preventive-guardrails (borrador) con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#e42985e-preventive-guardrails-gcp-exception-is-per-project-and-bucket-setting-wins</id>
    <title>[New] [GCP] The exception to the constraint is made per project, and a bucket with the enforced setting stays protected</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/preventive-guardrails/all/#gcp-exception-is-per-project-and-bucket-setting-wins"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">To make exceptions in an organization that enforces public access prevention (for example, for a static website hosting bucket), the documentation says to disable it on the project that contains the bucket. A bucket can only be in the enforced or inherited state: if it's inherited, prevention is determined by the project's constraint, and if it's false on the project it doesn't apply to that bucket. Buckets with the enforced setting keep prevention even if you disable it on the project, folder or organization. Consequence: the exception reaches all inherited buckets in the project, not just the one that motivated it, and it doesn't work for an enforced bucket. Put legitimate public buckets in a project of their own, with the bucket set to inherited, and review that project as a project-wide exception.&lt;p&gt;&lt;small&gt;feat(content): patrón preventive-guardrails (borrador) con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#e42985e-preventive-guardrails-gcp-no-dry-run-for-public-access-prevention</id>
    <title>[New] [GCP] The storage.publicAccessPrevention constraint isn't among those that support dry-run</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/preventive-guardrails/all/#gcp-no-dry-run-for-public-access-prevention"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">An organization policy in dry-run mode records violations in the audit logs without denying the actions. The documentation lists as the only constraints available for dry-run the custom ones, the managed ones and four legacy ones (Restrict service usage, Restrict endpoint usage, Restrict TLS versions and Restrict TLS cipher suites), and says that creating a dry-run policy with any other constraint results in an error. The constraints catalog lists storage.publicAccessPrevention among the legacy managed constraints, and it isn't in that list. So the impact can't be measured with dry-run: use the inventory of public resources and the usage logs that the public access prevention documentation recommends beforehand.&lt;p&gt;&lt;small&gt;feat(content): patrón preventive-guardrails (borrador) con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#e42985e-preventive-guardrails-gcp-enforcement-delay-and-signed-urls</id>
    <title>[New] [GCP] Prevention takes time to apply and doesn't affect signed URLs</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/preventive-guardrails/all/#gcp-enforcement-delay-and-signed-urls"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">The documentation says enforcement can take up to 10 minutes to take effect and that, once it begins, objects might still be publicly accessible through an internet cache for a time that depends on their Cache-Control (with the default max-age of 3600 seconds, that long). Signed URLs, which give time-limited access to anyone who uses them, aren't affected by public access prevention, and neither is private bucket access through Cloud Load Balancing and Cloud CDN. That documentation explains that access for these features is granted through scoped service account permissions. Don't count on an immediate effect, and control who can sign URLs by reviewing those permissions.&lt;p&gt;&lt;small&gt;feat(content): patrón preventive-guardrails (borrador) con Terraform validado&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#4b9b896-protected-origin-cdn-azure-premium-private-link-pending-approval</id>
    <title>[New] [Azure] Private Link to the origin is in Front Door Premium and the private endpoint connection must be approved</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/protected-origin-cdn/all/#azure-premium-private-link-pending-approval"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">The tier comparison table marks &amp;quot;Private Link connection to origin&amp;quot; under Front Door Premium and not under Standard. When you enable Private Link on an origin, Front Door creates a private endpoint from its managed regional private network and a pending request arrives at the origin: you must approve the connection before traffic can pass privately, using the portal, the CLI or PowerShell. After approval, the connection can take a few minutes to establish and, meanwhile, requests to the origin receive a Front Door error message. Plan the approval as a deployment step and don't expect content until the connection shows as established.&lt;p&gt;&lt;small&gt;feat(content): patrón protected-origin-cdn (borrador) con Terraform en las tres nubes&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#4b9b896-protected-origin-cdn-azure-private-link-origin-needs-anonymous-or-sas</id>
    <title>[New] [Azure] With Private Link to storage, a container without anonymous access requires authorized requests, for example with SAS</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/protected-origin-cdn/all/#azure-private-link-origin-needs-anonymous-or-sas"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">Front Door's guide for a Storage origin says that if the blob or container doesn't permit anonymous access, requests against it must be authorized, for example with shared access signatures, and lists as a common mistake not using SAS against an account that doesn't allow anonymous access. According to the same guide, public internet access to the account is disabled once the private endpoint is enabled. So you have to choose: a container with anonymous blob read, reachable only through the private endpoint, or SAS on requests. Decide explicitly and don't leave the container private without SAS.&lt;p&gt;&lt;small&gt;feat(content): patrón protected-origin-cdn (borrador) con Terraform en las tres nubes&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#4b9b896-protected-origin-cdn-azure-no-mixed-public-private-origin-group</id>
    <title>[New] [Azure] An origin group can't mix public origins and Private Link origins</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/protected-origin-cdn/all/#azure-no-mixed-public-private-origin-group"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">Front Door doesn't allow mixing public and private origins in the same origin group; the guide lists as a common mistake adding a Private Link origin to a group that already has public origins. If you enable Private Link on more than one public origin in the same group at once, the operation can fail with &amp;quot;Origin Group can only have origins with private links or origins without private links. They cannot have a mix of both&amp;quot;, because origins are updated one at a time. Keep public origins in one group and private ones in another, and if you migrate an existing group, enable Private Link one origin at a time: leave a single one, enable it and approve its connection, and only then add the next.&lt;p&gt;&lt;small&gt;feat(content): patrón protected-origin-cdn (borrador) con Terraform en las tres nubes&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#4b9b896-protected-origin-cdn-azure-premium-base-fee-for-private-link</id>
    <title>[New] [Azure] Private Link to the origin means the Premium tier, which has a higher base fee</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/protected-origin-cdn/all/#azure-premium-base-fee-for-private-link"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">Each Front Door profile incurs an hourly fee, billed for each hour or partial hour the profile is deployed, and the rate depends on the tier. Premium has a higher base fee and request processing fee. The documentation states you don't pay extra for Private Link traffic compared to an origin's public endpoint, nor for managed WAF rule sets in Premium. If the origin doesn't need Private Link, check what you actually use from the tier before choosing Premium.&lt;p&gt;&lt;small&gt;feat(content): patrón protected-origin-cdn (borrador) con Terraform en las tres nubes&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#4b9b896-protected-origin-cdn-aws-sourcearn-condition-scopes-the-origin</id>
    <title>[New] [AWS] CloudFront's access to the bucket is limited to your distribution with the AWS:SourceArn condition</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/protected-origin-cdn/all/#aws-sourcearn-condition-scopes-the-origin"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">With origin access control, the bucket policy grants permission to the cloudfront.amazonaws.com service principal. AWS says to use a Condition element so CloudFront can access the bucket only when the request is on behalf of the distribution that contains the S3 origin; the official example uses StringEquals on AWS:SourceArn with that distribution's ARN. The condition is what limits access to that distribution. The policy is added after creating the distribution and before adding the OAC to the origin. Also, with OAC on an S3 bucket, Object Ownership must be Bucket owner enforced (the default for new buckets), or Bucket owner preferred if you need ACLs. Include the condition in the bucket policy with your distribution's ARN.&lt;p&gt;&lt;small&gt;feat(content): patrón protected-origin-cdn (borrador) con Terraform en las tres nubes&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#4b9b896-protected-origin-cdn-aws-website-endpoint-cannot-use-oac</id>
    <title>[New] [AWS] A bucket configured as a website endpoint can't use OAC</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/protected-origin-cdn/all/#aws-website-endpoint-cannot-use-oac"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">If the origin is an S3 bucket configured as a website endpoint, it must be set up in CloudFront as a custom origin, which means you can't use OAC (or OAI). The documentation requires the origin to be a regular bucket, not one configured as a website endpoint. Also, OAC doesn't support origin redirect with Lambda@Edge. Use the bucket's regular endpoint as the origin; if you need website behavior, that origin is left outside OAC protection.&lt;p&gt;&lt;small&gt;feat(content): patrón protected-origin-cdn (borrador) con Terraform en las tres nubes&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#4b9b896-protected-origin-cdn-aws-sse-kms-needs-key-policy</id>
    <title>[New] [AWS] With SSE-KMS the distribution also needs permission on the key</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/protected-origin-cdn/all/#aws-sse-kms-needs-key-policy"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">OAC supports SSE-KMS (OAI doesn't). If the objects in the bucket are encrypted with SSE-KMS, you must make sure the distribution has permission to use the KMS key: add a statement to the key policy. The official example gives kms:Decrypt, kms:Encrypt and kms:GenerateDataKey* to the cloudfront.amazonaws.com principal, with the same AWS:SourceArn condition on the distribution's ARN. The key policy lives with the key, not the bucket: if another team manages it, ask them for the statement with the distribution's ARN.&lt;p&gt;&lt;small&gt;feat(content): patrón protected-origin-cdn (borrador) con Terraform en las tres nubes&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#4b9b896-protected-origin-cdn-gcp-cdn-service-account-appears-with-first-key</id>
    <title>[New] [GCP] Cloud CDN reads the bucket with its own service account, which appears when you add the first key</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/protected-origin-cdn/all/#gcp-cdn-service-account-appears-with-first-key"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">If the bucket restricts who can read objects, Cloud CDN needs read permission, granted to its service account service-PROJECT_NUMBER@cloud-cdn-fill.iam.gserviceaccount.com with roles/storage.objectViewer. That account is created automatically the first time you add a key to a backend bucket in the project; before that, the permissions command fails. It also doesn't appear in the project's list of service accounts, because it belongs to Cloud CDN. If the project has the domain restricted sharing organization policy, the documentation suggests temporarily disabling it or allowlisting the organization that owns the cloud-cdn-fill project. In IaC, make the permission depend on the key.&lt;p&gt;&lt;small&gt;feat(content): patrón protected-origin-cdn (borrador) con Terraform en las tres nubes&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#4b9b896-protected-origin-cdn-gcp-public-bucket-defeats-signed-urls</id>
    <title>[New] [GCP] If the bucket stays public, signed URLs don't protect the content</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/protected-origin-cdn/all/#gcp-public-bucket-defeats-signed-urls"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">For signed URLs to protect the content, the origin must not grant public access: the documentation says to remove the allUsers (and allAuthenticatedUsers, if applicable) read permissions from the bucket, which is commonly left public during testing. Even without public access, anyone who already has permission on the bucket, such as OWNER, can access Cloud Storage without a signed URL. And a signed URL gives time-limited access to anyone who holds it, whether or not they have a Google Account. Check that the bucket has neither allUsers nor allAuthenticatedUsers before calling the entry closed, and sign only HTTPS URLs.&lt;p&gt;&lt;small&gt;feat(content): patrón protected-origin-cdn (borrador) con Terraform en las tres nubes&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#4b9b896-protected-origin-cdn-gcp-signed-url-responses-ignore-cache-control</id>
    <title>[New] [GCP] Cloud CDN caches responses to signed requests regardless of the origin's Cache-Control</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/protected-origin-cdn/all/#gcp-signed-url-responses-ignore-cache-control"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">Cloud CDN caches responses to signed requests regardless of the backend's Cache-Control header. The maximum time those responses can be cached without revalidation is set by the signed-url-cache-max-age flag, which defaults to one hour. The object's Cache-Control doesn't shorten it. Set the maximum according to how long you can tolerate a response still being served from cache, and don't count on the object's Cache-Control to control it on signed requests.&lt;p&gt;&lt;small&gt;feat(content): patrón protected-origin-cdn (borrador) con Terraform en las tres nubes&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  <entry>
    <id>https://cloud-rosetta-stone.vercel.app/en/changes/#651a32f-ci-oidc-federation-gcp-project-number-and-propagation</id>
    <title>[Fixed] [GCP] Principals use the project number, and permissions take minutes to propagate</title>
    <link href="https://cloud-rosetta-stone.vercel.app/en/patterns/ci-oidc-federation/all/#gcp-project-number-and-propagation"/>
    <updated>2026-10-24T00:00:00Z</updated>
    <content type="html">&lt;del&gt;The&lt;/del&gt;&lt;ins&gt;When&lt;/ins&gt; &lt;del&gt;principalSet&lt;/del&gt;&lt;ins&gt;granting&lt;/ins&gt; &lt;del&gt;and&lt;/del&gt;&lt;ins&gt;roles&lt;/ins&gt; &lt;del&gt;the&lt;/del&gt;&lt;ins&gt;to&lt;/ins&gt; &lt;del&gt;workload_identity_provider&lt;/del&gt;&lt;ins&gt;external&lt;/ins&gt; &lt;del&gt;you&lt;/del&gt;&lt;ins&gt;identities&lt;/ins&gt; &lt;del&gt;pass&lt;/del&gt;&lt;ins&gt;you&lt;/ins&gt; &lt;del&gt;to&lt;/del&gt;&lt;ins&gt;use&lt;/ins&gt; the &lt;del&gt;action are&lt;/del&gt;&lt;ins&gt;project&lt;/ins&gt; &lt;del&gt;projects/NUMBER/locations/global/...,&lt;/del&gt;&lt;ins&gt;number,&lt;/ins&gt; not the project &lt;del&gt;ID.&lt;/del&gt;&lt;ins&gt;ID:&lt;/ins&gt; &lt;ins&gt;the principalSet is principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/.... &lt;/ins&gt;Also, an IAM change usually applies within 2 minutes but can take 7 or &lt;del&gt;more, so a freshly configured pipeline can fail its first run with nothing actually wrong.&lt;/del&gt;&lt;ins&gt;more.&lt;/ins&gt;</content>
  </entry>
</feed>
