Skip to content

Commit d6f4634

Browse files
authored
fix(bootstrap): grant missing Update* actions for DNS-firewall association + log delivery (#595)
* fix(bootstrap): grant route53resolver:UpdateFirewallRuleGroupAssociation to exec role Live-caught deploying the ECS substrate to dev (--context compute_type=ecs): the CFN execution role got AccessDenied on route53resolver:UpdateFirewallRuleGroup- Association, failing DnsFirewall/RuleGroupAssociation and rolling back the stack. The bootstrap policy already grants Associate/Disassociate/Get/List on the firewall rule-group association but not Update. That action is only exercised when CFN does an in-place UPDATE of the existing association (e.g. coming out of a rollback, or any change that rewrites the resource) — a fresh create or a no-op update never hits it, which is why it went unnoticed until now. Classic least-privilege bootstrap drift (same class as #402/#404/#407/#409), NOT an ECS- or branch-specific issue: main lacks the action too; deploying the ECS path just exercised the update path that surfaces it. Not added: the non-fatal s3:Get*/TagResource read-sweep denials CFN's S3 handler emits — those are tolerated (no S3 resource failed), and granting describe-handler breadth for unused bucket features would bury real gaps (the #406 lesson). Regenerated bootstrap artifacts + updated the DEPLOYMENT_ROLES.md golden and its Starlight mirror. Full cdk suite green (125 suites / 2289 tests). (cherry picked from commit f69f01a) * fix(bootstrap): grant logs:UpdateDeliveryConfiguration to exec role Live-caught deploying to dev: the CFN execution role got AccessDenied on logs:UpdateDeliveryConfiguration updating RuntimeApplicationLogsDelivery (AWS::Logs::Delivery), which failed the stack update AND its rollback → the stack landed in UPDATE_ROLLBACK_FAILED. The observability bootstrap policy grants CreateDelivery + the LogDelivery family (Create/Get/Update/DeleteLogDelivery) + Put/Get/Delete DeliverySource/Destination, but not UpdateDeliveryConfiguration. That action is only exercised when CFN does an IN-PLACE update of an existing AWS::Logs::Delivery resource — a fresh create never hits it, so it went unnoticed until a stack that already had the delivery resource was updated. Same least-privilege bootstrap-drift class as #402/#404/#407/#409 and the route53resolver:UpdateFirewallRuleGroupAssociation fix on this branch. NOT an ECS- or branch-specific gap: verified logs:UpdateDeliveryConfiguration is absent on main and linear-vercel too, and this branch does not touch the delivery resource or observability.ts — the ECS deploy-verify merely exercised the update path that surfaces the latent hole. Regenerated bootstrap artifacts + updated the DEPLOYMENT_ROLES.md golden and its Starlight mirror. Full cdk suite green (125 suites / 2289 tests). (cherry picked from commit 1697c38)
1 parent 3af6cc3 commit d6f4634

7 files changed

Lines changed: 10 additions & 0 deletions

File tree

cdk/bootstrap/bootstrap-template.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -930,6 +930,7 @@ Resources:
930930
- route53resolver:UpdateFirewallDomains
931931
- route53resolver:AssociateFirewallRuleGroup
932932
- route53resolver:DisassociateFirewallRuleGroup
933+
- route53resolver:UpdateFirewallRuleGroupAssociation
933934
- route53resolver:GetFirewallRuleGroupAssociation
934935
- route53resolver:ListFirewallRuleGroupAssociations
935936
- route53resolver:UpdateFirewallConfig
@@ -1191,6 +1192,7 @@ Resources:
11911192
- cloudwatch:TagResource
11921193
- cloudwatch:UntagResource
11931194
- logs:CreateDelivery
1195+
- logs:UpdateDeliveryConfiguration
11941196
- logs:DescribeDeliveries
11951197
- logs:GetDelivery
11961198
- logs:GetDeliveryDestination

cdk/bootstrap/policies/infrastructure.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@
153153
"route53resolver:UpdateFirewallDomains",
154154
"route53resolver:AssociateFirewallRuleGroup",
155155
"route53resolver:DisassociateFirewallRuleGroup",
156+
"route53resolver:UpdateFirewallRuleGroupAssociation",
156157
"route53resolver:GetFirewallRuleGroupAssociation",
157158
"route53resolver:ListFirewallRuleGroupAssociations",
158159
"route53resolver:UpdateFirewallConfig",

cdk/bootstrap/policies/observability.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
"cloudwatch:TagResource",
4545
"cloudwatch:UntagResource",
4646
"logs:CreateDelivery",
47+
"logs:UpdateDeliveryConfiguration",
4748
"logs:DescribeDeliveries",
4849
"logs:GetDelivery",
4950
"logs:GetDeliveryDestination",

cdk/src/bootstrap/policies/infrastructure.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ export function infrastructurePolicy(): iam.PolicyDocument {
190190
'route53resolver:UpdateFirewallDomains',
191191
'route53resolver:AssociateFirewallRuleGroup',
192192
'route53resolver:DisassociateFirewallRuleGroup',
193+
'route53resolver:UpdateFirewallRuleGroupAssociation',
193194
'route53resolver:GetFirewallRuleGroupAssociation',
194195
'route53resolver:ListFirewallRuleGroupAssociations',
195196
'route53resolver:UpdateFirewallConfig',

cdk/src/bootstrap/policies/observability.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ export function observabilityPolicy(): iam.PolicyDocument {
7979
'cloudwatch:TagResource',
8080
'cloudwatch:UntagResource',
8181
'logs:CreateDelivery',
82+
'logs:UpdateDeliveryConfiguration',
8283
'logs:DescribeDeliveries',
8384
'logs:GetDelivery',
8485
'logs:GetDeliveryDestination',

docs/design/DEPLOYMENT_ROLES.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,7 @@ CloudFormation stack operations, IAM roles/policies, VPC networking, and Route 5
238238
"route53resolver:UpdateFirewallDomains",
239239
"route53resolver:AssociateFirewallRuleGroup",
240240
"route53resolver:DisassociateFirewallRuleGroup",
241+
"route53resolver:UpdateFirewallRuleGroupAssociation",
241242
"route53resolver:GetFirewallRuleGroupAssociation",
242243
"route53resolver:ListFirewallRuleGroupAssociations",
243244
"route53resolver:UpdateFirewallConfig",
@@ -557,6 +558,7 @@ Bedrock Guardrails, CloudWatch Logs/Dashboards/Alarms, X-Ray, S3 (CDK assets), K
557558
"cloudwatch:TagResource",
558559
"cloudwatch:UntagResource",
559560
"logs:CreateDelivery",
561+
"logs:UpdateDeliveryConfiguration",
560562
"logs:DescribeDeliveries",
561563
"logs:GetDelivery",
562564
"logs:GetDeliveryDestination",

docs/src/content/docs/architecture/Deployment-roles.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,7 @@ CloudFormation stack operations, IAM roles/policies, VPC networking, and Route 5
242242
"route53resolver:UpdateFirewallDomains",
243243
"route53resolver:AssociateFirewallRuleGroup",
244244
"route53resolver:DisassociateFirewallRuleGroup",
245+
"route53resolver:UpdateFirewallRuleGroupAssociation",
245246
"route53resolver:GetFirewallRuleGroupAssociation",
246247
"route53resolver:ListFirewallRuleGroupAssociations",
247248
"route53resolver:UpdateFirewallConfig",
@@ -561,6 +562,7 @@ Bedrock Guardrails, CloudWatch Logs/Dashboards/Alarms, X-Ray, S3 (CDK assets), K
561562
"cloudwatch:TagResource",
562563
"cloudwatch:UntagResource",
563564
"logs:CreateDelivery",
565+
"logs:UpdateDeliveryConfiguration",
564566
"logs:DescribeDeliveries",
565567
"logs:GetDelivery",
566568
"logs:GetDeliveryDestination",

0 commit comments

Comments
 (0)