tests/test.sh exit code (0 → resolved); the classification below is post-hoc and cannot change it.{
"command": "echo \"AWS_ENDPOINT_URL=$AWS_ENDPOINT_URL\"; echo \"ENFORCE_IAM=$ENFORCE_IAM\"; aws --version 2>&1 | head -1; ls /app 2>&1 | head -20",
"description": "Check environment variables and tools"
}AWS_ENDPOINT_URL=http://localstack:4566 ENFORCE_IAM= aws-cli/2.34.45 Python/3.14.4 Linux/6.10.14-linuxkit exe/aarch64.ubuntu.24 [stdout] AWS_ENDPOINT_URL=http://localstack:4566 ENFORCE_IAM= aws-cli/2.34.45 Python/3.14.4 Linux/6.10.14-linuxkit exe/aarch64.ubuntu.24
{
"command": "echo \"ENFORCE_IAM literal: [$ENFORCE_IAM]\"; env | grep -i -E \"AWS|ENFORCE\" | head -20",
"description": "Check AWS env vars"
}ENFORCE_IAM literal: [] AWS_DEFAULT_REGION=us-east-1 AWS_PAGER= AWS_SECRET_ACCESS_KEY=test AWS_ACCESS_KEY_ID=test AWS_ENDPOINT_URL=http://localstack:4566 [stdout] ENFORCE_IAM literal: [] AWS_DEFAULT_REGION=us-east-1 AWS_PAGER= AWS_SECRET_ACCESS_KEY=test AWS_ACCESS_KEY_ID=test AWS_ENDPOINT_URL=http://localstack:4566
{
"command": "aws sts get-caller-identity 2>&1; aws s3 ls 2>&1 | head -10",
"description": "Verify AWS connectivity"
}{
"UserId": "000000000000",
"Account": "000000000000",
"Arn": "arn:aws:iam::000000000000:root"
}
[stdout]
{
"UserId": "000000000000",
"Account": "000000000000",
"Arn": "arn:aws:iam::000000000000:root"
}{
"command": "SUFFIX=$(openssl rand -hex 3)\necho \"SUFFIX=$SUFFIX\"\necho \"$SUFFIX\" > /tmp/harbor_suffix\necho \"RESULTS=harbor-athena-results-$SUFFIX\"\necho \"DATA=harbor-athena-data-$SUFFIX\"\necho \"TRAIL=harbor-athena-trail-$SUFFIX\"",
"description": "Generate hex suffix"
}SUFFIX=9ebb00 RESULTS=harbor-athena-results-9ebb00 DATA=harbor-athena-data-9ebb00 TRAIL=harbor-athena-trail-9ebb00 [stdout] SUFFIX=9ebb00 RESULTS=harbor-athena-results-9ebb00 DATA=harbor-athena-data-9ebb00 TRAIL=harbor-athena-trail-9ebb00
{
"command": "cat > /tmp/kms-policy.json <<'EOF'\n{\n \"Version\": \"2012-10-17\",\n \"Id\": \"harbor-athena-cmk-policy\",\n \"Statement\": [\n {\n \"Sid\": \"EnableIAMUserPermissions\",\n \"Effect\": \"Allow\",\n \"Principal\": { \"AWS\": \"arn:aws:iam::000000000000:root\" },\n \"Action\": \"kms:*\",\n \"Resource\": \"*\"\n },\n {\n \"Sid\": \"AllowAthenaServiceEnvelopeCrypto\",\n \"Effect\": \"Allow\",\n \"Principal\": { \"Service\": \"athena.amazonaws.com\" },\n \"Action\": [\n \"kms:GenerateDataKey\",\n \"kms:Decrypt\"\n ],\n \"Resource\": \"*\"\n },\n {\n \"Sid\": \"AllowS3ServiceForBucketDefaultEncryption\",\n \"Effect\": \"Allow\",\n \"Principal\": { \"Service\": \"s3.amazonaws.com\" },\n \"Action\": [\n \"kms:GenerateDataKey\",\n \"kms:Decrypt\"\n ],\n \"Resource\": \"*\"\n },\n {\n \"Sid\": \"AllowCloudTrailToEncryptLogs\",\n \"Effect\": \"Allow\",\n \"Principal\": { \"Service\": \"cloudtrail.amazonaws.com\" },\n \"Action\": [\n \"kms:GenerateDataKey\",\n \"kms:Decrypt\",\n \"kms:DescribeKey\"\n ],\n \"Resource\": \"*\"\n }\n ]\n}\nEOF\n\nCMK_ARN=$(aws kms create-key \\\n --description \"Harbor Athena CMK\" \\\n --key-usage ENCRYPT_DECRYPT \\\n --customer-master-key-spec SYMMETRIC_DEFAULT \\\n --policy file:///tmp/kms-policy.json \\\n --query 'KeyMetadata.Arn' --output text)\necho \"CMK_ARN=$CMK_ARN\"\nCMK_ID=$(echo \"$CMK_ARN\" | awk -F'/' '{print $NF}')\necho \"CMK_ID=$CMK_ID\"\naws kms create-alias --alias-name alias/harbor-athena-cmk --target-key-id \"$CMK_ID\"\naws kms list-aliases --query 'Aliases[?AliasName==`alias/harbor-athena-cmk`]' --output json\necho \"$CMK_ARN\" > /tmp/harbor_cmk_arn\necho \"$CMK_ID\" > /tmp/harbor_cmk_id",
"description": "Create KMS CMK and alias"
}CMK_ARN=arn:aws:kms:us-east-1:000000000000:key/1d7bfd6a-428e-48ee-8558-c3c8e312f8b1
CMK_ID=1d7bfd6a-428e-48ee-8558-c3c8e312f8b1
[
{
"AliasName": "alias/harbor-athena-cmk",
"AliasArn": "arn:aws:kms:us-east-1:000000000000:alias/harbor-athena-cmk",
"TargetKeyId": "1d7bfd6a-428e-48ee-8558-c3c8e312f8b1",
"CreationDate": "2026-05-09T21:39:05.641844+00:00"
}
]
[stdout]
CMK_ARN=arn:aws:kms:us-east-1:000000000000:key/1d7bfd6a-428e-48ee-8558-c3c8e312f8b1
CMK_ID=1d7bfd6a-428e-48ee-8558-c3c8e312f8b1
[
{
"AliasName": "alias/harbor-athena-cmk",
"AliasArn": "arn:aws:kms:us-east-1:000000000000:alias/harbor-athena-cmk",
"TargetKeyId": "1d7bfd6a-428e-48ee-8558-c3c8e312f8b1",
"CreationDate": "2026-05-09T21:39:05.641844+00:00"
}
]{
"command": "SUFFIX=$(cat /tmp/harbor_suffix)\nCMK_ARN=$(cat /tmp/harbor_cmk_arn)\nRESULTS_BUCKET=\"harbor-athena-results-$SUFFIX\"\nDATA_BUCKET=\"harbor-athena-data-$SUFFIX\"\nTRAIL_BUCKET=\"harbor-athena-trail-$SUFFIX\"\n\nfor B in \"$RESULTS_BUCKET\" \"$DATA_BUCKET\" \"$TRAIL_BUCKET\"; do\n aws s3api create-bucket --bucket \"$B\" 2>&1 | tail -3\ndone\n\ncat > /tmp/sse.json <<EOF\n{\n \"Rules\": [\n {\n \"ApplyServerSideEncryptionByDefault\": {\n \"SSEAlgorithm\": \"aws:kms\",\n \"KMSMasterKeyID\": \"$CMK_ARN\"\n },\n \"BucketKeyEnabled\": true\n }\n ]\n}\nEOF\n\nfor B in \"$RESULTS_BUCKET\" \"$DATA_BUCKET\" \"$TRAIL_BUCKET\"; do\n aws s3api put-bucket-encryption --bucket \"$B\" --server-side-encryption-configuration file:///tmp/sse.json\n aws s3api put-public-access-block --bucket \"$B\" \\\n --public-access-block-configuration BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true\ndone\n\necho \"$RESULTS_BUCKET\" > /tmp/harbor_results_bucket\necho \"$DATA_BUCKET\" > /tmp/harbor_data_bucket\necho \"$TRAIL_BUCKET\" > /tmp/harbor_trail_bucket\necho \"Buckets created.\"",
"description": "Create S3 buckets with SSE-KMS and public access blocks"
}"Location": "/harbor-athena-results-9ebb00",
"BucketArn": "arn:aws:s3:::harbor-athena-results-9ebb00"
}
"Location": "/harbor-athena-data-9ebb00",
"BucketArn": "arn:aws:s3:::harbor-athena-data-9ebb00"
}
"Location": "/harbor-athena-trail-9ebb00",
"BucketArn": "arn:aws:s3:::harbor-athena-trail-9ebb00"
}
Buckets created.
[stdout]
"Location": "/harbor-athena-results-9ebb00",
"BucketArn": "arn:aws:s3:::harbor-athena-results-9ebb00"
}
"Location": "/harbor-athena-data-9ebb00",
"BucketArn": "arn:aws:s3:::harbor-athena-data-9ebb00"
}
"Location": "/harbor-athena-trail-9ebb00",
"BucketArn": "arn:aws:s3:::harbor-athena-trail-9ebb00"
}
Buckets created.{
"command": "RESULTS_BUCKET=$(cat /tmp/harbor_results_bucket)\nTRAIL_BUCKET=$(cat /tmp/harbor_trail_bucket)\n\ncat > /tmp/results-bucket-policy.json <<EOF\n{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Sid\": \"AllowAthenaResultDelivery\",\n \"Effect\": \"Allow\",\n \"Principal\": { \"Service\": \"athena.amazonaws.com\" },\n \"Action\": [\n \"s3:PutObject\",\n \"s3:GetBucketAcl\",\n \"s3:GetBucketLocation\",\n \"s3:ListBucketMultipartUploads\"\n ],\n \"Resource\": [\n \"arn:aws:s3:::$RESULTS_BUCKET\",\n \"arn:aws:s3:::$RESULTS_BUCKET/*\"\n ]\n }\n ]\n}\nEOF\n\naws s3api put-bucket-policy --bucket \"$RESULTS_BUCKET\" --policy file:///tmp/results-bucket-policy.json\n\ncat > /tmp/trail-bucket-policy.json <<EOF\n{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Sid\": \"AWSCloudTrailAclCheck\",\n \"Effect\": \"Allow\",\n \"Principal\": { \"Service\": \"cloudtrail.amazonaws.com\" },\n \"Action\": \"s3:GetBucketAcl\",\n \"Resource\": \"arn:aws:s3:::$TRAIL_BUCKET\"\n },\n {\n \"Sid\": \"AWSCloudTrailWrite\",\n \"Effect\": \"Allow\",\n \"Principal\": { \"Service\": \"cloudtrail.amazonaws.com\" },\n \"Action\": \"s3:PutObject\",\n \"Resource\": \"arn:aws:s3:::$TRAIL_BUCKET/AWSLogs/000000000000/*\",\n \"Condition\": {\n \"StringEquals\": { \"s3:x-amz-acl\": \"bucket-owner-full-control\" }\n }\n }\n ]\n}\nEOF\naws s3api put-bucket-policy --bucket \"$TRAIL_BUCKET\" --policy file:///tmp/trail-bucket-policy.json\necho \"Bucket policies applied.\"",
"description": "Apply bucket policies for results and audit trail buckets"
}Bucket policies applied. [stdout] Bucket policies applied.
{
"command": "DATA_BUCKET=$(cat /tmp/harbor_data_bucket)\n\n# Create Glue database\naws glue create-database --database-input '{\"Name\":\"harbor_analytics_db\",\"Description\":\"Harbor analytics database\"}' 2>&1 | tail -3\n\n# Create Glue table with partition projection\ncat > /tmp/glue-table.json <<EOF\n{\n \"Name\": \"harbor_orders\",\n \"Description\": \"Harbor orders fact table (partition projected)\",\n \"TableType\": \"EXTERNAL_TABLE\",\n \"Parameters\": {\n \"EXTERNAL\": \"TRUE\",\n \"classification\": \"parquet\",\n \"projection.enabled\": \"true\",\n \"projection.region.type\": \"enum\",\n \"projection.region.values\": \"us-east-1,us-west-2,eu-west-1\",\n \"projection.dt.type\": \"date\",\n \"projection.dt.range\": \"2024-01-01,NOW\",\n \"projection.dt.format\": \"yyyy-MM-dd\",\n \"projection.dt.interval\": \"1\",\n \"projection.dt.interval.unit\": \"DAYS\",\n \"storage.location.template\": \"s3://$DATA_BUCKET/harbor_orders/region=\\${region}/dt=\\${dt}/\"\n },\n \"PartitionKeys\": [\n { \"Name\": \"region\", \"Type\": \"string\" },\n { \"Name\": \"dt\", \"Type\": \"string\" }\n ],\n \"StorageDescriptor\": {\n \"Columns\": [\n { \"Name\": \"order_id\", \"Type\": \"string\" },\n { \"Name\": \"customer_id\", \"Type\": \"string\" },\n { \"Name\": \"amount\", \"Type\": \"double\" },\n { \"Name\": \"status\", \"Type\": \"string\" }\n ],\n \"Location\": \"s3://$DATA_BUCKET/harbor_orders/\",\n \"InputFormat\": \"org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat\",\n \"OutputFormat\": \"org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat\",\n \"Compressed\": false,\n \"SerdeInfo\": {\n \"SerializationLibrary\": \"org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe\",\n \"Parameters\": { \"serialization.format\": \"1\" }\n },\n \"StoredAsSubDirectories\": false\n }\n}\nEOF\n\naws glue create-table --database-name harbor_analytics_db --table-input file:///tmp/glue-table.json\naws glue get-table --database-name harbor_analytics_db --name harbor_orders --query 'Table.{Name:Name,Type:TableType,Partitions:PartitionKeys,Loc:StorageDescriptor.Location,Proj:Parameters.\"projection.enabled\",Tpl:Parameters.\"storage.location.template\"}'",
"description": "Create Glue database and projected table"
}{
"Name": "harbor_orders",
"Type": "EXTERNAL_TABLE",
"Partitions": [
{
"Name": "region",
"Type": "string"
},
{
"Name": "dt",
"Type": "string"
}
],
"Loc": "s3://harbor-athena-data-9ebb00/harbor_orders/",
"Proj": "true",
"Tpl": "s3://harbor-athena-data-9ebb00/harbor_orders/region=${region}/dt=${dt}/"
}
[stdout]
{
"Name": "harbor_orders",
"Type": "EXTERNAL_TABLE",
"Partitions": [
{
"Name": "region",
"Type": "string"
},
{
"Name": "dt",
"Type": "string"
}
],
"Loc": "s3://harbor-athena-data-9ebb00/harbor_orders/",
"Proj": "true",
"Tpl": "s3://harbor-athena-data-9ebb00/harbor_orders/region=${region}/dt=${dt}/"
}{
"command": "DATA_BUCKET=$(cat /tmp/harbor_data_bucket)\nRESULTS_BUCKET=$(cat /tmp/harbor_results_bucket)\nCMK_ARN=$(cat /tmp/harbor_cmk_arn)\n\n# Glue crawler role\ncat > /tmp/glue-trust.json <<'EOF'\n{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Effect\": \"Allow\",\n \"Principal\": { \"Service\": \"glue.amazonaws.com\" },\n \"Action\": \"sts:AssumeRole\"\n }\n ]\n}\nEOF\n\naws iam create-role --role-name harbor-glue-crawler-role --assume-role-policy-document file:///tmp/glue-trust.json --description \"Harbor Glue crawler role\" 2>&1 | tail -5\n\ncat > /tmp/glue-crawler-policy.json <<EOF\n{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Sid\": \"GlueCatalogAccess\",\n \"Effect\": \"Allow\",\n \"Action\": [\n \"glue:GetDatabase\",\n \"glue:GetDatabases\",\n \"glue:GetTable\",\n \"glue:GetTables\",\n \"glue:GetPartition\",\n \"glue:GetPartitions\",\n \"glue:CreateTable\",\n \"glue:UpdateTable\",\n \"glue:CreatePartition\",\n \"glue:UpdatePartition\",\n \"glue:BatchCreatePartition\",\n \"glue:BatchGetPartition\"\n ],\n \"Resource\": [\n \"arn:aws:glue:us-east-1:000000000000:catalog\",\n \"arn:aws:glue:us-east-1:000000000000:database/harbor_analytics_db\",\n \"arn:aws:glue:us-east-1:000000000000:table/harbor_analytics_db/*\"\n ]\n },\n {\n \"Sid\": \"DataBucketRead\",\n \"Effect\": \"Allow\",\n \"Action\": [\n \"s3:GetObject\",\n \"s3:ListBucket\"\n ],\n \"Resource\": [\n \"arn:aws:s3:::$DATA_BUCKET\",\n \"arn:aws:s3:::$DATA_BUCKET/*\"\n ]\n },\n {\n \"Sid\": \"KmsForDataBucket\",\n \"Effect\": \"Allow\",\n \"Action\": [\n \"kms:Decrypt\",\n \"kms:DescribeKey\"\n ],\n \"Resource\": \"$CMK_ARN\"\n },\n {\n \"Sid\": \"Logs\",\n \"Effect\": \"Allow\",\n \"Action\": [\n \"logs:CreateLogGroup\",\n \"logs:CreateLogStream\",\n \"logs:PutLogEvents\"\n ],\n \"Resource\": \"arn:aws:logs:us-east-1:000000000000:log-group:/aws-glue/*\"\n }\n ]\n}\nEOF\n\naws iam put-role-policy --role-name harbor-glue-crawler-role --policy-name harbor-glue-crawler-inline --policy-document file:///tmp/glue-crawler-policy.json\nGLUE_ROLE_ARN=$(aws iam get-role --role-name harbor-glue-crawler-role --query 'Role.Arn' --output text)\necho \"$GLUE_ROLE_ARN\" > /tmp/harbor_glue_role_arn\necho \"GLUE_ROLE_ARN=$GLUE_ROLE_ARN\"\n\n# Crawler\ncat > /tmp/crawler.json <<EOF\n{\n \"Name\": \"harbor-orders-crawler\",\n \"Role\": \"$GLUE_ROLE_ARN\",\n \"DatabaseName\": \"harbor_analytics_db\",\n \"Description\": \"Harbor orders incremental crawler\",\n \"Targets\": {\n \"S3Targets\": [\n {\n \"Path\": \"s3://$DATA_BUCKET/harbor_orders/\"\n }\n ]\n },\n \"SchemaChangePolicy\": {\n \"UpdateBehavior\": \"LOG\",\n \"DeleteBehavior\": \"LOG\"\n },\n \"RecrawlPolicy\": {\n \"RecrawlBehavior\": \"CRAWL_NEW_FOLDERS_ONLY\"\n }\n}\nEOF\naws glue create-crawler --cli-input-json file:///tmp/crawler.json\naws glue get-crawler --name harbor-orders-crawler --query 'Crawler.{Name:Name,Role:Role,DB:DatabaseName,Recrawl:RecrawlPolicy.RecrawlBehavior,Schema:SchemaChangePolicy.UpdateBehavior}'",
"description": "Create Glue crawler role and crawler"
}}
]
}
}
}
GLUE_ROLE_ARN=arn:aws:iam::000000000000:role/harbor-glue-crawler-role
{
"Name": "harbor-orders-crawler",
"Role": "harbor-glue-crawler-role",
"DB": "harbor_analytics_db",
"Recrawl": "CRAWL_NEW_FOLDERS_ONLY",
"Schema": "LOG"
}
[stdout]
}
]
}
}
}
GLUE_ROLE_ARN=arn:aws:iam::000000000000:role/harbor-glue-crawler-role
{
"Name": "harbor-orders-crawler",
"Role": "harbor-glue-crawler-role",
"DB": "harbor_analytics_db",
"Recrawl": "CRAWL_NEW_FOLDERS_ONLY",
"Schema": "LOG"
}{
"command": "RESULTS_BUCKET=$(cat /tmp/harbor_results_bucket)\nCMK_ARN=$(cat /tmp/harbor_cmk_arn)\n\nANALYST_CAP=10737418240 # 10 GiB\nADMIN_CAP=107374182400 # 100 GiB\necho \"$ANALYST_CAP\" > /tmp/harbor_analyst_cap\necho \"$ADMIN_CAP\" > /tmp/harbor_admin_cap\n\ncat > /tmp/wg-analyst.json <<EOF\n{\n \"Name\": \"harbor-analytics\",\n \"Description\": \"Analyst-facing workgroup with bytes-scanned guardrail and enforced result config (KMS).\",\n \"Configuration\": {\n \"ResultConfiguration\": {\n \"OutputLocation\": \"s3://$RESULTS_BUCKET/\",\n \"EncryptionConfiguration\": {\n \"EncryptionOption\": \"SSE_KMS\",\n \"KmsKey\": \"$CMK_ARN\"\n }\n },\n \"EnforceWorkGroupConfiguration\": true,\n \"PublishCloudWatchMetricsEnabled\": true,\n \"BytesScannedCutoffPerQuery\": $ANALYST_CAP,\n \"RequesterPaysEnabled\": false,\n \"EngineVersion\": {\n \"SelectedEngineVersion\": \"Athena engine version 3\"\n }\n },\n \"State\": \"ENABLED\",\n \"Tags\": [\n {\"Key\":\"team\",\"Value\":\"analytics\"},\n {\"Key\":\"role\",\"Value\":\"analyst\"}\n ]\n}\nEOF\n\ncat > /tmp/wg-admin.json <<EOF\n{\n \"Name\": \"harbor-admin\",\n \"Description\": \"Admin-facing workgroup for ad-hoc investigations with a higher scan cap.\",\n \"Configuration\": {\n \"ResultConfiguration\": {\n \"OutputLocation\": \"s3://$RESULTS_BUCKET/\",\n \"EncryptionConfiguration\": {\n \"EncryptionOption\": \"SSE_KMS\",\n \"KmsKey\": \"$CMK_ARN\"\n }\n },\n \"EnforceWorkGroupConfiguration\": true,\n \"PublishCloudWatchMetricsEnabled\": true,\n \"BytesScannedCutoffPerQuery\": $ADMIN_CAP,\n \"RequesterPaysEnabled\": false,\n \"EngineVersion\": {\n \"SelectedEngineVersion\": \"Athena engine version 3\"\n }\n },\n \"State\": \"ENABLED\",\n \"Tags\": [\n {\"Key\":\"team\",\"Value\":\"analytics\"},\n {\"Key\":\"role\",\"Value\":\"admin\"}\n ]\n}\nEOF\n\naws athena create-work-group --cli-input-json file:///tmp/wg-analyst.json\naws athena create-work-group --cli-input-json file:///tmp/wg-admin.json\n\naws athena get-work-group --work-group harbor-analytics --query 'WorkGroup.{Name:Name,State:State,Engine:Configuration.EngineVersion.SelectedEngineVersion,Enforce:Configuration.EnforceWorkGroupConfiguration,Cap:Configuration.BytesScannedCutoffPerQuery,KMS:Configuration.ResultConfiguration.EncryptionConfiguration,Out:Configuration.ResultConfiguration.OutputLocation,CW:Configuration.PublishCloudWatchMetricsEnabled}'\naws athena get-work-group --work-group harbor-admin --query 'WorkGroup.{Name:Name,State:State,Engine:Configuration.EngineVersion.SelectedEngineVersion,Enforce:Configuration.EnforceWorkGroupConfiguration,Cap:Configuration.BytesScannedCutoffPerQuery,KMS:Configuration.ResultConfiguration.EncryptionConfiguration,Out:Configuration.ResultConfiguration.OutputLocation,CW:Configuration.PublishCloudWatchMetricsEnabled}'",
"description": "Create both Athena workgroups"
}Exit code 254 aws: [ERROR]: An error occurred (ParamValidation): Parameter validation failed: Unknown parameter in input: "State", must be one of: Name, Configuration, Description, Tags aws: [ERROR]: An error occurred (ParamValidation): Parameter validation failed: Unknown parameter in input: "State", must be one of: Name, Configuration, Description, Tags aws: [ERROR]: An error occurred (ResourceNotFoundException) when calling the GetWorkGroup operation: Work Group named "harbor-analytics" not found aws: [ERROR]: An error occurred (ResourceNotFoundException) when calling the GetWorkGroup operation: Work Group named "harbor-admin" not found [error] tool reported failure
{
"query": "select:TodoWrite",
"max_results": 1
}{"type": "tool_reference", "tool_name": "TodoWrite"}
{
"todos": [
{
"content": "Create KMS CMK + alias",
"status": "completed",
"activeForm": "Creating KMS CMK + alias"
},
{
"content": "Create three S3 buckets with CMK SSE + PAB",
"status": "completed",
"activeForm": "Creating three S3 buckets with CMK SSE + PAB"
},
{
"content": "Apply bucket policies (results, audit-trail)",
"status": "completed",
"activeForm": "Applying bucket policies"
},
{
"content": "Create Glue DB + projected table",
"status": "completed",
"activeForm": "Creating Glue DB + projected table"
},
{
"content": "Create Glue crawler role + crawler",
"status": "completed",
"activeForm": "Creating Glue crawler role + crawler"
},
{
"content": "Create Athena workgroups (analyst + admin)",
"status": "in_progress",
"activeForm": "Creating Athena workgroups"
},
{
"content": "Create IAM analyst + admin roles",
"status": "pending",
"activeForm": "Creating IAM analyst + admin roles"
},
{
"content": "Create CloudTrail trail with data events",
"status": "pending",
"activeForm": "Creating CloudTrail trail with data events"
},
{
"content": "Best-effort Lake Formation tag classification",
"status": "pending",
"activeForm": "Configuring Lake Formation tag"
},
{
"content": "Publish SSM manifest",
"status": "pending",
"activeForm": "Publishing SSM manifest"
}
]
}Todos have been modified successfully. Ensure that you continue to use the todo list to track your progress. Please proceed with the current tasks if applicable
{
"command": "RESULTS_BUCKET=$(cat /tmp/harbor_results_bucket)\nCMK_ARN=$(cat /tmp/harbor_cmk_arn)\nANALYST_CAP=$(cat /tmp/harbor_analyst_cap)\nADMIN_CAP=$(cat /tmp/harbor_admin_cap)\n\ncat > /tmp/wg-analyst.json <<EOF\n{\n \"Name\": \"harbor-analytics\",\n \"Description\": \"Analyst-facing workgroup with bytes-scanned guardrail and enforced result config (KMS).\",\n \"Configuration\": {\n \"ResultConfiguration\": {\n \"OutputLocation\": \"s3://$RESULTS_BUCKET/\",\n \"EncryptionConfiguration\": {\n \"EncryptionOption\": \"SSE_KMS\",\n \"KmsKey\": \"$CMK_ARN\"\n }\n },\n \"EnforceWorkGroupConfiguration\": true,\n \"PublishCloudWatchMetricsEnabled\": true,\n \"BytesScannedCutoffPerQuery\": $ANALYST_CAP,\n \"RequesterPaysEnabled\": false,\n \"EngineVersion\": {\n \"SelectedEngineVersion\": \"Athena engine version 3\"\n }\n },\n \"Tags\": [\n {\"Key\":\"team\",\"Value\":\"analytics\"},\n {\"Key\":\"role\",\"Value\":\"analyst\"}\n ]\n}\nEOF\n\ncat > /tmp/wg-admin.json <<EOF\n{\n \"Name\": \"harbor-admin\",\n \"Description\": \"Admin-facing workgroup for ad-hoc investigations with a higher scan cap.\",\n \"Configuration\": {\n \"ResultConfiguration\": {\n \"OutputLocation\": \"s3://$RESULTS_BUCKET/\",\n \"EncryptionConfiguration\": {\n \"EncryptionOption\": \"SSE_KMS\",\n \"KmsKey\": \"$CMK_ARN\"\n }\n },\n \"EnforceWorkGroupConfiguration\": true,\n \"PublishCloudWatchMetricsEnabled\": true,\n \"BytesScannedCutoffPerQuery\": $ADMIN_CAP,\n \"RequesterPaysEnabled\": false,\n \"EngineVersion\": {\n \"SelectedEngineVersion\": \"Athena engine version 3\"\n }\n },\n \"Tags\": [\n {\"Key\":\"team\",\"Value\":\"analytics\"},\n {\"Key\":\"role\",\"Value\":\"admin\"}\n ]\n}\nEOF\n\naws athena create-work-group --cli-input-json file:///tmp/wg-analyst.json\naws athena create-work-group --cli-input-json file:///tmp/wg-admin.json\n# Make sure both are ENABLED (newly-created workgroups default to ENABLED but be safe)\naws athena update-work-group --work-group harbor-analytics --state ENABLED 2>&1 | tail -3\naws athena update-work-group --work-group harbor-admin --state ENABLED 2>&1 | tail -3\naws athena get-work-group --work-group harbor-analytics --query 'WorkGroup.{Name:Name,State:State,Engine:Configuration.EngineVersion.SelectedEngineVersion,Enforce:Configuration.EnforceWorkGroupConfiguration,Cap:Configuration.BytesScannedCutoffPerQuery,Enc:Configuration.ResultConfiguration.EncryptionConfiguration,Out:Configuration.ResultConfiguration.OutputLocation,CW:Configuration.PublishCloudWatchMetricsEnabled}'\naws athena get-work-group --work-group harbor-admin --query 'WorkGroup.{Name:Name,State:State,Engine:Configuration.EngineVersion.SelectedEngineVersion,Enforce:Configuration.EnforceWorkGroupConfiguration,Cap:Configuration.BytesScannedCutoffPerQuery,Enc:Configuration.ResultConfiguration.EncryptionConfiguration,Out:Configuration.ResultConfiguration.OutputLocation,CW:Configuration.PublishCloudWatchMetricsEnabled}'",
"description": "Recreate Athena workgroups without State"
}aws: [ERROR]: An error occurred (InternalFailure) when calling the UpdateWorkGroup operation: Sorry, the UpdateWorkGroup operation on the athena service is not currently supported by LocalStack.
aws: [ERROR]: An error occurred (InternalFailure) when calling the UpdateWorkGroup operation: Sorry, the UpdateWorkGroup operation on the athena service is not currently supported by LocalStack.
{
"Name": "harbor-analytics",
"State": "ENABLED",
"Engine": "Athena engine version 3",
"Enforce": true,
"Cap": 10737418240,
"Enc": {
"EncryptionOption": "SSE_KMS",
"KmsKey": "arn:aws:kms:us-east-1:000000000000:key/1d7bfd6a-428e-48ee-8558-c3c8e312f8b1"
},
"Out": "s3://harbor-athena-results-9ebb00/",
"CW": true
}
{
"Name": "harbor-admin",
"State": "ENABLED",
"Engine": "Athena engine version 3",
"Enforce": true,
"Cap": 107374182400,
"Enc": {
"EncryptionOption": "SSE_KMS",
"KmsKey": "arn:aws:kms:us-east-1:000000000000:key/1d7bfd6a-428e-48ee-8558-c3c8e312f8b1"
},
"Out": "s3://harbor-athena-results-9ebb00/",
"CW": true
}
[stdout]
aws: [ERROR]: An error occurred (InternalFailure) when calling the UpdateWorkGroup operation: Sorry, the UpdateWorkGroup operation on the athena service is not currently supported by LocalStack.
aws: [ERROR]: An error occurred (InternalFailure) when calling the UpdateWorkGroup operation: Sorry, the UpdateWorkGroup operation on the athena service is not currently supported by LocalStack.
{
"Name": "harbor-analytics",
"State": "ENABLED",
"Engine": "Athena engine version 3",
"Enforce": true,
"Cap": 10737418240,
"Enc": {
"EncryptionOption": "SSE_KMS",
"KmsKey": "arn:aws:kms:us-east-1:000000000000:key/1d7bfd6a-428e-48ee-8558-c3c8e312f8b1"
},
"Out": "s3://harbor-athena-results-9ebb00/",
"CW": true
}
{
"Name": "harbor-admin",
"State": "ENABLED",
"Engine": "Athena engine version 3",
"Enforce": true,
"Cap": 107374182400,
"Enc": {
"EncryptionOption": "SSE_KMS",
"KmsKey": "arn:aws:kms:us-east-1:000000000000:key/1d7bfd6a-428e-48ee-8558-c3c8e312f8b1"
},
"Out": "s3://harbor-athena-results-9ebb00/",
"CW": true
}{
"command": "RESULTS_BUCKET=$(cat /tmp/harbor_results_bucket)\nDATA_BUCKET=$(cat /tmp/harbor_data_bucket)\nCMK_ARN=$(cat /tmp/harbor_cmk_arn)\n\ncat > /tmp/role-trust.json <<'EOF'\n{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Effect\": \"Allow\",\n \"Principal\": { \"AWS\": \"arn:aws:iam::000000000000:root\" },\n \"Action\": \"sts:AssumeRole\"\n }\n ]\n}\nEOF\n\naws iam create-role --role-name harbor-athena-analyst-role --assume-role-policy-document file:///tmp/role-trust.json --description \"Harbor Athena analyst role\" 2>&1 | tail -3\naws iam create-role --role-name harbor-athena-admin-role --assume-role-policy-document file:///tmp/role-trust.json --description \"Harbor Athena admin role\" 2>&1 | tail -3\n\ncat > /tmp/analyst-policy.json <<EOF\n{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Sid\": \"AthenaQueryOnAnalyticsWorkgroupOnly\",\n \"Effect\": \"Allow\",\n \"Action\": [\n \"athena:StartQueryExecution\",\n \"athena:StopQueryExecution\",\n \"athena:GetQueryExecution\",\n \"athena:GetQueryResults\",\n \"athena:GetQueryResultsStream\",\n \"athena:ListQueryExecutions\",\n \"athena:BatchGetQueryExecution\",\n \"athena:GetWorkGroup\",\n \"athena:ListNamedQueries\",\n \"athena:GetNamedQuery\",\n \"athena:CreatePreparedStatement\",\n \"athena:GetPreparedStatement\",\n \"athena:DeletePreparedStatement\"\n ],\n \"Resource\": \"arn:aws:athena:us-east-1:000000000000:workgroup/harbor-analytics\"\n },\n {\n \"Sid\": \"DenyDefaultPrimaryWorkgroup\",\n \"Effect\": \"Deny\",\n \"Action\": \"athena:*\",\n \"Resource\": \"arn:aws:athena:us-east-1:000000000000:workgroup/primary\"\n },\n {\n \"Sid\": \"GlueReadCatalog\",\n \"Effect\": \"Allow\",\n \"Action\": [\n \"glue:GetDatabase\",\n \"glue:GetDatabases\",\n \"glue:GetTable\",\n \"glue:GetTables\",\n \"glue:GetPartition\",\n \"glue:GetPartitions\"\n ],\n \"Resource\": [\n \"arn:aws:glue:us-east-1:000000000000:catalog\",\n \"arn:aws:glue:us-east-1:000000000000:database/harbor_analytics_db\",\n \"arn:aws:glue:us-east-1:000000000000:table/harbor_analytics_db/*\"\n ]\n },\n {\n \"Sid\": \"S3ResultsBucket\",\n \"Effect\": \"Allow\",\n \"Action\": [\n \"s3:GetBucketLocation\",\n \"s3:GetBucketAcl\",\n \"s3:ListBucket\",\n \"s3:ListBucketMultipartUploads\",\n \"s3:GetObject\",\n \"s3:PutObject\",\n \"s3:AbortMultipartUpload\",\n \"s3:ListMultipartUploadParts\"\n ],\n \"Resource\": [\n \"arn:aws:s3:::$RESULTS_BUCKET\",\n \"arn:aws:s3:::$RESULTS_BUCKET/*\"\n ]\n },\n {\n \"Sid\": \"S3DataBucketReadOnly\",\n \"Effect\": \"Allow\",\n \"Action\": [\n \"s3:GetBucketLocation\",\n \"s3:ListBucket\",\n \"s3:GetObject\"\n ],\n \"Resource\": [\n \"arn:aws:s3:::$DATA_BUCKET\",\n \"arn:aws:s3:::$DATA_BUCKET/*\"\n ]\n },\n {\n \"Sid\": \"KmsForCmkOnly\",\n \"Effect\": \"Allow\",\n \"Action\": [\n \"kms:GenerateDataKey\",\n \"kms:Decrypt\",\n \"kms:DescribeKey\"\n ],\n \"Resource\": \"$CMK_ARN\"\n }\n ]\n}\nEOF\n\naws iam put-role-policy --role-name harbor-athena-analyst-role --policy-name harbor-analyst-inline --policy-document file:///tmp/analyst-policy.json\n\ncat > /tmp/admin-policy.json <<EOF\n{\n \"Version\": \"2012-10-17\",\n \"Statement\": [\n {\n \"Sid\": \"AthenaQueryOnBothWorkgroups\",\n \"Effect\": \"Allow\",\n \"Action\": [\n \"athena:StartQueryExecution\",\n \"athena:StopQueryExecution\",\n \"athena:GetQueryExecution\",\n \"athena:GetQueryResults\",\n \"athena:GetQueryResultsStream\",\n \"athena:ListQueryExec
…[truncated]}
}
}
}
}
}
ANALYST: arn:aws:iam::000000000000:role/harbor-athena-analyst-role
ADMIN: arn:aws:iam::000000000000:role/harbor-athena-admin-role
[stdout]
}
}
}
}
}
}
ANALYST: arn:aws:iam::000000000000:role/harbor-athena-analyst-role
ADMIN: arn:aws:iam::000000000000:role/harbor-athena-admin-role{
"todos": [
{
"content": "Create KMS CMK + alias",
"status": "completed",
"activeForm": "Creating KMS CMK + alias"
},
{
"content": "Create three S3 buckets with CMK SSE + PAB",
"status": "completed",
"activeForm": "Creating three S3 buckets with CMK SSE + PAB"
},
{
"content": "Apply bucket policies (results, audit-trail)",
"status": "completed",
"activeForm": "Applying bucket policies"
},
{
"content": "Create Glue DB + projected table",
"status": "completed",
"activeForm": "Creating Glue DB + projected table"
},
{
"content": "Create Glue crawler role + crawler",
"status": "completed",
"activeForm": "Creating Glue crawler role + crawler"
},
{
"content": "Create Athena workgroups (analyst + admin)",
"status": "completed",
"activeForm": "Creating Athena workgroups"
},
{
"content": "Create IAM analyst + admin roles",
"status": "completed",
"activeForm": "Creating IAM analyst + admin roles"
},
{
"content": "Create CloudTrail trail with data events",
"status": "in_progress",
"activeForm": "Creating CloudTrail trail with data events"
},
{
"content": "Best-effort Lake Formation tag classification",
"status": "pending",
"activeForm": "Configuring Lake Formation tag"
},
{
"content": "Publish SSM manifest",
"status": "pending",
"activeForm": "Publishing SSM manifest"
}
]
}Todos have been modified successfully. Ensure that you continue to use the todo list to track your progress. Please proceed with the current tasks if applicable
{
"command": "TRAIL_BUCKET=$(cat /tmp/harbor_trail_bucket)\nRESULTS_BUCKET=$(cat /tmp/harbor_results_bucket)\n\naws cloudtrail create-trail \\\n --name harbor-athena-audit-trail \\\n --s3-bucket-name \"$TRAIL_BUCKET\" \\\n --is-multi-region-trail \\\n --include-global-service-events \\\n --enable-log-file-validation 2>&1 | tail -10\n\ncat > /tmp/aes.json <<EOF\n[\n {\n \"Name\": \"Capture S3 data events on Athena results bucket\",\n \"FieldSelectors\": [\n { \"Field\": \"eventCategory\", \"Equals\": [\"Data\"] },\n { \"Field\": \"resources.type\", \"Equals\": [\"AWS::S3::Object\"] },\n { \"Field\": \"resources.ARN\", \"StartsWith\": [\"arn:aws:s3:::$RESULTS_BUCKET/\"] }\n ]\n },\n {\n \"Name\": \"All management events\",\n \"FieldSelectors\": [\n { \"Field\": \"eventCategory\", \"Equals\": [\"Management\"] }\n ]\n }\n]\nEOF\n\naws cloudtrail put-event-selectors \\\n --trail-name harbor-athena-audit-trail \\\n --advanced-event-selectors file:///tmp/aes.json 2>&1 | tail -30\n\naws cloudtrail start-logging --name harbor-athena-audit-trail\naws cloudtrail get-trail-status --name harbor-athena-audit-trail --query '{Logging:IsLogging}'\naws cloudtrail get-event-selectors --trail-name harbor-athena-audit-trail --query '{Adv:AdvancedEventSelectors}'",
"description": "Create CloudTrail trail and add S3 data events"
}{
"Name": "harbor-athena-audit-trail",
"S3BucketName": "harbor-athena-trail-9ebb00",
"IncludeGlobalServiceEvents": true,
"IsMultiRegionTrail": true,
"TrailARN": "arn:aws:cloudtrail:us-east-1:000000000000:trail/harbor-athena-audit-trail",
"LogFileValidationEnabled": true,
"IsOrganizationTrail": false
}
"Data"
]
},
{
"Field": "resources.type",
"Equals": [
"AWS::S3::Object"
]
},
{
"Field": "resources.ARN",
"StartsWith": [
"arn:aws:s3:::harbor-athena-results-9ebb00/"
]
}
]
},
{
"Name": "All management events",
"FieldSelectors": [
{
"Field": "eventCategory",
"Equals": [
"Management"
]
}
]
}
]
}
{
"Logging": true
}
{
"Adv": null
}
[stdout]
{
"Name": "harbor-athena-audit-trail",
"S3BucketName": "harbor-athena-trail-9ebb00",
"IncludeGlobalServiceEvents": true,
"IsMultiRegionTrail": true,
"TrailARN": "arn:aws:cloudtrail:us-east-1:000000000000:trail/harbor-athena-audit-trail",
"LogFileValidationEnabled": true,
"IsOrganizationTrail": false
}
"Data"
]
},
{
"Field": "resources.type",
"Equals": [
"AWS::S3::Object"
]
},
{
"Field": "resources.ARN",
"StartsWith": [
"arn:aws:s3:::harbor-athena-results-9ebb00/"
]
}
]
},
{
"Name": "All management events",
"FieldSelectors": [
{
"Field": "eventCategory",
"Equals": [
"Management"
]
}
]
}
]
}
{
"Logging": true
}
{
"Adv": null
}{
"command": "aws cloudtrail get-event-selectors --trail-name harbor-athena-audit-trail",
"description": "Verify event selectors persisted"
}{
"TrailARN": "arn:aws:cloudtrail:us-east-1:000000000000:trail/harbor-athena-audit-trail",
"EventSelectors": []
}
[stdout]
{
"TrailARN": "arn:aws:cloudtrail:us-east-1:000000000000:trail/harbor-athena-audit-trail",
"EventSelectors": []
}{
"command": "RESULTS_BUCKET=$(cat /tmp/harbor_results_bucket)\n\ncat > /tmp/es.json <<EOF\n[\n {\n \"ReadWriteType\": \"All\",\n \"IncludeManagementEvents\": true,\n \"DataResources\": [\n {\n \"Type\": \"AWS::S3::Object\",\n \"Values\": [\"arn:aws:s3:::$RESULTS_BUCKET/\"]\n }\n ]\n }\n]\nEOF\naws cloudtrail put-event-selectors --trail-name harbor-athena-audit-trail --event-selectors file:///tmp/es.json\naws cloudtrail get-event-selectors --trail-name harbor-athena-audit-trail",
"description": "Set classic event selectors with S3 data resource"
}{
"TrailARN": "arn:aws:cloudtrail:us-east-1:000000000000:trail/harbor-athena-audit-trail",
"EventSelectors": [
{
"ReadWriteType": "All",
"IncludeManagementEvents": true,
"DataResources": [
{
"Type": "AWS::S3::Object",
"Values": [
"arn:aws:s3:::harbor-athena-results-9ebb00/"
]
}
]
}
],
"AdvancedEventSelectors": []
}
{
"TrailARN": "arn:aws:cloudtrail:us-east-1:000000000000:trail/harbor-athena-audit-trail",
"EventSelectors": [
{
"ReadWriteType": "All",
"IncludeManagementEvents": true,
"DataResources": [
{
"Type": "AWS::S3::Object",
"Values": [
"arn:aws:s3:::harbor-athena-results-9ebb00/"
]
}
]
}
]
}
[stdout]
{
"TrailARN": "arn:aws:cloudtrail:us-east-1:000000000000:trail/harbor-athena-audit-trail",
"EventSelectors": [
{
"ReadWriteType": "All",
"IncludeManagementEvents": true,
"DataResources": [
{
"Type": "AWS::S3::Object",
"Values": [
"arn:aws:s3:::harbor-athena-results-9ebb00/"
]
}
]
}
],
"AdvancedEventSelectors": []
}
{
"TrailARN": "arn:aws:cloudtrail:us-east-1:000000000000:trail/harbor-athena-audit-trail",
"EventSelectors": [
{
"ReadWriteType": "All",
"IncludeManagementEvents": true,
"DataResources": [
{
"Type": "AWS::S3::Object",
"Values": [
"arn:aws:s3:::harbor-athena-results-9ebb00/"
]
}
]
}
]
}{
"command": "aws cloudtrail put-event-selectors \\\n --trail-name harbor-athena-audit-trail \\\n --advanced-event-selectors file:///tmp/aes.json\naws cloudtrail get-event-selectors --trail-name harbor-athena-audit-trail",
"description": "Re-attempt advanced event selectors"
}{
"TrailARN": "arn:aws:cloudtrail:us-east-1:000000000000:trail/harbor-athena-audit-trail",
"EventSelectors": [],
"AdvancedEventSelectors": [
{
"Name": "Capture S3 data events on Athena results bucket",
"FieldSelectors": [
{
"Field": "eventCategory",
"Equals": [
"Data"
]
},
{
"Field": "resources.type",
"Equals": [
"AWS::S3::Object"
]
},
{
"Field": "resources.ARN",
"StartsWith": [
"arn:aws:s3:::harbor-athena-results-9ebb00/"
]
}
]
},
{
"Name": "All management events",
"FieldSelectors": [
{
"Field": "eventCategory",
"Equals": [
"Management"
]
}
]
}
]
}
{
"TrailARN": "arn:aws:cloudtrail:us-east-1:000000000000:trail/harbor-athena-audit-trail",
"EventSelectors": [
{
"ReadWriteType": "All",
"IncludeManagementEvents": true,
"DataResources": [
{
"Type": "AWS::S3::Object",
"Values": [
"arn:aws:s3:::harbor-athena-results-9ebb00/"
]
}
]
}
]
}
[stdout]
{
"TrailARN": "arn:aws:cloudtrail:us-east-1:000000000000:trail/harbor-athena-audit-trail",
"EventSelectors": [],
"AdvancedEventSelectors": [
{
"Name": "Capture S3 data events on Athena results bucket",
"FieldSelectors": [
{
"Field": "eventCategory",
"Equals": [
"Data"
]
},
{
"Field": "resources.type",
"Equals": [
"AWS::S3::Object"
]
},
{
"Field": "resources.ARN",
"StartsWith": [
"arn:aws:s3:::harbor-athena-results-9ebb00/"
]
}
]
},
{
"Name": "All management events",
"FieldSelectors": [
{
"Field": "eventCategory",
"Equals": [
"Management"
]
}
]
}
]
}
{
"TrailARN": "arn:aws:cloudtrail:us-east-1:000000000000:trail/harbor-athena-audit-trail",
"EventSelectors": [
{
"ReadWriteType": "All",
"IncludeManagementEvents": true,
"DataResources": [
{
"Type": "AWS::S3::Object",
"Values": [
"arn:aws:s3:::harbor-athena-results-9ebb00/"
]
}
]
}
]
}{
"command": "aws cloudtrail get-event-selectors --trail-name harbor-athena-audit-trail\necho \"---\"\naws cloudtrail get-trail --name harbor-athena-audit-trail\necho \"---\"\naws cloudtrail get-trail-status --name harbor-athena-audit-trail",
"description": "Inspect trail full state"
}{
"TrailARN": "arn:aws:cloudtrail:us-east-1:000000000000:trail/harbor-athena-audit-trail",
"EventSelectors": [
{
"ReadWriteType": "All",
"IncludeManagementEvents": true,
"DataResources": [
{
"Type": "AWS::S3::Object",
"Values": [
"arn:aws:s3:::harbor-athena-results-9ebb00/"
]
}
]
}
]
}
---
{
"Trail": {
"Name": "harbor-athena-audit-trail",
"S3BucketName": "harbor-athena-trail-9ebb00",
"IncludeGlobalServiceEvents": true,
"IsMultiRegionTrail": true,
"TrailARN": "arn:aws:cloudtrail:us-east-1:000000000000:trail/harbor-athena-audit-trail",
"LogFileValidationEnabled": true,
"IsOrganizationTrail": false
}
}
---
{
"IsLogging": true,
"StartLoggingTime": "2026-05-09T21:42:06.442000+00:00",
"LatestDeliveryAttemptTime": "",
"LatestNotificationAttemptTime": "",
"LatestNotificationAttemptSucceeded": "",
"LatestDeliveryAttemptSucceeded": "",
"TimeLoggingStarted": "2026-05-09T21:42:06Z",
"TimeLoggingStopped": ""
}
[stdout]
{
"TrailARN": "arn:aws:cloudtrail:us-east-1:000000000000:trail/harbor-athena-audit-trail",
"EventSelectors": [
{
"ReadWriteType": "All",
"IncludeManagementEvents": true,
"DataResources": [
{
"Type": "AWS::S3::Object",
"Values": [
"arn:aws:s3:::harbor-athena-results-9ebb00/"
]
}
]
}
]
}
---
{
"Trail": {
"Name": "harbor-athena-audit-trail",
"S3BucketName": "harbor-athena-trail-9ebb00",
"IncludeGlobalServiceEvents": true,
"IsMultiRegionTrail": true,
"TrailARN": "arn:aws:cloudtrail:us-east-1:000000000000:trail/harbor-athena-audit-trail",
"LogFileValidationEnabled": true,
"IsOrganizationTrail": false
}
}
---
{
"IsLogging": true,
"StartLoggingTime": "2026-05-09T21:42:06.442000+00:00",
"LatestDeliveryAttemptTime": "",
"LatestNotificationAttemptTime": "",
"LatestNotificationAttemptSucceeded": "",
"LatestDeliveryAttemptSucceeded": "",
"TimeLoggingStarted": "2026-05-09T21:42:06Z",
"TimeLoggingStopped": ""
}{
"todos": [
{
"content": "Create KMS CMK + alias",
"status": "completed",
"activeForm": "Creating KMS CMK + alias"
},
{
"content": "Create three S3 buckets with CMK SSE + PAB",
"status": "completed",
"activeForm": "Creating three S3 buckets with CMK SSE + PAB"
},
{
"content": "Apply bucket policies (results, audit-trail)",
"status": "completed",
"activeForm": "Applying bucket policies"
},
{
"content": "Create Glue DB + projected table",
"status": "completed",
"activeForm": "Creating Glue DB + projected table"
},
{
"content": "Create Glue crawler role + crawler",
"status": "completed",
"activeForm": "Creating Glue crawler role + crawler"
},
{
"content": "Create Athena workgroups (analyst + admin)",
"status": "completed",
"activeForm": "Creating Athena workgroups"
},
{
"content": "Create IAM analyst + admin roles",
"status": "completed",
"activeForm": "Creating IAM analyst + admin roles"
},
{
"content": "Create CloudTrail trail with data events",
"status": "completed",
"activeForm": "Creating CloudTrail trail with data events"
},
{
"content": "Best-effort Lake Formation tag classification",
"status": "in_progress",
"activeForm": "Configuring Lake Formation tag"
},
{
"content": "Publish SSM manifest",
"status": "pending",
"activeForm": "Publishing SSM manifest"
}
]
}Todos have been modified successfully. Ensure that you continue to use the todo list to track your progress. Please proceed with the current tasks if applicable
{
"command": "aws lakeformation create-lf-tag --tag-key classification --tag-values public pii restricted 2>&1 | tail -5\naws lakeformation get-lf-tag --tag-key classification 2>&1 | tail -10\naws lakeformation list-lf-tags 2>&1 | tail -20",
"description": "Best-effort Lake Formation tag"
}aws: [ERROR]: An error occurred (InternalFailure) when calling the CreateLFTag operation: Sorry, the CreateLFTag operation on the lakeformation service is not currently supported by LocalStack. aws: [ERROR]: An error occurred (InternalFailure) when calling the GetLFTag operation: Sorry, the GetLFTag operation on the lakeformation service is not currently supported by LocalStack. aws: [ERROR]: An error occurred (InternalFailure) when calling the ListLFTags operation: Sorry, the ListLFTags operation on the lakeformation service is not currently supported by LocalStack. [stdout] aws: [ERROR]: An error occurred (InternalFailure) when calling the CreateLFTag operation: Sorry, the CreateLFTag operation on the lakeformation service is not currently supported by LocalStack. aws: [ERROR]: An error occurred (InternalFailure) when calling the GetLFTag operation: Sorry, the GetLFTag operation on the lakeformation service is not currently supported by LocalStack. aws: [ERROR]: An error occurred (InternalFailure) when calling the ListLFTags operation: Sorry, the ListLFTags operation on the lakeformation service is not currently supported by LocalStack.
{
"command": "SUFFIX=$(cat /tmp/harbor_suffix)\nCMK_ARN=$(cat /tmp/harbor_cmk_arn)\nRESULTS_BUCKET=$(cat /tmp/harbor_results_bucket)\nDATA_BUCKET=$(cat /tmp/harbor_data_bucket)\nTRAIL_BUCKET=$(cat /tmp/harbor_trail_bucket)\nANALYST_ROLE_ARN=$(cat /tmp/harbor_analyst_role_arn)\nADMIN_ROLE_ARN=$(cat /tmp/harbor_admin_role_arn)\nANALYST_CAP=$(cat /tmp/harbor_analyst_cap)\nADMIN_CAP=$(cat /tmp/harbor_admin_cap)\nGLUE_ROLE_ARN=$(cat /tmp/harbor_glue_role_arn)\n\nput() {\n aws ssm put-parameter --name \"$1\" --type String --value \"$2\" --overwrite >/dev/null\n echo \" $1 = $2\"\n}\n\nput /harbor/athena/workgroup-name \"harbor-analytics\"\nput /harbor/athena/admin-workgroup-name \"harbor-admin\"\nput /harbor/athena/database \"harbor_analytics_db\"\nput /harbor/athena/table \"harbor_orders\"\nput /harbor/athena/cmk-arn \"$CMK_ARN\"\nput /harbor/athena/result-bucket \"$RESULTS_BUCKET\"\nput /harbor/athena/data-bucket \"$DATA_BUCKET\"\nput /harbor/athena/analyst-role-arn \"$ANALYST_ROLE_ARN\"\nput /harbor/athena/admin-role-arn \"$ADMIN_ROLE_ARN\"\nput /harbor/athena/output-location \"s3://$RESULTS_BUCKET/\"\nput /harbor/athena/bytes-scanned-cap \"$ANALYST_CAP\"\nput /harbor/athena/admin-bytes-scanned-cap \"$ADMIN_CAP\"\nput /harbor/athena/crawler-name \"harbor-orders-crawler\"\nput /harbor/athena/glue-role-arn \"$GLUE_ROLE_ARN\"\nput /harbor/athena/trail-name \"harbor-athena-audit-trail\"\nput /harbor/athena/trail-bucket \"$TRAIL_BUCKET\"\nput /harbor/athena/lf-tag-key \"classification\"\n\necho \"----\"\naws ssm get-parameters-by-path --path /harbor/athena --query 'Parameters[].{Name:Name,Value:Value}' --output table",
"description": "Publish SSM manifest"
}/harbor/athena/workgroup-name = harbor-analytics /harbor/athena/admin-workgroup-name = harbor-admin /harbor/athena/database = harbor_analytics_db /harbor/athena/table = harbor_orders /harbor/athena/cmk-arn = arn:aws:kms:us-east-1:000000000000:key/1d7bfd6a-428e-48ee-8558-c3c8e312f8b1 /harbor/athena/result-bucket = harbor-athena-results-9ebb00 /harbor/athena/data-bucket = harbor-athena-data-9ebb00 /harbor/athena/analyst-role-arn = arn:aws:iam::000000000000:role/harbor-athena-analyst-role /harbor/athena/admin-role-arn = arn:aws:iam::000000000000:role/harbor-athena-admin-role /harbor/athena/output-location = s3://harbor-athena-results-9ebb00/ /harbor/athena/bytes-scanned-cap = 10737418240 /harbor/athena/admin-bytes-scanned-cap = 107374182400 /harbor/athena/crawler-name = harbor-orders-crawler /harbor/athena/glue-role-arn = arn:aws:iam::000000000000:role/harbor-glue-crawler-role /harbor/athena/trail-name = harbor-athena-audit-trail /harbor/athena/trail-bucket = harbor-athena-trail-9ebb00 /harbor/athena/lf-tag-key = classification ---- --------------------------------------------------------------------------------------------------------------------------- | GetParametersByPath | +-----------------------------------------+-------------------------------------------------------------------------------+ | Name | Value | +-----------------------------------------+-------------------------------------------------------------------------------+ | /harbor/athena/workgroup-name | harbor-analytics | | /harbor/athena/admin-workgroup-name | harbor-admin | | /harbor/athena/database | harbor_analytics_db | | /harbor/athena/table | harbor_orders | | /harbor/athena/cmk-arn | arn:aws:kms:us-east-1:000000000000:key/1d7bfd6a-428e-48ee-8558-c3c8e312f8b1 | | /harbor/athena/result-bucket | harbor-athena-results-9ebb00 | | /harbor/athena/data-bucket | harbor-athena-data-9ebb00 | | /harbor/athena/analyst-role-arn | arn:aws:iam::000000000000:role/harbor-athena-analyst-role | | /harbor/athena/admin-role-arn | arn:aws:iam::000000000000:role/harbor-athena-admin-role | | /harbor/athena/output-location | s3://harbor-athena-results-9ebb00/ | | /harbor/athena/bytes-scanned-cap | 10737418240 | | /harbor/athena/admin-bytes-scanned-cap | 107374182400 | | /harbor/athena/crawler-name | harbor-orders-crawler | | /harbor/athena/glue-role-arn | arn:aws:iam::000000000000:role/harbor-glue-crawler-role | | /harbor/athena/trail-name | harbor-athena-audit-trail | | /harbor/athena/trail-bucket | harbor-athena-trail-9ebb00 | | /harbor/athena/lf-tag-key | classification | +-----------------------------------------+-------------------------------------------------------------------------------+ [stdout] /harbor/athena/workgroup-name = harbor-analytics /harbor …[truncated]
{
"todos": [
{
"content": "Create KMS CMK + alias",
"status": "completed",
"activeForm": "Creating KMS CMK + alias"
},
{
"content": "Create three S3 buckets with CMK SSE + PAB",
"status": "completed",
"activeForm": "Creating three S3 buckets with CMK SSE + PAB"
},
{
"content": "Apply bucket policies (results, audit-trail)",
"status": "completed",
"activeForm": "Applying bucket policies"
},
{
"content": "Create Glue DB + projected table",
"status": "completed",
"activeForm": "Creating Glue DB + projected table"
},
{
"content": "Create Glue crawler role + crawler",
"status": "completed",
"activeForm": "Creating Glue crawler role + crawler"
},
{
"content": "Create Athena workgroups (analyst + admin)",
"status": "completed",
"activeForm": "Creating Athena workgroups"
},
{
"content": "Create IAM analyst + admin roles",
"status": "completed",
"activeForm": "Creating IAM analyst + admin roles"
},
{
"content": "Create CloudTrail trail with data events",
"status": "completed",
"activeForm": "Creating CloudTrail trail with data events"
},
{
"content": "Best-effort Lake Formation tag classification",
"status": "completed",
"activeForm": "Configuring Lake Formation tag"
},
{
"content": "Publish SSM manifest",
"status": "completed",
"activeForm": "Publishing SSM manifest"
},
{
"content": "Final verification across all services",
"status": "in_progress",
"activeForm": "Verifying end state"
}
]
}Todos have been modified successfully. Ensure that you continue to use the todo list to track your progress. Please proceed with the current tasks if applicable
{
"command": "CMK_ARN=$(cat /tmp/harbor_cmk_arn)\necho \"=== KMS alias ===\"\naws kms list-aliases --query 'Aliases[?AliasName==`alias/harbor-athena-cmk`].{Alias:AliasName,Target:TargetKeyId}'\n\necho \"=== S3 buckets, encryption, PAB ===\"\nfor B in $(cat /tmp/harbor_results_bucket) $(cat /tmp/harbor_data_bucket) $(cat /tmp/harbor_trail_bucket); do\n echo \"-- $B --\"\n aws s3api get-bucket-encryption --bucket \"$B\" --query 'ServerSideEncryptionConfiguration.Rules[0].ApplyServerSideEncryptionByDefault'\n aws s3api get-public-access-block --bucket \"$B\" --query 'PublicAccessBlockConfiguration'\ndone\n\necho \"=== Glue ===\"\naws glue get-database --name harbor_analytics_db --query 'Database.Name'\naws glue get-table --database-name harbor_analytics_db --name harbor_orders --query 'Table.{Name:Name,Type:TableType,Cols:StorageDescriptor.Columns[].Name,Parts:PartitionKeys[].Name,Tpl:Parameters.\"storage.location.template\"}'\naws glue get-crawler --name harbor-orders-crawler --query 'Crawler.{Name:Name,Recrawl:RecrawlPolicy.RecrawlBehavior,Schema:SchemaChangePolicy.UpdateBehavior}'\n\necho \"=== Athena workgroups ===\"\nfor WG in harbor-analytics harbor-admin; do\n aws athena get-work-group --work-group \"$WG\" --query 'WorkGroup.{Name:Name,State:State,Engine:Configuration.EngineVersion.SelectedEngineVersion,Enforce:Configuration.EnforceWorkGroupConfiguration,Cap:Configuration.BytesScannedCutoffPerQuery,KMS:Configuration.ResultConfiguration.EncryptionConfiguration.KmsKey,Out:Configuration.ResultConfiguration.OutputLocation,CW:Configuration.PublishCloudWatchMetricsEnabled,Desc:Description}'\ndone\n\necho \"=== IAM roles ===\"\naws iam get-role --role-name harbor-athena-analyst-role --query 'Role.Arn'\naws iam get-role-policy --role-name harbor-athena-analyst-role --policy-name harbor-analyst-inline --query 'PolicyDocument.Statement[].Sid'\naws iam get-role --role-name harbor-athena-admin-role --query 'Role.Arn'\naws iam get-role-policy --role-name harbor-athena-admin-role --policy-name harbor-admin-inline --query 'PolicyDocument.Statement[].Sid'\naws iam get-role --role-name harbor-glue-crawler-role --query 'Role.Arn'\n\necho \"=== CloudTrail ===\"\naws cloudtrail get-trail --name harbor-athena-audit-trail --query 'Trail.{Name:Name,Bucket:S3BucketName,Multi:IsMultiRegionTrail}'\naws cloudtrail get-trail-status --name harbor-athena-audit-trail --query '{IsLogging:IsLogging}'\naws cloudtrail get-event-selectors --trail-name harbor-athena-audit-trail --query '{Classic:EventSelectors[].DataResources,Adv:AdvancedEventSelectors[].FieldSelectors}'\n\necho \"=== SSM keys ===\"\naws ssm get-parameters-by-path --path /harbor/athena --query 'Parameters[].Name' --output text | tr '\\t' '\\n' | sort",
"description": "End-to-end verification"
}=== KMS alias ===
[
{
"Alias": "alias/harbor-athena-cmk",
"Target": "1d7bfd6a-428e-48ee-8558-c3c8e312f8b1"
}
]
=== S3 buckets, encryption, PAB ===
-- harbor-athena-results-9ebb00 --
{
"SSEAlgorithm": "aws:kms",
"KMSMasterKeyID": "arn:aws:kms:us-east-1:000000000000:key/1d7bfd6a-428e-48ee-8558-c3c8e312f8b1"
}
{
"BlockPublicAcls": true,
"IgnorePublicAcls": true,
"BlockPublicPolicy": true,
"RestrictPublicBuckets": true
}
-- harbor-athena-data-9ebb00 --
{
"SSEAlgorithm": "aws:kms",
"KMSMasterKeyID": "arn:aws:kms:us-east-1:000000000000:key/1d7bfd6a-428e-48ee-8558-c3c8e312f8b1"
}
{
"BlockPublicAcls": true,
"IgnorePublicAcls": true,
"BlockPublicPolicy": true,
"RestrictPublicBuckets": true
}
-- harbor-athena-trail-9ebb00 --
{
"SSEAlgorithm": "aws:kms",
"KMSMasterKeyID": "arn:aws:kms:us-east-1:000000000000:key/1d7bfd6a-428e-48ee-8558-c3c8e312f8b1"
}
{
"BlockPublicAcls": true,
"IgnorePublicAcls": true,
"BlockPublicPolicy": true,
"RestrictPublicBuckets": true
}
=== Glue ===
"harbor_analytics_db"
{
"Name": "harbor_orders",
"Type": "EXTERNAL_TABLE",
"Cols": [
"order_id",
"customer_id",
"amount",
"status"
],
"Parts": [
"region",
"dt"
],
"Tpl": "s3://harbor-athena-data-9ebb00/harbor_orders/region=${region}/dt=${dt}/"
}
{
"Name": "harbor-orders-crawler",
"Recrawl": "CRAWL_NEW_FOLDERS_ONLY",
"Schema": "LOG"
}
=== Athena workgroups ===
{
"Name": "harbor-analytics",
"State": "ENABLED",
"Engine": "Athena engine version 3",
"Enforce": true,
"Cap": 10737418240,
"KMS": "arn:aws:kms:us-east-1:000000000000:key/1d7bfd6a-428e-48ee-8558-c3c8e312f8b1",
"Out": "s3://harbor-athena-results-9ebb00/",
"CW": true,
"Desc": "Analyst-facing workgroup with bytes-scanned guardrail and enforced result config (KMS)."
}
{
"Name": "harbor-admin",
"State": "ENABLED",
"Engine": "Athena engine version 3",
"Enforce": true,
"Cap": 107374182400,
"KMS": "arn:aws:kms:us-east-1:000000000000:key/1d7bfd6a-428e-48ee-8558-c3c8e312f8b1",
"Out": "s3://harbor-athena-results-9ebb00/",
"CW": true,
"Desc": "Admin-facing workgroup for ad-hoc investigations with a higher scan cap."
}
=== IAM roles ===
"arn:aws:iam::000000000000:role/harbor-athena-analyst-role"
[
"AthenaQueryOnAnalyticsWorkgroupOnly",
"DenyDefaultPrimaryWorkgroup",
"GlueReadCatalog",
"S3ResultsBucket",
"S3DataBucketReadOnly",
"KmsForCmkOnly"
]
"arn:aws:iam::000000000000:role/harbor-athena-admin-role"
[
"AthenaQueryOnBothWorkgroups",
"DenyDefaultPrimaryWorkgroup",
"GlueReadCatalog",
"S3ResultsBucket",
"S3DataBucket",
"KmsForCmkOnly"
]
"arn:aws:iam::000000000000:role/harbor-glue-crawler-role"
=== CloudTrail ===
{
"Name": "harbor-athena-audit-trail",
"Bucket": "harbor-athena-trail-9ebb00",
"Multi": true
}
{
"IsLogging": true
}
{
"Classic": [
[
{
"Type": "AWS::S3::Object",
"Values": [
"arn:aws:s3:::harbor-athena-results-9ebb00/"
]
}
]
],
"Adv": null
}
=== SSM keys ===
/harbor/athena/admin-bytes-scanned-cap
/harbor/athena/admin-role-arn
/harbor/athena/admin-workgroup-name
/harbor/athena/analyst-role-arn
/harbor/athena/bytes-scanned-cap
/harbor/athena/cmk-arn
/harbor/athena/crawler-name
/harbor/athena/data-bucket
/harbor/athena/database
/harbor/athena/glue-role-arn
/harbor/athena/lf-tag-key
/harbor/athena/output-location
/harbor/athena/result-bucket
/harbor/athena/table
/harbor/athena/trail-bucket
/harbor/athena/trail-name
/harbor/athena/workgroup-name
[stdout]
=== KMS alias ===
[
{
"Alias": "alias/harbor-athena-cmk",
"Target": "1d7bfd6a-428e-48ee-8558-c3c8e312f8b1"
}
]
=== S3 buckets, encryption, PAB ===
-- harbor-athena-results-9ebb00 --
{
"SSEAlgorithm": "aws:kms",
…[truncated]{
"command": "aws cloudtrail put-event-selectors --trail-name harbor-athena-audit-trail --advanced-event-selectors file:///tmp/aes.json >/dev/null 2>&1\naws cloudtrail get-event-selectors --trail-name harbor-athena-audit-trail --query '{ClassicLen:length(EventSelectors||`[]`),AdvLen:length(AdvancedEventSelectors||`[]`),Adv:AdvancedEventSelectors,Classic:EventSelectors}'",
"description": "Final advanced selector apply"
}{
"ClassicLen": 1,
"AdvLen": 0,
"Adv": null,
"Classic": [
{
"ReadWriteType": "All",
"IncludeManagementEvents": true,
"DataResources": [
{
"Type": "AWS::S3::Object",
"Values": [
"arn:aws:s3:::harbor-athena-results-9ebb00/"
]
}
]
}
]
}
[stdout]
{
"ClassicLen": 1,
"AdvLen": 0,
"Adv": null,
"Classic": [
{
"ReadWriteType": "All",
"IncludeManagementEvents": true,
"DataResources": [
{
"Type": "AWS::S3::Object",
"Values": [
"arn:aws:s3:::harbor-athena-results-9ebb00/"
]
}
]
}
]
}{
"todos": [
{
"content": "Create KMS CMK + alias",
"status": "completed",
"activeForm": "Creating KMS CMK + alias"
},
{
"content": "Create three S3 buckets with CMK SSE + PAB",
"status": "completed",
"activeForm": "Creating three S3 buckets with CMK SSE + PAB"
},
{
"content": "Apply bucket policies (results, audit-trail)",
"status": "completed",
"activeForm": "Applying bucket policies"
},
{
"content": "Create Glue DB + projected table",
"status": "completed",
"activeForm": "Creating Glue DB + projected table"
},
{
"content": "Create Glue crawler role + crawler",
"status": "completed",
"activeForm": "Creating Glue crawler role + crawler"
},
{
"content": "Create Athena workgroups (analyst + admin)",
"status": "completed",
"activeForm": "Creating Athena workgroups"
},
{
"content": "Create IAM analyst + admin roles",
"status": "completed",
"activeForm": "Creating IAM analyst + admin roles"
},
{
"content": "Create CloudTrail trail with data events",
"status": "completed",
"activeForm": "Creating CloudTrail trail with data events"
},
{
"content": "Best-effort Lake Formation tag classification",
"status": "completed",
"activeForm": "Configuring Lake Formation tag"
},
{
"content": "Publish SSM manifest",
"status": "completed",
"activeForm": "Publishing SSM manifest"
},
{
"content": "Final verification across all services",
"status": "completed",
"activeForm": "Verifying end state"
}
]
}Todos have been modified successfully. Ensure that you continue to use the todo list to track your progress. Please proceed with the current tasks if applicable
No file changes, the agent left the workspace untouched.
downloading uv 0.9.7 aarch64-unknown-linux-gnu
Downloading pygments (1.2MiB)
Downloading botocore (12.7MiB)
Downloading pygments
Downloading botocore
Installed 13 packages in 297ms
============================= test session starts ==============================
platform linux -- Python 3.12.3, pytest-8.4.1, pluggy-1.6.0 -- /root/.cache/uv/archive-v0/eu7PgE_i2A066HJHDjx28/bin/python
cachedir: .pytest_cache
rootdir: /tests
plugins: json-ctrf-0.3.5
collecting ... collected 64 items
../tests/test_outputs.py::test_01_kms_alias_resolves_to_real_customer_key PASSED [ 1%]
../tests/test_outputs.py::test_02_two_workgroups_exist_with_correct_names PASSED [ 3%]
../tests/test_outputs.py::test_03_glue_database_and_table_exist_with_correct_names PASSED [ 4%]
../tests/test_outputs.py::test_04_three_buckets_exist_via_ssm_pointers PASSED [ 6%]
../tests/test_outputs.py::test_05_two_iam_roles_exist_with_correct_names PASSED [ 7%]
../tests/test_outputs.py::test_06_glue_crawler_role_exists_with_glue_trust PASSED [ 9%]
../tests/test_outputs.py::test_07_glue_crawler_exists_with_correct_name PASSED [ 10%]
../tests/test_outputs.py::test_08_cloudtrail_trail_exists PASSED [ 12%]
../tests/test_outputs.py::test_09_analyst_workgroup_enforce_true PASSED [ 14%]
../tests/test_outputs.py::test_10_admin_workgroup_enforce_true PASSED [ 15%]
../tests/test_outputs.py::test_11_analyst_workgroup_engine_v3 PASSED [ 17%]
../tests/test_outputs.py::test_12_admin_workgroup_engine_v3 PASSED [ 18%]
../tests/test_outputs.py::test_13_both_workgroups_publish_cloudwatch_metrics PASSED [ 20%]
../tests/test_outputs.py::test_14_both_workgroups_state_enabled PASSED [ 21%]
../tests/test_outputs.py::test_15_both_workgroups_have_descriptions PASSED [ 23%]
../tests/test_outputs.py::test_16_analyst_result_encryption_is_sse_kms PASSED [ 25%]
../tests/test_outputs.py::test_17_admin_result_encryption_is_sse_kms PASSED [ 26%]
../tests/test_outputs.py::test_18_both_workgroup_kmskey_matches_cmk PASSED [ 28%]
../tests/test_outputs.py::test_19_analyst_output_location_is_in_result_bucket PASSED [ 29%]
../tests/test_outputs.py::test_20_admin_output_location_is_in_result_bucket PASSED [ 31%]
../tests/test_outputs.py::test_21_analyst_bytes_cap_is_set_and_bounded PASSED [ 32%]
../tests/test_outputs.py::test_22_admin_bytes_cap_is_set_and_bounded PASSED [ 34%]
../tests/test_outputs.py::test_23_admin_cap_strictly_higher_than_analyst_cap PASSED [ 35%]
../tests/test_outputs.py::test_24_ssm_bytes_caps_match_workgroup_caps PASSED [ 37%]
../tests/test_outputs.py::test_25_cmk_policy_has_root_admin_statement PASSED [ 39%]
../tests/test_outputs.py::test_26_cmk_policy_admits_athena_service_principal PASSED [ 40%]
../tests/test_outputs.py::test_27_cmk_policy_athena_service_has_envelope_verbs PASSED [ 42%]
../tests/test_outputs.py::test_28_cmk_policy_no_principal_star_leak PASSED [ 43%]
../tests/test_outputs.py::test_29_cmk_policy_resource_field_is_star PASSED [ 45%]
../tests/test_outputs.py::test_30_result_bucket_default_sse_kms_uses_cmk PASSED [ 46%]
../tests/test_outputs.py::test_31_result_bucket_block_public_access_all_four_flags PASSED [ 48%]
../tests/test_outputs.py::test_32_result_bucket_policy_admits_athena_putobject PASSED [ 50%]
../tests/test_outputs.py::test_33_result_bucket_policy_admits_athena_listmpu PASSED [ 51%]
../tests/test_outputs.py::test_34_data_bucket_default_sse_kms_uses_cmk PASSED [ 53%]
../tests/test_outputs.py::test_35_trail_bucket_exists_and_has_cloudtrail_policy PASSED [ 54%]
../tests/test_outputs.py::test_36_no_bucket_falls_back_to_aes256 PASSED [ 56%]
../tests/test_outputs.py::test_37_analyst_role_scoped_to_analyst_workgroup_arn PASSED [ 57%]
../tests/test_outputs.py::test_38_analyst_role_denies_primary_workgroup PASSED [ 59%]
../tests/test_outputs.py::test_39_analyst_role_grants_start_query_execution PASSED [ 60%]
../tests/test_outputs.py::test_40_analyst_role_grants_get_query_results PASSED [ 62%]
../tests/test_outputs.py::test_41_analyst_role_no_action_star PASSED [ 64%]
../tests/test_outputs.py::test_42_analyst_role_kms_grant_scoped_to_cmk PASSED [ 65%]
../tests/test_outputs.py::test_43_analyst_role_no_kms_star_on_resource_star PASSED [ 67%]
../tests/test_outputs.py::test_44_analyst_role_no_s3_star_on_resource_star PASSED [ 68%]
../tests/test_outputs.py::test_45_admin_role_references_both_workgroups PASSED [ 70%]
../tests/test_outputs.py::test_46_admin_role_no_administratoraccess_attached PASSED [ 71%]
../tests/test_outputs.py::test_47_admin_role_no_action_star_anywhere PASSED [ 73%]
../tests/test_outputs.py::test_48_table_storage_location_in_data_bucket PASSED [ 75%]
../tests/test_outputs.py::test_49_table_has_columns_schema PASSED [ 76%]
../tests/test_outputs.py::test_50_table_has_partition_projection_enabled PASSED [ 78%]
../tests/test_outputs.py::test_51_table_has_partition_projection_types PASSED [ 79%]
../tests/test_outputs.py::test_52_table_storage_location_template_references_partition_vars PASSED [ 81%]
../tests/test_outputs.py::test_53_table_partition_keys_match_projection_columns PASSED [ 82%]
../tests/test_outputs.py::test_54_cloudtrail_islogging_true PASSED [ 84%]
../tests/test_outputs.py::test_55_cloudtrail_s3_bucket_is_trail_bucket PASSED [ 85%]
../tests/test_outputs.py::test_56_cloudtrail_advanced_event_selectors_capture_data_events PASSED [ 87%]
../tests/test_outputs.py::test_57_lf_data_lake_admins_set_or_skipped_gracefully PASSED [ 89%]
../tests/test_outputs.py::test_58_lf_tag_classification_exists_or_ssm_matches PASSED [ 90%]
../tests/test_outputs.py::test_59_all_seventeen_ssm_pointers_resolve_non_empty PASSED [ 92%]
../tests/test_outputs.py::test_60_ssm_cmk_arn_format_and_cross_check PASSED [ 93%]
../tests/test_outputs.py::test_61_ssm_role_arns_format_and_cross_check PASSED [ 95%]
../tests/test_outputs.py::test_62_ssm_scalar_pointers_match_resource_names PASSED [ 96%]
../tests/test_outputs.py::test_63_ssm_output_location_matches_workgroup_output PASSED [ 98%]
../tests/test_outputs.py::test_64_one_cmk_id_threads_every_required_surface PASSED [100%]
=============================== warnings summary ===============================
test_outputs.py: 161 warnings
/root/.cache/uv/archive-v0/eu7PgE_i2A066HJHDjx28/lib/python3.12/site-packages/botocore/auth.py:424: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC).
datetime_now = datetime.datetime.utcnow()
-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
==================================== PASSES ====================================
=========================== short test summary info ============================
PASSED ../tests/test_outputs.py::test_01_kms_alias_resolves_to_real_customer_key
PASSED ../tests/test_outputs.py::test_02_two_workgroups_exist_with_correct_names
PASSED ../tests/test_outputs.py::test_03_glue_database_and_table_exist_with_correct_names
PASSED ../tests/test_outputs.py::test_04_three_buckets_exist_via_ssm_pointers
PASSED ../tests/test_outputs.py::test_05_two_iam_roles_exist_with_correct_names
PASSED ../tests/test_outputs.py::test_06_glue_crawler_role_exists_with_glue_trust
PASSED ../tests/test_outputs.py::test_07_glue_crawler_exists_with_correct_name
PASSED ../tests/test_outputs.py::test_08_cloudtrail_trail_exists
PASSED ../tests/test_outputs.py::test_09_analyst_workgroup_enforce_true
PASSED ../tests/test_outputs.py::test_10_admin_workgroup_enforce_true
PASSED ../tests/test_outputs.py::test_11_analyst_workgroup_engine_v3
PASSED ../tests/test_outputs.py::test_12_admin_workgroup_engine_v3
PASSED ../tests/test_outputs.py::test_13_both_workgroups_publish_cloudwatch_metrics
PASSED ../tests/test_outputs.py::test_14_both_workgroups_state_enabled
PASSED ../tests/test_outputs.py::test_15_both_workgroups_have_descriptions
PASSED ../tests/test_outputs.py::test_16_analyst_result_encryption_is_sse_kms
PASSED ../tests/test_outputs.py::test_17_admin_result_encryption_is_sse_kms
PASSED ../tests/test_outputs.py::test_18_both_workgroup_kmskey_matches_cmk
PASSED ../tests/test_outputs.py::test_19_analyst_output_location_is_in_result_bucket
PASSED ../tests/test_outputs.py::test_20_admin_output_location_is_in_result_bucket
PASSED ../tests/test_outputs.py::test_21_analyst_bytes_cap_is_set_and_bounded
PASSED ../tests/test_outputs.py::test_22_admin_bytes_cap_is_set_and_bounded
PASSED ../tests/test_outputs.py::test_23_admin_cap_strictly_higher_than_analyst_cap
PASSED ../tests/test_outputs.py::test_24_ssm_bytes_caps_match_workgroup_caps
PASSED ../tests/test_outputs.py::test_25_cmk_policy_has_root_admin_statement
PASSED ../tests/test_outputs.py::test_26_cmk_policy_admits_athena_service_principal
PASSED ../tests/test_outputs.py::test_27_cmk_policy_athena_service_has_envelope_verbs
PASSED ../tests/test_outputs.py::test_28_cmk_policy_no_principal_star_leak
PASSED ../tests/test_outputs.py::test_29_cmk_policy_resource_field_is_star
PASSED ../tests/test_outputs.py::test_30_result_bucket_default_sse_kms_uses_cmk
PASSED ../tests/test_outputs.py::test_31_result_bucket_block_public_access_all_four_flags
PASSED ../tests/test_outputs.py::test_32_result_bucket_policy_admits_athena_putobject
PASSED ../tests/test_outputs.py::test_33_result_bucket_policy_admits_athena_listmpu
PASSED ../tests/test_outputs.py::test_34_data_bucket_default_sse_kms_uses_cmk
PASSED ../tests/test_outputs.py::test_35_trail_bucket_exists_and_has_cloudtrail_policy
PASSED ../tests/test_outputs.py::test_36_no_bucket_falls_back_to_aes256
PASSED ../tests/test_outputs.py::test_37_analyst_role_scoped_to_analyst_workgroup_arn
PASSED ../tests/test_outputs.py::test_38_analyst_role_denies_primary_workgroup
PASSED ../tests/test_outputs.py::test_39_analyst_role_grants_start_query_execution
PASSED ../tests/test_outputs.py::test_40_analyst_role_grants_get_query_results
PASSED ../tests/test_outputs.py::test_41_analyst_role_no_action_star
PASSED ../tests/test_outputs.py::test_42_analyst_role_kms_grant_scoped_to_cmk
PASSED ../tests/test_outputs.py::test_43_analyst_role_no_kms_star_on_resource_star
PASSED ../tests/test_outputs.py::test_44_analyst_role_no_s3_star_on_resource_star
PASSED ../tests/test_outputs.py::test_45_admin_role_references_both_workgroups
PASSED ../tests/test_outputs.py::test_46_admin_role_no_administratoraccess_attached
PASSED ../tests/test_outputs.py::test_47_admin_role_no_action_star_anywhere
PASSED ../tests/test_outputs.py::test_48_table_storage_location_in_data_bucket
PASSED ../tests/test_outputs.py::test_49_table_has_columns_schema
PASSED ../tests/test_outputs.py::test_50_table_has_partition_projection_enabled
PASSED ../tests/test_outputs.py::test_51_table_has_partition_projection_types
PASSED ../tests/test_outputs.py::test_52_table_storage_location_template_references_partition_vars
PASSED ../tests/test_outputs.py::test_53_table_partition_keys_match_projection_columns
PASSED ../tests/test_outputs.py::test_54_cloudtrail_islogging_true
PASSED ../tests/test_outputs.py::test_55_cloudtrail_s3_bucket_is_trail_bucket
PASSED ../tests/test_outputs.py::test_56_cloudtrail_advanced_event_selectors_capture_data_events
PASSED ../tests/test_outputs.py::test_57_lf_data_lake_admins_set_or_skipped_gracefully
PASSED ../tests/test_outputs.py::test_58_lf_tag_classification_exists_or_ssm_matches
PASSED ../tests/test_outputs.py::test_59_all_seventeen_ssm_pointers_resolve_non_empty
PASSED ../tests/test_outputs.py::test_60_ssm_cmk_arn_format_and_cross_check
PASSED ../tests/test_outputs.py::test_61_ssm_role_arns_format_and_cross_check
PASSED ../tests/test_outputs.py::test_62_ssm_scalar_pointers_match_resource_names
PASSED ../tests/test_outputs.py::test_63_ssm_output_location_matches_workgroup_output
PASSED ../tests/test_outputs.py::test_64_one_cmk_id_threads_every_required_surface
======================= 64 passed, 161 warnings in 2.12s =======================Reproduce this trial: git checkout 2f94510 && PYTHONPATH=src python3 scripts/build_site.py , then open trial/trial_eee3e4a4ef6e4afd. Re-running the agent live requires EVAL_PLATFORM_ENABLE_OAUTH_SMOKE=1 and is non-deterministic.
Trial trial_eee3e4a4ef6e4afd · verifier authoritative; classifier explanatory.