For AI agents: a documentation index is available at the root level at /llms.txt and /llms-full.txt. Append /llms.txt to any URL for a page-level index, or .md for the markdown version of any page.
Blog
DocsAPI Reference
DocsAPI Reference
    • AIStore
    • Documentation
  • Core Documentation
    • In-depth Overview
    • Terminology and core abstractions
    • Getting Started
    • Networking model
    • Buckets: design, operations, namespaces, and system buckets
    • Observability overview
    • CLI overview
    • Production deployment
    • Technical Blog
  • APIs, SDKs, and Compatibility
    • Go API
    • Python SDK
    • PyPI package
    • Python SDK reference guide
    • PyTorch integration
    • TensorFlow integration
    • HTTP API reference
    • curl examples
    • Easy URL
    • S3 compatibility
    • s3cmd quick start
    • Presigned S3 requests
    • Boto3 support
  • Command-Line Interface
    • CLI overview
    • ais help
    • CLI reference guide
    • Bucket operations
    • Cluster and remote-cluster management
    • Storage and mountpath management
    • Monitoring and ais show
    • Downloads
    • Jobs
    • Authentication and access control
    • Configuration via CLI
    • ETL CLI
    • Distributed shuffle CLI
    • ML / get-batch CLI
    • GCP credentials
    • TLS certificate management
  • Storage and Data Management
    • Storage services
    • Buckets: design, operations, namespaces, and system buckets
    • Native Bucket Inventory (NBI)
    • Backend providers
    • On-disk layout
    • Virtual directories
    • System files
    • Evicting remote buckets and cached data
  • Cluster Operations
    • Node lifecycle: maintenance, shutdown, decommission
    • Global rebalance
    • Resilver
    • AIS in Containerized Environments
    • Highly available control plane
    • Information Center (IC)
    • Out-of-band updates
    • Troubleshooting
  • Configuration and Security
    • Configuration
    • Environment variables
    • Feature flags
    • AuthN and access control
    • Authentication validation
    • HTTPS and certificates
    • Switching a cluster to HTTPS
  • ETL and Advanced Workflows
    • ETL overview
    • ETL CLI docs
    • ETL Python SDK examples
    • Custom transformers
    • ETL Python webserver SDK
    • ETL Go webserver package
    • Archives: read, write, and list
    • Distributed shuffle (dsort)
    • Initial sharding utility (ishard)
    • Downloader
    • Blob Downloader
    • Batch object retrieval (get-batch)
    • Batch operations
    • Tools and utilities
    • Extended actions (xactions)
  • Observability, Monitoring, and Performance
    • Observability overview
    • Monitoring with CLI
    • Logs
    • Prometheus integration
    • Metrics reference
    • Grafana dashboards
    • Kubernetes monitoring
    • Distributed tracing
    • Monitoring get-batch
    • AIS load generator (aisloader)
    • Benchmarking AIStore
    • Performance tuning and testing
    • Performance monitoring via CLI
    • Rate limiting
    • Checksumming
    • Filesystem Health Checker (FSHC)
    • Traffic patterns
  • Networking
    • Networking: multi-homing, network separation, IPv6
    • HTTPS configuration
    • Switching to HTTPS
    • Idle connections
    • MessagePack protocol
  • Deployment
    • AIStore on Kubernetes
    • Kubernetes Operator
    • Ansible playbooks
    • Helm charts
    • Deployment monitoring
    • Docker
  • Developer Resources
    • Development guide
    • aisnode command line
    • Build tags
  • Object and Bucket Naming
    • Unicode and special symbols in object and bucket names
    • Extremely long object names
Blog
NVIDIANVIDIA
Developer-friendly docs for your API
Privacy Policy | Your Privacy Choices | Terms of Service | Accessibility | Corporate Policies | Product Security | Contact

Copyright © 2026, NVIDIA Corporation.

LogoLogoAIStore
On this page
  • The extra.gcp section
  • Setting per-bucket credentials
  • Example: validate per-bucket credentials on first access
  • Credentials file format
  • Registering a bucket that the default credentials cannot reach
  • Multiple buckets, multiple GCP projects
  • Startup behavior
  • Clearing per-bucket credentials
  • See also
Command-Line Interface

GCP Per-Bucket Credentials

||View as Markdown|
Previous

ML / get-batch CLI

Next

TLS certificate management

By default, all GCS operations use a single set of credentials - the service account referenced by the GOOGLE_APPLICATION_CREDENTIALS environment variable (or the ambient credentials on GCE/GKE). This is sufficient when all GCS buckets belong to the same GCP project and service account.

extra.gcp.application_creds lifts that restriction: it lets each bucket in AIS carry its own GCP service-account JSON path, completely overriding the global default for that bucket’s operations.

Table of Contents

  • The extra.gcp section
  • Setting per-bucket credentials
    • Example: validate per-bucket credentials on first access
  • Credentials file format
  • Registering a bucket that the default credentials cannot reach
  • Multiple buckets, multiple GCP projects
  • Startup behavior
  • Clearing per-bucket credentials
  • See also

