From aws-data-analytics
Creates managed Iceberg tables using Amazon S3 Tables with automatic compaction, snapshot management, Glue catalog registration, partitioning, and IAM access control. Use when setting up structured data storage for analytics queries.
How this skill is triggered — by the user, by Claude, or both
Slash command
/aws-data-analytics:creating-data-lake-table [table-description|schema-spec][table-description|schema-spec]The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Amazon S3 Tables provides managed Iceberg tables with automatic compaction and snapshot management. Queryable via Athena and Iceberg-compatible engines.
Amazon S3 Tables provides managed Iceberg tables with automatic compaction and snapshot management. Queryable via Athena and Iceberg-compatible engines.
You MUST use AWS MCP server tools when connected, they provide command validation, sandboxed execution, and audit logging. Fall back to AWS CLI if MCP unavailable.
Before creating, You MUST check what exists:
You MUST run aws glue get-tables --database-name <NAME> when user mentions a database.
| What you find | Action |
|---|---|
| Fuzzy database name ("our analytics db") | You MUST STOP. Delegate to finding-data-lake-assets to resolve. |
| Non-S3-Tables table with matching name | You MUST STOP. Delegate to finding-data-lake-assets. You MUST NOT create until user confirms. |
| Existing S3 Tables table with matching name | You MUST check schema match. Reuse if compatible, recreate only if user confirms. |
| No matching tables | Proceed with creation (Steps 1-8). |
| User explicitly requests new S3 Tables table | Skip checks, proceed with creation. |
Creation paths:
ingesting-into-data-lake skill.references/table-creation-glue-etl.md first, then Steps 1-6."S3 Tables integration with Lake Formation".Constraints:
aws sts get-caller-identityingesting-into-data-lake skill.Constraints:
references/best-practices.md for Iceberg type mapping, partitions, and naming.references/athena-ddl-path.md.GENERIC_INTERNAL_ERROR. Namespace and table names MUST NOT contain hyphens.Names: 3-63 chars, lowercase, numbers, hyphens.
aws s3tables create-table-bucket --name <BUCKET_NAME> --region <REGION>
Capture table-bucket-arn. Encryption (SSE-S3 default, SSE-KMS) and storage class (STANDARD, INTELLIGENT_TIERING) set at creation. See references/best-practices.md.
Constraints:
aws s3tables list-table-buckets and ask user to select or create new."S3 Tables KMS key policy" for required policy.references/best-practices.md for common errors.aws s3tables create-namespace --table-bucket-arn <ARN> --namespace <NAMESPACE>
Constraints:
Check if s3tablescatalog exists (create once per region per account):
aws glue get-catalog --catalog-id s3tablescatalog
If not found, create (requires glue:CreateCatalog, glue:passConnection):
aws glue create-catalog --name "s3tablescatalog" --catalog-input '{
"FederatedCatalog": {
"Identifier": "arn:aws:s3tables:<REGION>:<ACCOUNT_ID>:bucket/*",
"ConnectionName": "aws:s3tables"
},
"CreateDatabaseDefaultPermissions": [{"Principal": {"DataLakePrincipalIdentifier": "IAM_ALLOWED_PRINCIPALS"}, "Permissions": ["ALL"]}],
"CreateTableDefaultPermissions": [{"Principal": {"DataLakePrincipalIdentifier": "IAM_ALLOWED_PRINCIPALS"}, "Permissions": ["ALL"]}],
"AllowFullTableExternalDataAccess": "True"
}'
Verify with aws glue get-catalogs --parent-catalog-id s3tablescatalog.
S3 Tables uses s3tables:* IAM namespace (not s3:*).
Querying principal permissions (bucket policy):
s3tables:GetTableBucket, s3tables:GetNamespace, s3tables:GetTable, s3tables:GetTableMetadataLocation, s3tables:GetTableDataQuerying principal permissions (IAM policy):
glue:GetCatalog, glue:GetDatabase, glue:GetTableYou MUST scope to correct ARN patterns. You MUST read references/access-control.md for exact resource ARNs.
Constraints:
| Context | Path |
|---|---|
| Default (any user) | S3 Tables API (below) |
| User specifically wants SQL DDL | Athena DDL (see references/athena-ddl-path.md) |
| Glue ETL pipeline | Spark DDL via --conf job args (not spark.conf.set()). You MUST read references/table-creation-glue-etl.md for the --conf string. |
Default: S3 Tables API:
aws s3tables create-table \
--table-bucket-arn <ARN> \
--namespace <NAMESPACE> \
--name <TABLE_NAME> \
--format ICEBERG \
--metadata '<METADATA_JSON>'
Metadata JSON MUST nest under "iceberg" key:
{"iceberg":{"schema":{"fields":[
{"name":"order_date","type":"date","required":true},
{"name":"customer_id","type":"string","required":true},
{"name":"amount","type":"double","required":false}
]},
"partitionSpec":{"fields":[
{"sourceId":1,"fieldId":1000,"transform":"month","name":"order_date_month"}
]}}}
Constraints:
partitionSpec.sourceId MUST reference a valid schema field IDreferences/athena-ddl-path.mdschemaV2 for complex types (list, map, struct) with explicit field IDs. See references/best-practices.md."IcebergPartitionField S3 Tables" for supported partition transformsYou MUST verify with aws s3tables get-table and confirm queryability with DESCRIBE <table_name> via Athena using --query-execution-context '{"Catalog":"s3tablescatalog/<BUCKET_NAME>","Database":"<NAMESPACE>"}'. Do NOT put catalog in SQL. Present summary: bucket ARN, namespace, table, schema, partitions.
| Error | Cause | Fix |
|---|---|---|
| "Table location can not be specified" | LOCATION in CREATE TABLE | Remove LOCATION clause. S3 Tables manages storage automatically. |
AccessDeniedException with s3:* policy | Using s3:* not s3tables:* | S3 Tables uses s3tables:* namespace. Update IAM policy. |
ingesting-into-data-lake skillnpx claudepluginhub spencerx/agent-toolkit-for-aws --plugin aws-data-analytics5plugins reuse this skill
First indexed Jun 23, 2026
Creates managed Iceberg tables using Amazon S3 Tables with automatic compaction, snapshot management, Glue catalog registration, partitioning, and IAM access control. Use when setting up structured data storage for analytics queries.
Creates and manages Apache Iceberg tables on Databricks Unity Catalog, including Managed Iceberg tables, External Iceberg Reads (UniForm), Iceberg REST Catalog for external engine access, and Snowflake interop.
Read and write Apache Iceberg tables backed by OCI Object Storage from an AIDP notebook. Handles ACID transactions, time travel, snapshots, schema evolution, and partition evolution without an external metastore.