Skip to content

Control Tower enrollment keeps failing with InsufficientDeliveryPolicyException for AWS Config

0

I’m enrolling a new account into AWS Control Tower and the Control Tower baseline keeps failing. At the beginning it was with this error:

AWS Control Tower could not enroll your account for the following reason: AWS Control Tower failed to deploy one or more stack set instances: StackSet Id: AWSControlTowerBP-BASELINE-CONFIG:40a56699-3aed-4491-be3d-454775f7c3a2, Stack instance Id: arn:aws:cloudformation:us-west-1:1234567890:stack/StackSet-AWSControlTowerBP-BASELINE-CONFIG-f5b7ed95-bcb2-4a0b-9924-229a57354d57/a06aa7f0-b997-11f0-9a88-065f6c50dafb, Status: OUTDATED, Status Reason: ResourceLogicalId:ConfigDeliveryChannel, ResourceType:AWS::Config::DeliveryChannel, ResourceStatusReason:Insufficient delivery policy to s3 bucket: aws-controltower-logs-1234567890-us-west-1, unable to write to bucket, provided s3 key prefix is 'o-z192z1234567890', provided kms key is 'null'. (Service: AmazonConfig; Status Code: 400; Error Code: InsufficientDeliveryPolicyException; Request ID: abcc93d2-4c30-448f-a69b-b478e6155dda; Proxy: null).

What I’ve tried (and verified)

