JOSE PUERTOS TAVARES
05/12/2026, 2:05 AMRocky
05/12/2026, 2:05 AMCREATE EXTERNAL CATALOG statement (though it defaults to true in version 4.0+):
sql
PROPERTIES (
...
"iceberg.catalog.vended-credentials-enabled" = "true"
)
3. Verification & Troubleshooting
If you are already on version 4.0 or later and it still fails:
* Check iceberg.catalog.security: If your REST catalog requires specific authentication to vend those credentials, ensure you have set "iceberg.catalog.security" = "oauth2" or "jwt" as required by your catalog provider (e.g., Polaris, Tabular).
* Storage Credentials: For GCS vended credentials in 4.0+, you should not need to provide gcp.gcs.* storage properties in the catalog definition. If they are present, they might be taking precedence.
* Logs: Check the BE logs (<http://be.INFO|be.INFO> or be.WARNING) on the nodes where the query failed. Look for entries related to GcsFileSystem or Iceberg to see if there is a more descriptive error about why the vended token was rejected or not found.
Summary
If you are running a version earlier than 4.0, StarRocks does not yet support vending credentials for GCS via the Iceberg REST API. In this case, the GCP Workload Service Account is the intended and required method for authentication. To use vended credentials as expected, you will need to upgrade to StarRocks 4.0+.
References
• data_source/catalog/iceberg/iceberg_catalog.md
• data_source/catalog/iceberg/iceberg_rest_security.md
• integrations/authenticate_to_gcs.mdJOSE PUERTOS TAVARES
05/12/2026, 2:23 AMSELECT @@version_comment;
+-------------------+
| @@version_comment |
+-------------------+
| 4.0.9-f647589 |
+-------------------+
1 row in set (0.00 sec)
and I already have the configuration property in the catalog "iceberg.catalog.vended-credentials-enabled" = "true",Rocky
05/12/2026, 2:25 AMvended-credentials-enabled to true, StarRocks often requires the catalog's security protocol to be explicitly defined (e.g., oauth2 or jwt) to correctly initialize the credential-aware communication flow. If your iceberg.catalog.security is set to NONE (the default), the engine may bypass the logic that extracts and applies the storage tokens from the REST response.
Recommendation: Ensure your catalog is configured with a security protocol, even if the REST server doesn't strictly enforce it for metadata:
sql
PROPERTIES (
"iceberg.catalog.type" = "rest",
"iceberg.catalog.security" = "oauth2", -- or "jwt"
"iceberg.catalog.vended-credentials-enabled" = "true"
)
2. Conflicting GCS Properties
If you have any legacy gcp.gcs.* properties in your catalog DDL (such as gcp.gcs.use_compute_engine_service_account), these can sometimes take precedence over the vended credentials logic in the Backend (BE) nodes.
* Action: Remove any gcp.gcs.* properties from the CREATE EXTERNAL CATALOG statement. According to the 4.0 documentation, for a REST catalog with vended credentials, you should not need to configure any storage-layer parameters.
3. REST Server Property Mapping
StarRocks expects the vended credentials in the Iceberg REST response to follow standard key names. For GCS, this is usually provided in the config block of the LoadTableResponse.
* If your REST catalog returns the token using a non-standard key (e.g., something other than gcs.oauth2.token or the standard OAuth2 token field), StarRocks won't recognize it.
* Verification: Check your BE nodes' <http://be.INFO|be.INFO> logs during a query. Look for messages related to IcebergRESTCatalog or GcsFileSystem. If StarRocks fails to find the token in the response, you might see a log entry indicating it is falling back to default credentials.
4. Known Issue: Token Passthrough in 4.0.x
There have been reported cases in early 4.0.x releases where the X-Iceberg-Access-Delegation: vended-credentials header was not consistently passed in every request, or the BE failed to refresh the token for long-running scans.
If the steps above do not resolve the issue:
1. Check if the REST Catalog logs show StarRocks sending the X-Iceberg-Access-Delegation: vended-credentials header.
2. Try setting iceberg.catalog.vended-credentials-enabled explicitly to "true" (as a string) if you haven't already.
3. As a temporary workaround for 4.0.9, you may need to continue using the Service Account until a specific patch for your REST provider (e.g., BigLake or Polaris) is confirmed in the 4.0.x branch.
Authoritative Source: StarRocks Iceberg REST Security Docs and Iceberg Catalog Parameters.
References
• data_source/catalog/iceberg/iceberg_catalog.md
• integrations/authenticate_to_gcs.mdJOSE PUERTOS TAVARES
05/12/2026, 2:34 AM"storage-credentials": [
{
"config": {
"expiration-time": "1778553169283",
"gcs.oauth2.refresh-credentials-enabled": "true",
"gcs.oauth2.refresh-credentials-endpoint": "v1/projects/..../credentials",
"gcs.oauth2.token": "ya29.dr.s.ASN...",
"gcs.oauth2.token-expires-at": "1778553169283"
},
"prefix": "<gs://my-sample-bucket/taxi_demo/beam_taxi_summary/>"
}
]Rocky
05/12/2026, 2:35 AMgcs.oauth2.token) are returned directly within the config map of the LoadTableResponse.
2. Storage Credentials Capability (What your catalog is using): The credentials are returned in a separate "storage-credentials" array/object. This is a newer, more flexible part of the Iceberg REST spec designed for multi-storage and prefix-based scoping.
Your response shows the credentials inside the "storage-credentials" block:
json
"storage-credentials": [
{
"config": { "gcs.oauth2.token": "..." },
"prefix": "gs://..."
}
]
StarRocks 4.0.x currently expects the credentials to be in the main config map of the table response. Because they are nested inside the storage-credentials array, the StarRocks Backend (BE) nodes fail to "see" the token. As a result, the BE falls back to the system's default credentials (the GCP Workload Service Account), which lacks the permissions you removed, leading to the Failed to get status for file error.
Recommended Solutions
1. Adjust the REST Catalog Response (Preferred)
If you have control over the Iceberg REST Catalog (e.g., if you are using Polaris, BigLake, or a custom server), check if you can configure it to return the storage tokens in the flat config map of the response rather than the storage-credentials block. Many catalogs support a "compatibility mode" or "legacy vended credentials" mode for engines that haven't yet implemented the full storage-credentials capability.
2. Verify iceberg.catalog.security
Even in version 4.0, if iceberg.catalog.security is not set to oauth2 or jwt, StarRocks might skip certain credential-processing logic. Ensure your catalog DDL includes:
sql
PROPERTIES (
"iceberg.catalog.security" = "oauth2",
"iceberg.catalog.vended-credentials-enabled" = "true"
)
3. Monitor for StarRocks Updates
The support for the official Iceberg storage-credentials capability (the array-based response) is an active area of development in the 4.x branch. You may want to check the StarRocks GitHub Issues or reach out on the StarRocks Slack to see if a patch for this specific response format is available in a more recent 4.0.x or 4.1 release.
Summary
The vended credentials feature is active, but StarRocks 4.0.9 is looking for the token in the table's config map and is ignoring the storage-credentials array. Until StarRocks adds support for the storage-credentials capability, you will likely need to keep the Service Account permissions active or force the REST catalog to provide the token in the standard config block.
References
• data_source/catalog/iceberg/iceberg_catalog.md
• data_source/catalog/iceberg/iceberg_rest_security.md