Service execution role
A Channel assumes a service execution role to deliver data. The role needs a trust policy plus a permission policy that matches your destination type. The following policies are the authoritative reference for the required permissions.
Trust policy
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "kafka.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "aws:SourceAccount": "ACCOUNT_ID" }, "ArnLike": { "aws:SourceArn": "arn:aws:kafka:REGION:ACCOUNT_ID:channel/*" } } } ] }
Note
Use the aws:SourceArn and aws:SourceAccount conditions to prevent confused deputy attacks.
Permission policy — streaming tables for Apache Iceberg
The following single policy contains every statement the service role may need. Keep the statements that apply to your setup (see When you need each statement) and remove the rest.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowS3TablesActions", "Effect": "Allow", "Action": [ "s3tables:GetTable", "s3tables:GetTableMetadataLocation", "s3tables:UpdateTableMetadataLocation", "s3tables:CreateTable", "s3tables:PutTableData", "s3tables:CreateNamespace", "s3tables:GetTableData", "s3tables:GetTableBucket", "s3tables:TagResource", "s3tables:PutTableRecordExpirationConfiguration", "s3tables:PutTableEncryption" ], "Resource": [ "arn:aws:s3tables:REGION:ACCOUNT_ID:bucket/BUCKET_NAME", "arn:aws:s3tables:REGION:ACCOUNT_ID:bucket/BUCKET_NAME/table/*" ] }, { "Sid": "AllowCreateTableWithTag", "Effect": "Allow", "Action": "s3tables:CreateTable", "Resource": [ "arn:aws:s3tables:REGION:ACCOUNT_ID:bucket/BUCKET_NAME/table/*", "arn:aws:s3tables:REGION:ACCOUNT_ID:bucket/BUCKET_NAME" ], "Condition": { "StringEquals": { "aws:RequestTag/TableName": "TABLE_NAME" } } }, { "Sid": "AllowPutTableDataWithTag", "Effect": "Allow", "Action": "s3tables:PutTableData", "Resource": "arn:aws:s3tables:REGION:ACCOUNT_ID:bucket/BUCKET_NAME/table/*", "Condition": { "StringEquals": { "aws:ResourceTag/TableName": "TABLE_NAME" } } }, { "Sid": "DLQBucketAccess", "Effect": "Allow", "Action": [ "s3:GetBucketLocation", "s3:PutObject", "s3:ListBucket", "s3:ListBucketMultipartUploads" ], "Resource": [ "arn:aws:s3:::DLQ_BUCKET", "arn:aws:s3:::DLQ_BUCKET/*" ], "Condition": { "StringEquals": { "aws:ResourceAccount": "DLQ_ACCOUNT_ID" } } }, { "Sid": "GlueSchemaRegistryAccess", "Effect": "Allow", "Action": [ "glue:GetSchemaVersion" ], "Resource": [ "arn:aws:glue:REGION:ACCOUNT_ID:schema/*", "arn:aws:glue:REGION:ACCOUNT_ID:registry/*" ] }, { "Sid": "KMSAccess", "Effect": "Allow", "Action": [ "kms:Decrypt", "kms:GenerateDataKey" ], "Resource": [ "arn:aws:kms:REGION:ACCOUNT_ID:key/KEY_ID" ] } ] }
When you need each statement
The following explains when each statement in the preceding policy is required.
AllowS3TablesActions(required) — grants the core S3 Tables actions, scoped by the S3 Table ARN.s3tables:PutTableEncryptionis required only when you provide your own customer-managed KMS key (you can remove it otherwise).AllowCreateTableWithTag/AllowPutTableDataWithTag(optional) — use these only if you want tag-based access control instead of ARN scoping for table creation and data writes. They restricts3tables:CreateTableands3tables:PutTableDatato resources carrying a matchingTableNametag. ReplaceTABLE_NAMEwith your table name; omit these statements if you scope solely by ARN.Table ARNs are UUID-based and only exist after the Channel creates the table, so scope to the bucket ARN plus
.../bucket/BUCKET_NAME/table/*(sample table ARN:arn:aws:s3tables:us-east-1:123456789012:bucket/my-bucket/table/49d6653e-244e-40a0-b0a0-c975c404127d).DLQBucketAccess(required) — the Channel writes the identifiers of unprocessable records to the DLQ bucket. ReplaceDLQ_ACCOUNT_IDwith the ID of the account that owns the DLQ bucket; theaws:ResourceAccountcondition restricts access to a bucket in that account.GlueSchemaRegistryAccess(required) — grantsglue:GetSchemaVersionso the Channel can resolve the schema for the topic data from the Glue Schema Registry. Required for both theJSONandJSON_SCHEMA_GSRinput formats.KMSAccess(optional) — required only when you provide your own customer-managed KMS key.
Additional permissions
Amazon CloudWatch Logs (optional): add
logs:CreateLogStreamandlogs:PutLogEventson the log group (see Logging).