S3 and GCS are supported for both reading inputs and writing outputs. When using a storage integration, pass
storageIntegrationId and provide both a source url and a writeDestination with the matching scheme (s3:// or gs://). assetId and HTTP url parameter values are not supported with a storage integration.How it works
- You grant AudioShake short-lived access to your bucket (IAM role for AWS, or a service account via Workload Identity Federation for GCP).
- You register the integration in AudioShake and receive a
storageIntegrationId. - You include
storageIntegrationIdand both aurland awriteDestinationwith the matching scheme in your/tasksrequests.
- AWS — AudioShake assumes your IAM role via STS and uses those credentials to read and write S3.
- GCP — AudioShake federates through your Workload Identity pool, impersonates your service account, and uses those credentials to read and write GCS.
AWS S3
1. Create an S3 bucket
In the AWS console, create the bucket AudioShake should read from and write to (or use an existing one). Bucket names are globally unique — pick something likeacme-audioshake-outputs.
2. Create an IAM role in your AWS account
In the AWS IAM console, create a new role — for example,AudioshakeS3AccessRole. The role needs two policies: a trust policy that lets AudioShake assume the role, and a permissions policy that grants read and write access to your bucket prefix.
Trust policy. On the first step of the role wizard (“Select trusted entity”), choose Custom trust policy — not “AWS account” — so you can trust AudioShake’s specific role rather than its entire account. Paste the JSON below into the editor. The Principal is AudioShake’s published service ARN — copy it verbatim. The External ID is a placeholder for now; you’ll fill it in after registering the integration in step 4.
Trust policy
<BUCKET_NAME> and <PREFIX> with your bucket and the prefix AudioShake should read from and write under (e.g. outputs). GetObject is required to read s3:// inputs. If your inputs and outputs live under different prefixes, include both in Resource.
Permissions policy
AbortMultipartUpload is needed for large files; ListBucket is needed for testing access.
3. (Optional) Restrict access via a bucket policy
For defense-in-depth, you can also add a bucket policy that allows only this role to read from and write to the prefix. In the bucket’s Permissions tab, set the bucket policy to:Bucket policy
4. Register the integration with AudioShake
You can register the integration through the Dashboard or via the API.- Dashboard
- API
In the AudioShake Dashboard, go to Settings > Storage Integrations and click Add storage integration. Fill in:
- Type — AWS S3
- Bucket / Storage name — your bucket name (no
s3://prefix or path) - AWS region — e.g.
us-east-1 - Role ARN — the ARN of the role you created in step 2
storageIntegrationId when creating tasks, and you’ll need the External ID in step 5.5. Add the External ID to your trust policy
Back in the AWS IAM console, open your role’s Trust relationships tab and replace<EXTERNAL_ID_PLACEHOLDER> with the External ID from step 4:
6. (Optional) Test the integration
Verify that AudioShake can write to your bucket by sending aPOST to /storage-integrations/test:
<writeDestination>/.verify/<timestamp>_<uuid>.json. A 200 response means the integration is working.
Google Cloud Storage
1. Enable required APIs
In the Google Cloud Console, select your project, then go to APIs & Services > Library and enable:- Cloud Storage API
- Identity and Access Management (IAM) API
- IAM Service Account Credentials API
- Security Token Service API (
sts.googleapis.com)
2. Create a GCS bucket
Open Cloud Storage > Buckets and create a bucket (or use an existing one). Uniform bucket-level access is recommended. You do not need to make the bucket public.3. Create a service account
Open IAM & Admin > Service Accounts and create a service account — for example,audioshake-storage-access. Skip project-wide roles; permissions should be on the bucket, not the whole project.
Copy the service account email, e.g. audioshake-storage-access@YOUR_PROJECT_ID.iam.gserviceaccount.com.
4. Grant object read and write on the bucket
Open the bucket’s Permissions tab and grant access to the service account email. Recommended: assign Storage Object User (roles/storage.objectUser).
Alternatively, assign Storage Object Creator and Storage Object Viewer, or a custom role with storage.objects.create and storage.objects.get.
5. (Optional) Limit access to a prefix
When granting access, add an IAM condition so the service account can only touch a prefix (e.g.outputs/):
{prefix}/.verify/..., so if writeDestination is gs://<BUCKET_NAME>/outputs, the condition must include outputs/.
6. Create a Workload Identity Federation pool and AWS provider
AudioShake reaches GCS by federating from its AWS services role into your GCP project, then impersonating your service account:- Go to IAM & Admin > Workload Identity Federation and create a pool (e.g. pool ID
audioshake). - Add an AWS provider (e.g. provider ID
audioshake-aws). - Set AWS account ID to
874456856160(AudioShake’s services account — not your own). - Confirm attribute mappings include
google.subjectandattribute.aws_role(Console AWS defaults are usually fine). - Set an attribute condition so only AudioShake’s role can federate:
- After creation, open the provider and copy the provider resource name. It looks like:
authConfig.workloadIdentityProvider when you register the integration. Project number is not the same as project ID — find it under IAM & Admin > Settings.
7. Allow the federated identity to impersonate your service account
Federation alone is not enough — grant impersonation on the service account:- Open IAM & Admin > Service Accounts → your AudioShake service account.
- Grant access to this principal (use the same role ARN as in your attribute condition):
- Assign Service Account Token Creator (
roles/iam.serviceAccountTokenCreator).
8. Register the integration with AudioShake
You can register the integration through the Dashboard or via the API.- Dashboard
- API
In the AudioShake Dashboard, go to Settings > Storage Integrations and click Add storage integration. Fill in:
- Type — Google Cloud Storage
- Bucket / Storage name — your bucket name (no
gs://prefix or path) - Project ID — your GCP project ID
- Service account email — the SA from step 3
- Workload identity provider — the provider resource name from step 6
storageIntegrationId when creating tasks.9. (Optional) Test the integration
Verify that AudioShake can write to your bucket by sending aPOST to /storage-integrations/test:
<writeDestination>/.verify/. A 200 response means the integration is working.
Using a storage integration
Once the integration is active, includestorageIntegrationId in your Create Task request. The source url and writeDestination must use the scheme for that provider (s3:// for AWS, gs:// for GCP) and point at the registered bucket.
AWS S3:
id returned when you registered the integration as storageIntegrationId.
Where outputs land
AudioShake writes outputs under yourwriteDestination by task:
output[].link download URLs.
Path rules
storageIntegrationIdis required and must match a registered storage integration.- The source
urlmust begin withs3://orgs://, followed by a bucket and object key in that integration’s bucket. writeDestinationmust begin with the same scheme, followed by a bucket and a prefix.- The bucket in
urlandwriteDestinationmust match the registered storage integration.
Security
- AudioShake uses short-lived credentials only at task runtime — an assumed IAM role session for AWS, or a federated / impersonated service account token for GCP.
- Access is bounded by the permissions you grant (IAM policy or GCS bucket IAM) — AudioShake can only do what you allow.
- On AWS, the External ID condition prevents the confused-deputy problem. On GCP, the WIF attribute condition locks federation to AudioShake’s services role ARN.
- You can revoke access immediately by removing the trust relationship / WIF binding, detaching permissions, or deleting the role or service account.