This page describes how to schedule backups for Cassandra in Cloud Storage.
In this method, backups are stored in the specified Cloud Storage bucket.
To schedule Cassandra backups, perform the following steps:
Run the followingcreate-service-accountcommand to create a Google Cloud service account (SA) with the standardroles/storage.objectAdminrole.
This SA role allows you to write backup data
to Cloud Storage. Execute the command in the$APIGEE_HELM_CHARTS_HOME/apigee-operator/etc/directory.
This command creates a single service account namedapigee-non-prodfor use in non-production environments and
places the downloaded key file in the./directory.
Thecreate-service-accountcommand saves a JSON file containing the
service account private key. The file is saved in the same directory
where the command executes. You will need the path to this file
in the following steps.
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Hard to understand","hardToUnderstand","thumb-down"],["Incorrect information or sample code","incorrectInformationOrSampleCode","thumb-down"],["Missing the information/samples I need","missingTheInformationSamplesINeed","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-09-08 UTC."],[[["\u003cp\u003eThis guide explains how to schedule backups for Cassandra data in Cloud Storage, where the backup data will be stored.\u003c/p\u003e\n"],["\u003cp\u003eA Google Cloud service account with the \u003ccode\u003eroles/storage.objectAdmin\u003c/code\u003e role must be created to write backup data to Cloud Storage, using the provided \u003ccode\u003ecreate-service-account\u003c/code\u003e command.\u003c/p\u003e\n"],["\u003cp\u003eYou need to create a Cloud Storage bucket with a suitable retention policy (recommended 15 days) to store the backup archives.\u003c/p\u003e\n"],["\u003cp\u003eTo enable backups, the \u003ccode\u003ecassandra.backup\u003c/code\u003e properties, including the service account path, Cloud Storage bucket name, backup schedule, and cloud provider, must be configured in the \u003ccode\u003eoverrides.yaml\u003c/code\u003e file.\u003c/p\u003e\n"],["\u003cp\u003eBackups are automatically performed according to the cron schedule specified in the configuration, and a manual backup can be triggered using the provided \u003ccode\u003ekubectl create job\u003c/code\u003e command.\u003c/p\u003e\n"]]],[],null,["| You are currently viewing version 1.13 of the Apigee hybrid documentation. For more information, see [Supported versions](/apigee/docs/hybrid/supported-platforms#supported-versions).\n\nThis page describes how to schedule backups for Cassandra in Cloud Storage.\nIn this method, backups are stored in the specified Cloud Storage bucket.\n| **Note:** After applying the backup configuration on the existing cluster, the Cassandra pods will restart one after another (rolling restart) from last to first.\n\nTo schedule Cassandra backups, perform the following steps:\n\n1. Run the following `create-service-account` command to create a Google Cloud service account (SA) with the standard [`roles/storage.objectAdmin`](/storage/docs/access-control/iam-roles) role. This SA role allows you to write backup data to Cloud Storage. Execute the command in the \u003cvar translate=\"no\"\u003e$APIGEE_HELM_CHARTS_HOME\u003c/var\u003e`/apigee-operator/etc/` directory. \n\n ```\n ./tools/create-service-account --env non-prod --dir ./\n ```\n\n This command creates a single service account named\n `apigee-non-prod` for use in non-production environments and\n places the downloaded key file in the `./`\n directory.\n | **Note:** If you prefer to create all the individual service accounts for a production environment, use the following command: \n |\n | ```\n | ./tools/create-service-account --env prod --dir ./\n | ```\n |\n | Then, move each service account into its corresponding chart directory. The following\n | table lists each service account and the corresponding Apigee hybrid Helm charts:\n |\n | | Service account | Apigee Helm chart |\n | |-----------------------|--------------------|\n | | `apigee-cassandra` | `apigee-datastore` |\n | | `apigee-logger` | `apigee-telemetry` |\n | | `apigee-mart` | `apigee-org` |\n | | `apigee-metrics` | `apigee-telemetry` |\n | | `apigee-runtime` | `apigee-env` |\n | | `apigee-synchronizer` | `apigee-env` |\n | | `apigee-udca` | `apigee-org` |\n | | `apigee-watcher` | `apigee-org` |\n |\n For more information about Google Cloud service accounts, see\n [Creating and managing service\n accounts](/iam/docs/creating-managing-service-accounts).\n2. The `create-service-account` command saves a JSON file containing the service account private key. The file is saved in the same directory where the command executes. You will need the path to this file in the following steps.\n3. [Create a Cloud Storage bucket](/storage/docs/creating-buckets). Specify a reasonable data [retention policy](/storage/docs/bucket-lock#retention-policy) for the bucket. Apigee recommends a data retention policy of 15 days.\n4. Open your `overrides.yaml` file.\n5. Add the following `cassandra.backup` properties to enable backup. Do not remove any of the properties that are already configured.\n\n Parameters \n\n ```scdoc\n cassandra:\n ...\n\n backup:\n enabled: true\n serviceAccountPath: SA_JSON_FILE_PATH\n dbStorageBucket: CLOUD_STORAGE_BUCKET_NAME\n schedule: BACKUP_SCHEDULE_CODE\n cloudProvider: \"GCP\" # For remote server backup set this to HYBRID (all caps)\n\n ...\n \n ```\n\n Example \n\n ```carbon\n ...\n\n cassandra:\n storage:\n type: gcepd\n capacity: 50Gi\n gcepd:\n replicationType: regional-pd\n auth:\n default:\n password: \"abc123\"\n admin:\n password: \"abc234\"\n ddl:\n password: \"abc345\"\n dml:\n password: \"abc456\"\n nodeSelector:\n key: cloud.google.com/gke-nodepool\n value: apigee-data\n backup:\n enabled: true\n serviceAccountPath: \"my-cassandra-backup-sa.json\"\n dbStorageBucket: \"myname-cassandra-backup\"\n schedule: \"45 23 * * 6\"\n cloudProvider: \"GCP\"\n \n\n\n ... \n ```\nWhere:\n\n| Property | Description |\n|-----------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `backup:enabled` | Backup is disabled by default. You must set this property to `true`. |\n| `backup:serviceAccountPath` | \u003cvar translate=\"no\"\u003eSA_JSON_FILE_PATH\u003c/var\u003e The path on your filesystem to the service account JSON file that was downloaded when you ran the `create-service-account` command. The path must be relative to the apigee-datastore chart directory. For example, `serviceAccountPath: myproject-apigee-cassandra.json`. |\n| `backup:dbStorageBucket` | \u003cvar translate=\"no\"\u003eCLOUD_STORAGE_BUCKET_NAME\u003c/var\u003e The name of an existing Google Cloud Storage bucket that will be used to store backup archives. See [Creating buckets](https://cloud.google.com/storage/docs/creating-buckets) if you need to create one. | **Note:** Starting in Hybrid version 1.13, the bucket name doesn't need to be prefixed with `gs://`. Support for this prefix has been deprecated and will be removed in future releases. |\n| `backup:cloudProvider` | **`GCP/HYBRID`** For a Cloud Storage backup, set the property to `GCP`. For example, `cloudProvider: \"GCP\"`. For a remote server backup, set the property to `HYBRID`. For example, `cloudProvider: \"HYBRID\"`. |\n| `backup:schedule` | \u003cvar translate=\"no\"\u003eBACKUP_SCHEDULE_CODE\u003c/var\u003e The time when the backup starts, specified in [standard crontab syntax](https://en.wikipedia.org/wiki/Cron). Default: `0 2 * * *` | **Note:** Avoid scheduling a backup that starts a short time after you apply the backup configuration to your cluster. When you apply the backup configuration, Kubernetes recreates the Cassandra nodes. If the backup starts before the nodes restart, the first backup will fail and the subsequent backups will pass. |\n\n6. Apply the configuration changes to the new cluster. For example: \n\n ```\n helm upgrade datastore apigee-datastore/ \\\n --namespace APIGEE_NAMESPACE \\\n --atomic \\\n -f OVERRIDES_FILE.yaml\n ```\n | **Note:** If you see an error saying `Error: UPGRADE FAILED: \"datastore\" has no deployed releases`, replace `upgrade` with `install` and try the command again.\n\n\n Where \u003cvar translate=\"no\"\u003eOVERRIDES_FILE\u003c/var\u003e is the path to the overrides file you just edited.\n7. Verify the backup job. For example: \n\n ```\n kubectl get cronjob -n APIGEE_NAMESPACE\n ``` \n\n ```component-pascal\n NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE\n apigee-cassandra-backup 33 * * * * False 0 \u003cnone\u003e 94s\n ```\n\nLaunch a manual backup\n\n\nCassandra backups generate automatically according to the cron schedule set in the `overrides.yaml` file.\n\n\nTo initiate a manual backup, use this command:\n\n```\nkubectl create job -n APIGEE_NAMESPACE --from=cronjob/apigee-cassandra-backup BACKUP_POD_NAME\n```"]]