Bucket policy permutations

  • Allowed config.amazonaws.com and cloudtrail.amazonaws.com s3:PutObject to the org prefix.
  • Required and not required s3:x-amz-acl: bucket-owner-full-control.
  • Allowed org principals via aws:PrincipalOrgID.
  • Widened resources from o-<org-id>/AWSLogs/* to o-<org-id>/*.
  • Finally applied a max-open policy:

{ "Version":"2012-10-17", "Statement":[ {"Effect":"Allow","Principal":"","Action":"s3:", "Resource":[ "arn:aws:s3:::aws-controltower-logs-1234567890-us-west-1", "arn:aws:s3:::aws-controltower-logs-1234567890-us-west-1/*" ]} ] }

Now i get:

Account enrollment failed. AWS Control Tower could not enroll your account for the following reason: AWS Control Tower failed to deploy one or more stack set instances: StackSet Id: AWSControlTowerBP-BASELINE-CONFIG:40a56699-3aed-4491-be3d-454775f7c3a2, Stack instance Id: arn:aws:cloudformation:us-west-1:1234567890:stack/StackSet-AWSControlTowerBP-BASELINE-CONFIG-f5b7ed95-bcb2-4a0b-9924-229a57354d57/02c07ee0-b9be-11f0-a144-06341ec71c2b, Status: OUTDATED, Status Reason: ResourceLogicalId:ConfigDeliveryChannel, ResourceType:AWS::Config::DeliveryChannel, ResourceStatusReason:Insufficient delivery policy to s3 bucket: aws-controltower-logs-1234567890-us-west-1, unable to write to bucket, provided s3 key prefix is 'o-z1921234567890', provided kms key is 'null'. (Service: AmazonConfig; Status Code: 400; Error Code: InsufficientDeliveryPolicyException; Request ID: cdba6e8c-539b-45b7-97cf-f7b00a9a33a4; Proxy: null).

KMS

  • Bucket is SSE-S3 (AES256), no SSE-KMS enforced. The kms key 'null' appears to be a red herring.

SCPs and OU

  • Moved the account into a temporary OU with only FullAWSAccess attached (root is also FullAWSAccess). Same failure. So no SCP Deny should be in play.

StackSet handling

  • Repeated update-stack-instances.
  • Observed the stack go CREATE_IN_PROGRESS → CREATE_FAILED (DeliveryChannel), then deleted by StackSet.
  • Also tried deleting the instance (--no-retain-stacks) and re-creating.

Manual S3 writes from the target account

  • Verified PutObject into: o-<org-id>/smoke.txt, o-<org-id>/AWSLogs/<target-acct>/Config/us-west-1/test-ct.txt

AWs Config:

  • No AWS Config configuration recorders or delivery channels in the account.

I’ve seen success from the management account to the log account where the target bucket is.

It doesn't matter if the account existed and just enrolled into the org (manually created the Control Tower role as specified the documentation or if its brand new created through Account Factory.

I'm losing my mind!! Been wrestling with this for two days, unfortunately only basic support so its gonna take weeks to get direct AWS help.

Thanks.

asked 10 months ago314 views

2 Answers
0

This AWS Control Tower enrollment issue with the InsufficientDeliveryPolicyException error is related to AWS Config's inability to write to the designated S3 bucket. Based on your troubleshooting steps, here are some additional approaches to resolve this issue:

  1. Check for existing AWS Config resources: Before enrollment, verify if there are any existing AWS Config configuration recorders or delivery channels in the account you're trying to enroll. If they exist, you'll need to delete them in all supported regions before attempting enrollment again. AWS Control Tower needs to create its own AWS Config resources during enrollment.

  2. Verify the AWSControlTowerExecution role: Ensure this role exists in the account you're trying to enroll and has the correct trust relationship with the management account. The role should have the AdministratorAccess policy attached.

  3. Check account placement: If the account is under a registered OU and enrollment is failing, try moving the account to the root level of your organization temporarily, then attempt enrollment again.

  4. Review the provisioned product: If you've attempted enrollment before and it failed, there might be a partially completed process. Check the Service Catalog console for any failed provisioned products related to this account and terminate them before trying again.

  5. Verify bucket permissions: While you've tried various bucket policy configurations, ensure that the bucket itself doesn't have any Block Public Access settings or other restrictions that might interfere with AWS Config's ability to write to it.

  6. Check for service limits: Although less likely given the specific error, ensure your account has sufficient service limits for AWS Control Tower to operate properly.

Since you've already verified direct S3 write access from the target account, the issue might be related to how AWS Config specifically interacts with the bucket rather than general S3 permissions. The error suggests AWS Config is still unable to write to the bucket with the specified organization prefix despite your policy changes.
Sources
Troubleshooting - AWS Control Tower
Troubleshoot AWS Control Tower role error | AWS re:Post
ControlTower - Your existing service limits for this AWS account are not sufficient for AWS Control Tower to launch. | AWS re:Post

answered 10 months ago

0

Hi There

Something is preventing config from writing to that bucket. Have you looked in CloudTrail to see exactly which api call is being denied, and the principal associated with it?

Did you enabled ObjectLock on the bucket or changed any other settings?

Do you have KMS enabled in Control Tower Settings?

Check your S3 bucket policy, should look something like

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowSSLRequestsOnly",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::aws-controltower-logs-1234567890-us-east-1",
                "arn:aws:s3:::aws-controltower-logs-1234567890-us-east-1/*"
            ],
            "Condition": {
                "Bool": {
                    "aws:SecureTransport": "false"
                }
            }
        },
        {
            "Sid": "AWSBucketPermissionsCheck",
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "config.amazonaws.com",
                    "cloudtrail.amazonaws.com"
                ]
            },
            "Action": "s3:GetBucketAcl",
            "Resource": "arn:aws:s3:::aws-controltower-logs-1234567890-us-east-1"
        },
        {
            "Sid": "AWSConfigBucketExistenceCheck",
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "config.amazonaws.com",
                    "cloudtrail.amazonaws.com"
                ]
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::aws-controltower-logs-1234567890-us-east-1"
        },
        {
            "Sid": "AWSBucketDeliveryForConfig",
            "Effect": "Allow",
            "Principal": {
                "Service": "config.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::aws-controltower-logs-1234567890-us-east-1/o-123abc/AWSLogs/*/*",
            "Condition": {
                "StringEquals": {
                    "aws:SourceOrgID": “o-123abc”
                }
            }
        },
        {
            "Sid": "AWSBucketDeliveryForOrganizationTrail",
            "Effect": "Allow",
            "Principal": {
                "Service": "cloudtrail.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": [
                "arn:aws:s3:::aws-controltower-logs-1234567890-us-east-1/o-123abc/AWSLogs/1234567890/*”,
                "arn:aws:s3:::aws-controltower-logs-1234567890-us-east-1/o-123abc/AWSLogs/o-123abc/*”
            ],
            "Condition": {
                "StringEquals": {
                    "aws:SourceOrgID": “o-123abc”
                }
            }
        }
    ]
}
AWS
EXPERT

answered 10 months ago

You are not logged in. Log in to post an answer.

A good answer clearly answers the question and provides constructive feedback and encourages professional growth in the question asker.