The extra.gcp section

To inspect the GCP-specific knobs for a bucket:

1$ ais bucket props show gs://abc extra.gcp
2PROPERTY VALUE
3extra.gcp.application_creds

or in JSON to see all supported fields regardless of whether they are set:

1$ ais bucket props show gs://abc extra.gcp --json
2{
3 "extra": {
4 "gcp": {
5 "application_creds": "-"
6 }
7 }
8}

Note on -: a dash in --json output means the field is supported but currently unset (no value configured). It is not a valid value to assign.

Setting per-bucket credentials

1$ ais bucket props set gs://abc extra.gcp.application_creds /mnt/vault/sa-team-b.json
2"extra.gcp.application_creds" set to: "/mnt/vault/sa-team-b.json" (was: "")

From this point on, every operation on gs://abc - GET, PUT, HEAD, LIST - will authenticate using the service account in /mnt/vault/sa-team-b.json instead of the cluster-wide default.

The path must be absolute and clean (no .. components). AIS validates this when the property is set and returns an error if the path is relative or malformed.

Example: validate per-bucket credentials on first access

Create bucket with non-default creds bypassing lookup:

1$ ais create gs://abc --skip-lookup --props='extra.gcp.application_creds=/tmp/GOOD_gcp_creds.json'
2"gs://abc" created
3
4# first access resolves creds and establishes a session
5$ ais ls gs://abc
6
7NAME SIZE CACHED
8README.md ... no
9...
10Listed 778503 names (in-cluster: none)

On the other hand, if the credentials file is invalid or missing:

1$ ais create gs://abc --skip-lookup --props='extra.gcp.application_creds=/tmp/BAD_gcp_creds.json'
2"gs://abc" created
3
4$ ais ls gs://abc
5Error: gcp: failed to load application creds from ... for bucket ...

Credentials file format

The value is a file path to a standard GCP service-account JSON key:

1{
2 "type": "service_account",
3 "project_id": "my-gcp-project",
4 "private_key_id": "...",
5 "private_key": "-----BEGIN RSA PRIVATE KEY-----\n...",
6 "client_email": "sa-team-b@my-gcp-project.iam.gserviceaccount.com",
7 ...
8}

AIS reads the project_id from the file at the time the session is first established. The file path - not the credentials themselves - is what is stored in the bucket’s BMD entry, so secrets never leave the node’s filesystem.

The JSON key file itself is never replicated across nodes or transmitted over the network. Each AIS target must have access to the specified path locally.

In Kubernetes, service-account keys are typically mounted as files via a Secret volume:

1volumes:
2 - name: gcp-sa
3 secret:
4 secretName: team-b-gcp-sa
5volumeMounts:
6 - name: gcp-sa
7 mountPath: /mnt/vault/sa
8 readOnly: true

which makes /mnt/vault/sa/key.json a normal readable file from AIS’s perspective.

Registering a bucket that the default credentials cannot reach

If the cluster’s default service account has no access to the bucket, use --skip-lookup to bypass the initial HEAD check:

1$ ais create gs://team-b-data --skip-lookup \
2 --props="extra.gcp.application_creds=/mnt/vault/sa-team-b.json"
3"gs://team-b-data" created

Then verify access:

1$ ais ls gs://team-b-data
2NAME SIZE
3...

--skip-lookup registers the bucket in BMD without verifying reachability. Use it only when you know the bucket exists and the per-bucket credentials are correct.

Multiple buckets, multiple GCP projects

extra.gcp.application_creds is per-bucket, so you can mix projects freely:

1$ ais create gs://#proj-a/dataset --skip-lookup \
2 --props="extra.gcp.application_creds=/mnt/vault/sa-proj-a.json"
3
4$ ais create gs://#proj-b/dataset --skip-lookup \
5 --props="extra.gcp.application_creds=/mnt/vault/sa-proj-b.json"

gs://#proj-a/dataset and gs://#proj-b/dataset are distinct BMD entries with separate on-disk paths, separate session caches, and independent credentials. The namespace component (e.g., #proj-a, #proj-b) disambiguates same-name buckets across projects.

AIS caches the GCP client session keyed by credentials file path, so the overhead of creating a new *storage.Client is paid once per unique credentials file across the lifetime of the target process.

Startup behavior

AIS initializes the default GCP session lazily - on first use, not at target startup. A missing or invalid GOOGLE_APPLICATION_CREDENTIALS will not prevent the target from starting

An error will occur only when accessing a bucket that requires the default (missing or invalid) credentials.

Per-bucket sessions (extra.gcp.application_creds) are resolved the same way: on demand, then cached.

Clearing per-bucket credentials

To revert a bucket to the cluster-wide default:

1$ ais bucket props set gs://abc extra.gcp.application_creds ""
2
3"extra.gcp.application_creds" set to: "" (was: "/mnt/vault/sa-team-b.json")

See also

  • AWS Profiles and S3 Endpoints
  • Bucket Properties
  • Namespaced Buckets