---
component: ROOT
version: "2026.1"
slug: ROOT/installation/irsa-rds-and-s3
canonical_url: "https://docs.gradle.com/develocity/2026.1/installation/aws/irsa-rds-and-s3/"
title: "Using Amazon RDS and S3"
description: "Overview of using Amazon RDS and S3 with Develocity."
keywords: []
status: current
---

<!-- llms-index: https://docs.gradle.com/develocity/llms.txt -->

# Using Amazon RDS and S3

<a id="preamble"></a>

When using both Amazon RDS and S3 with Develocity, you should follow the principle of least privilege by assigning dedicated IAM roles to each component based on its specific access requirements.

*   The `gradle-database`, `test-distribution-broker`, and `gradle-keycloak` components require access only to Amazon RDS.
    
*   The `gradle-monitoring` and `gradle-enterprise-operator` components require access only to the S3 monitoring data bucket.
    
*   The `gradle-enterprise-app` and `gradle-enterprise-app-background-processor` components require access to both Amazon RDS and the S3 application data bucket.
    

This page provides step-by-step instructions for creating and assigning these fine-grained IAM roles, ensuring each Develocity component has only the permissions it needs to interact securely with AWS services.

<a id="using-amazon-rds"></a>

## Using Amazon RDS

This section will walk you through using an [Amazon RDS PostgreSQL](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_PostgreSQL.html) instance as your database.

<a id="irsa_rds_s3_permission"></a>

### Obtain the Required Permissions

You need permission to create and manage Amazon RDS instances and security groups.

The necessary permissions are granted using the `AmazonRDSFullAccess` AWS managed policy.

<a id="irsa_rds_s3_instance"></a>

### Set Up an RDS Instance

Develocity is compatible with PostgreSQL versions 14 through 18. The minimum storage space required is **250 GB** with 3,000 or more IOPS.

<a id="irsa_rds_s3_setup_create_root_credentials"></a>

#### Create a Root Username and Password

Create a root username and password for the database instance, referred to below as `«db-root-username»` and `«db-root-password»`, respectively. These are the credentials you will use for your database setup; save them somewhere secure.

<a id="create-a-security-group"></a>

#### Create a Security Group

Before creating the database, you have to create a security group in the VPC you want to use.

In this tutorial you will use the `eksctl` created VPC used by your cluster.

You can use a different VPC, but you will need to make the RDS instance accessible from your cluster (for example, by peering the VPCs).

To create the Security Group, run:

```shell
CLUSTER_VPC_ID=$(
  aws eks describe-cluster \
  --name develocity \
  --query 'cluster.resourcesVpcConfig.vpcId' \
  --output text
)
```

```shell
aws ec2 create-security-group --group-name develocity-database \
  --description "Develocity DB security group" \
  --vpc-id ${CLUSTER_VPC_ID}
```

<a id="enable-ingress"></a>

#### Enable Ingress

Then enable ingress to the RDS instance from your cluster for port 5432 by running:

```shell
CLUSTER_SECURITY_GROUP_ID=$(
  aws eks describe-cluster --name develocity \
  --query cluster.resourcesVpcConfig.clusterSecurityGroupId \
  --output text
)
```

```shell
RDS_SECURITY_GROUP_ID=$(
  aws ec2 describe-security-groups \
  --filters Name=group-name,Values=develocity-database \
  --query 'SecurityGroups[0].GroupId' \
  --output text
)
```

```shell
aws ec2 authorize-security-group-ingress \
  --protocol tcp --port 5432 \
  --source-group ${CLUSTER_SECURITY_GROUP_ID} \
  --group-id ${RDS_SECURITY_GROUP_ID}
```

<a id="create-a-subnet-group"></a>

#### Create a Subnet Group

Before creating the database, you need to create a subnet group to specify how the RDS instance will be networked.

This subnet group must have subnets in two availability zones, and typically should use private subnets.

`eksctl` has already created private subnets you can use.

Create a subnet group containing them by running:

```shell
CLUSTER_VPC_ID=$(
  aws eks describe-cluster \
  --name develocity \
  --query 'cluster.resourcesVpcConfig.vpcId' \
  --output text
)
```

```shell
SUBNET_IDS=$(
aws ec2 describe-subnets \
  --query 'Subnets[?!MapPublicIpOnLaunch].SubnetId' \
  --filters Name=vpc-id,Values=${CLUSTER_VPC_ID} \
  --output json
)
```

```shell
aws rds create-db-subnet-group --db-subnet-group-name develocity-database \
  --db-subnet-group-description "Develocity DB subnet group" \
  --subnet-ids ${SUBNET_IDS}
```

> [!NOTE]
> Consult [RDS’s subnet group documentation](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_VPC.WorkingWithRDSInstanceinaVPC.html#USER_VPC.Subnets) for more details on subnet groups and their requirements.

<a id="create-the-rds-instance"></a>

#### Create the RDS Instance

Create the RDS instance:

```shell
RDS_SECURITY_GROUP_ID=$(
aws ec2 describe-security-groups \
  --filters Name=group-name,Values=develocity-database \
  --query 'SecurityGroups[0].GroupId' \
  --output text
)
```

```shell
RDS_POSTGRES_VERSION=$(
aws rds describe-db-engine-versions \
  --engine postgres \
  --engine-version 17 \(1)
  --default-only \
  --query 'DBEngineVersions[0].EngineVersion' \
  --output text
)
```

1. The latest major version of PostgreSQL that Develocity supports.

```shell
aws rds create-db-instance \
  --engine postgres \
  --engine-version ${RDS_POSTGRES_VERSION} \
  --db-instance-identifier develocity-database \
  --db-name gradle_enterprise \
  --allocated-storage 250 \(1)
  --iops 3000 \(2)
  --db-instance-class db.m5.large \
  --db-subnet-group-name develocity-database \
  --backup-retention-period 3 \(3)
  --no-publicly-accessible \
  --vpc-security-group-ids ${RDS_SECURITY_GROUP_ID} \
  --master-username «db-root-username» \
  --master-user-password «db-root-password»
```

1. Develocity should be installed with 250GB of database storage to start with.
2. Develocity’s data volumes and database should support at least 3,000 IOPS.
3. The backup retention period, in days.

While you don’t configure it here, RDS supports [storage autoscaling](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_PIOPS.Autoscaling.html#USER_PIOPS.Autoscaling).

> [!NOTE]
> Consult [AWS’s database creation guide](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_CreateDBInstance.html) and the [CLI command reference](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/rds/create-db-instance.html) for more details on RDS instance creation.

You can view the status of your instance with:

```shell
aws rds describe-db-instances --db-instance-identifier develocity-database
```

Wait until the `DBInstanceStatus` is `available`.

Once `available`, you can see the hostname of the instance under `Endpoint` > `Address`. This is the hostname you will use to connect to the instance, subsequently referred to as `«database-hostname»`.

<a id="irsa_rds_s3_iam_authentication"></a>

### Configure the RDS Instance for IAM Authentication

Develocity supports connecting to the database using [IAM authentication](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.html). This step describes how to configure your RDS instance to allow IAM database authentication for all the database users that Develocity will connect as (including the superuser, although it’s possible for Develocity to not require superuser access, as explained in the [Database setup with IAM database authentication](https://docs.gradle.com/develocity/2026.1/reference/helm-charts/cluster/#database_setup_with_iam_database_authentication) section of the Kubernetes Helm chart Configuration Guide).

<a id="enable-iam-database-authentication-on-the-rds-instance"></a>

#### Enable IAM Database Authentication on the RDS Instance

To modify your created RDS database instance to allow IAM database authentication, run:

```shell
aws rds modify-db-instance \
  --db-instance-identifier develocity-database \
  --apply-immediately \
  --enable-iam-database-authentication
```

<a id="using-amazon-s3"></a>

## Using Amazon S3

Develocity can use a user-managed Object Storage instead of its own embedded version. This has several benefits, from scalable storage to reduced operation burden and better backup and failover management. This appendix will walk you through using an [Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) buckets to store Build Scan® data and monitoring data such as metrics.

<a id="irsa_rds_s3_obtain_permissions"></a>

### Obtain the Required Permissions

You will need permission to create and manage Amazon S3 buckets. You also need to create IAM policies and roles, but you already have permission to do that from the `eksctl` policies.

The necessary permissions can be granted by using the `AmazonS3FullAccess` AWS managed policy.

<a id="irsa_rds_s3_access"></a>

### Set Up S3 Buckets

To create the S3 buckets, run:

```shell
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text) \
aws s3 mb s3://develocity-application-data-${ACCOUNT_ID} && \(1)
aws s3 mb s3://develocity-monitoring-data-${ACCOUNT_ID} (2)
```

1. The name of the bucket meant to store application data, like Build Scan data or Build Cache entries
2. The name of the bucket meant to store monitoring data, like metrics collected during application lifetime

> [!NOTE]
> Storing data in different buckets allows you to apply various strategies, such as access control, replication, soft-delete, backup, and more. However, you can use only one bucket for both application and monitoring data; this is an operation’s decision based on your practices.

<a id="create-iam-policies-and-roles"></a>

## Create IAM Policies and Roles

<a id="create-policies-allowing-rds-and-s3-access"></a>

### Create Policies Allowing RDS and S3 Access

<a id="create-a-policy-allowing-rds-access"></a>

#### Create a Policy Allowing RDS Access

To create a role that’s permitted to connect to the RDS database as the required database users, using IAM authentication, create a `database-policy.json` file with the following content:

```shell
CONFIGURED_REGION=$(aws configure list | grep region | awk '{print $2}')
```

```shell
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
```

```shell
DBI_RESOURCE_ID=$(
  aws rds describe-db-instances \
  --db-instance-identifier develocity-database \
  --query 'DBInstances[0].DbiResourceId' \
  --output text
)
```

**database-policy.json:**

```
cat <<EOF > database-policy.json
{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect": "Allow",
         "Action": [
             "rds-db:connect"
         ],
         "Resource": [
             "arn:aws:rds-db:${CONFIGURED_REGION}:${ACCOUNT_ID}:dbuser:${DBI_RESOURCE_ID}/ge_app",
             "arn:aws:rds-db:${CONFIGURED_REGION}:${ACCOUNT_ID}:dbuser:${DBI_RESOURCE_ID}/ge_migrator",
             "arn:aws:rds-db:${CONFIGURED_REGION}:${ACCOUNT_ID}:dbuser:${DBI_RESOURCE_ID}/ge_monitor",
             "arn:aws:rds-db:${CONFIGURED_REGION}:${ACCOUNT_ID}:dbuser:${DBI_RESOURCE_ID}/«db-root-username»" (1)
         ]
      }
   ]
}
EOF
```

1. Replace «db-root-username» with the username you chose when creating your RDS instance’s root credentials.

Then run the following command:

```shell
aws iam create-policy \
  --policy-name "develocity-rds-access" \
  --policy-document file://database-policy.json
```

<a id="create-a-policy-allowing-application-data-bucket-access"></a>

#### Create a Policy Allowing Application Data Bucket Access

To create a role allowing access to the application data bucket, execute the following commands in the console:

**create-application-data-policy.sh:**

```
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text) \
  cat <<EOF > application-data-bucket-policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::develocity-application-data-${ACCOUNT_ID}"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject",
                "s3:AbortMultipartUpload"
            ],
            "Resource": [
                "arn:aws:s3:::develocity-application-data-${ACCOUNT_ID}/*"
            ]
        }
    ]
}
EOF
aws iam create-policy \
    --policy-name "develocity-s3-application-data-access" \
    --policy-document file://application-data-bucket-policy.json
```

<a id="create-a-policy-allowing-monitoring-data-bucket-access"></a>

#### Create a Policy Allowing Monitoring Data Bucket Access

To create a role allowing access to the monitoring data bucket, execute the following commands in the console:

**create-monitoring-data-policy.sh:**

```
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text) \
  cat <<EOF > monitoring-data-bucket-policy.json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::develocity-monitoring-data-${ACCOUNT_ID}"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject",
                "s3:AbortMultipartUpload"
            ],
            "Resource": [
                "arn:aws:s3:::develocity-monitoring-data-${ACCOUNT_ID}/*"
            ]
        }
    ]
}
EOF
aws iam create-policy \
    --policy-name "develocity-s3-monitoring-data-access" \
    --policy-document file://monitoring-data-bucket-policy.json
```

<a id="create-roles-for-develocity-components"></a>

### Create Roles for Develocity Components

We create 3 IAM roles for the Develocity components:

*   `Develocity_Database_Role` for the components that require access only to Amazon RDS.
    
*   `Develocity_Monitoring_Role` for the components that require access only to the S3 monitoring data bucket.
    
*   `Develocity_Application_Role` for the components that require access to both Amazon RDS and the S3 application data bucket.
    

To create the IAM roles, run the following commands:

Create the IAM role for the database access:

```shell
eksctl create iamserviceaccount \
  --name develocity-database-account \
  --namespace develocity \
  --cluster develocity \
  --approve \
  --role-only \
  --role-name Develocity_Database_Role \
  --attach-policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/develocity-rds-access
```

Create the IAM role for the monitoring data access:

```shell
eksctl create iamserviceaccount \
  --name develocity-monitoring-account \
  --namespace develocity \
  --cluster develocity \
  --approve \
  --role-only \
  --role-name Develocity_Monitoring_Role \
  --attach-policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/develocity-s3-monitoring-data-access
```

Create the IAM role for the application data and database access:

```shell
eksctl create iamserviceaccount \
  --name develocity-application-account \
  --namespace develocity \
  --cluster develocity \
  --approve \
  --role-only \
  --role-name Develocity_Application_Role \
  --attach-policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/develocity-rds-access
  --attach-policy-arn arn:aws:iam::${ACCOUNT_ID}:policy/develocity-s3-application-data-access
```

<a id="update-the-trust-relationship-policies"></a>

### Update the Trust Relationship Policies

To associate the service account with an AWS IAM role, we need to use an AWS OIDC provider. We already installed one when setting up the [Storage Class EBS CSI driver](https://docs.gradle.com/develocity/2026.1/installation/aws/aws-eks-cluster/#storage_class), so we can use it here.

```shell
OIDC_PROVIDER=$(aws eks describe-cluster --name develocity \
--query "cluster.identity.oidc.issuer" \
--output text | sed -e "s/^https:\/\///")
```

Update the database trust relationship policy:

```shell
cat <<EOF > database-trust-relationship.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::$ACCOUNT_ID:oidc-provider/$OIDC_PROVIDER"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "${OIDC_PROVIDER}:sub": "system:serviceaccount:develocity:gradle-database",
          "${OIDC_PROVIDER}:aud": "sts.amazonaws.com"
        },
        "StringEquals": {
          "${OIDC_PROVIDER}:sub": "system:serviceaccount:develocity:gradle-test-distribution-broker",
          "${OIDC_PROVIDER}:aud": "sts.amazonaws.com"
        },
        "StringEquals": {
          "${OIDC_PROVIDER}:sub": "system:serviceaccount:develocity:gradle-keycloak",
          "${OIDC_PROVIDER}:aud": "sts.amazonaws.com"
        }
      }
    }
  ]
}
EOF
```

```shell
aws iam update-assume-role-policy \
  --role-name Develocity_Database_Role \
  --policy-document file://database-trust-relationship.json
```

Update the application data trust relationship policy:

```shell
cat <<EOF > application-data-trust-relationship.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::$ACCOUNT_ID:oidc-provider/$OIDC_PROVIDER"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "${OIDC_PROVIDER}:sub": "system:serviceaccount:develocity:gradle-enterprise-app",
          "${OIDC_PROVIDER}:aud": "sts.amazonaws.com"
        },
        "StringEquals": {
          "${OIDC_PROVIDER}:sub": "system:serviceaccount:develocity:gradle-enterprise-app-background-processor",
          "${OIDC_PROVIDER}:aud": "sts.amazonaws.com"
        }
      }
    }
  ]
}
EOF
```

```shell
aws iam update-assume-role-policy \
  --role-name Develocity_Application_Role \
  --policy-document file://application-data-trust-relationship.json
```

Update the monitoring data trust relationship policy:

```shell
cat <<EOF > monitoring-data-trust-relationship.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::$ACCOUNT_ID:oidc-provider/$OIDC_PROVIDER"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "${OIDC_PROVIDER}:sub": "system:serviceaccount:develocity:gradle-enterprise-operator",
          "${OIDC_PROVIDER}:aud": "sts.amazonaws.com"
        },
        "StringEquals": {
          "${OIDC_PROVIDER}:sub": "system:serviceaccount:develocity:gradle-monitoring",
          "${OIDC_PROVIDER}:aud": "sts.amazonaws.com"
        }
      }
    }
  ]
}
EOF
```

```shell
aws iam update-assume-role-policy \
  --role-name Develocity_Monitoring_Role \
  --policy-document file://monitoring-data-trust-relationship.json
```

<a id="irsa_rds_s3_config"></a>

### Configure Develocity to Use RDS and S3

<a id="update-your-installations-resource-requirements"></a>

#### Update Your Installation’s Resource Requirements

When using S3 Build Scan storage, Develocity uses more memory.

To update Develocity’s memory usage specification, update your Helm values file with the following values:

**values.yaml:**

```
enterprise:
  resources:
    requests:
      memory: 6Gi (1)
    limits:
      memory: 6Gi (1)
```

1. If you have already set a custom value here, instead increase it by 2Gi.

> [!IMPORTANT]
> When adding items to your Helm values file, merge any duplicate blocks. Alternatively, you can use separate files and pass all of them with `--values «file»` when running Helm commands.

> [!WARNING]
> You may need to scale up your cluster or use nodes with more memory to be able to satisfy the increased memory requirements. See [create cluster](https://docs.gradle.com/develocity/2026.1/installation/aws/aws-eks-cluster/#create_cluster) for scaling instructions.

If you are additionally using the background processor component, you should also update its values:

**values.yaml:**

```
enterpriseBackgroundProcessor:
  resources:
    requests:
      memory: 6Gi (1)
    limits:
      memory: 6Gi (1)
```

1. If you have already set a custom value here, instead increase it by 2Gi.

<a id="create-unattended-configuration"></a>

#### Create Unattended Configuration

Develocity must now be configured to use S3. To do this, you must use the [unattended configuration mechanism](https://docs.gradle.com/develocity/2026.1/administration/unattended-configuration/).

Develocity can [store Build Scan data in either the configured database or in the configured object store](https://docs.gradle.com/develocity/2026.1/administration/build-scan/build-scan-storage/).

The unattended configuration mechanism lets you configure which of these is used to store Build Scan data as part of a configuration file, which can be embedded in your Helm values file as described in the [unattended configuration guide](https://docs.gradle.com/develocity/2026.1/administration/unattended-configuration/).

This section will describe how to extend your Helm values file to include the correct unattended configuration block for S3 Build Scan storage.

First, we need to create a minimal unattended configuration file. This requires you to choose a password for the system user and hash it. To do this, install [Develocityctl](https://docs.gradle.com/develocity/develocityctl/1.22/).

The following command will prompt you to enter a password and write the hash into the `secret.txt`. We will refer to the hashed password as `«hashed-system-password»`

```shell
develocityctl config-file hash -o secret.txt
```

<a id="update-your-helm-values-file"></a>

#### Update Your Helm Values File

> [!NOTE]
> The superuser credentials are only required to set up the database and create the migrator and application users. IAM authentication doesn’t work with the superuser without the role `rds_iam`. For the sake of simplicity, we still use password authentication for the superuser in this tutorial. Consider setting up the database yourself, as described in the [Database options](https://docs.gradle.com/develocity/2026.1/reference/helm-charts/cluster/#database_type) section of Develocity’s installation manual, to avoid superuser usage. For this option to work, you must follow the instructions above [to enable and configure IAM database authentication](#irsa_rds_s3_iam_authentication) for the migrator and application users.

**values.yaml:**

```
global:
  unattended:
    configuration:
      version: 15 (1)
      systemPassword: "«hashed-system-password»" (2)
      buildScans:
        incomingStorageType: objectStorage

enterprise:
  resources:
    requests:
      memory: 8Gi (3)
    limits:
      memory: 8Gi (3)
  serviceAccount:
    annotations:
      eks.amazonaws.com/role-arn: "arn:aws:iam::«account-id»:role/Develocity_Application_Role" (4)

enterpriseBackgroundProcessor:
  serviceAccount:
    annotations:
      eks.amazonaws.com/role-arn: "arn:aws:iam::«account-id»:role/Develocity_Application_Role" (4)

monitoring:
  serviceAccount:
    annotations:
      eks.amazonaws.com/role-arn: "arn:aws:iam::«account-id»:role/Develocity_Monitoring_Role" (5)

operator:
  serviceAccount:
    annotations:
      eks.amazonaws.com/role-arn: "arn:aws:iam::«account-id»:role/Develocity_Monitoring_Role" (5)

testDistribution:
  serviceAccount:
    annotations:
      eks.amazonaws.com/role-arn: "arn:aws:iam::«account-id»:role/Develocity_Database_Role"

authenticationBroker:
  serviceAccount:
    annotations:
      eks.amazonaws.com/role-arn: "arn:aws:iam::«account-id»:role/Develocity_Database_Role"

database:
  serviceAccount:
    annotations:
      "eks.amazonaws.com/role-arn": "arn:aws:iam::«account-id»:role/Develocity_Database_Role" (6)
  location: user-managed
  provider: aws-rds
  connection:
    host: «database-hostname»
    databaseName: gradle_enterprise
  credentials:
    type: irsa
    superuser:
      username: «db-root-username» (7)
      password: «db-root-password» (7)

objectStorage:
  type: s3
  s3:
    bucket: develocity-application-data-«account-id» (8)
    region: «region» (8)
    credentials:
      type: irsa (10)
    monitoring:
      bucket: develocity-monitoring-data-«account-id» (9)
      region: «region» (9)
      credentials:
        type: irsa (10)
```

1. The version of the unattended configuration.
2. Your hashed system password.
3. If you have already set a custom value here, instead increase it by 2Gi.
4. The ARN of the IAM role you created for the application data and database access.
5. The ARN of the IAM role you created for the monitoring data access.
6. The ARN of the IAM role you created for the database access.
7. The RDS root credentials you chose earlier.
8. The name and region of the S3 bucket you created for application data.
9. The name and region of the S3 bucket you created for monitoring data.
10. The type of AWS credentials, in this example, the IAM Roles for Service Account, as described in IAM Roles for Service Account credentials configuration (IRSA).

Once you have updated your Helm values file as described above, you need to reapply it using the method described in [Changing Configuration Values](https://docs.gradle.com/develocity/2026.1/reference/helm-charts/cluster/#changing_configuration_values). This will update your Develocity installation to use the unattended configuration you created above, and Develocity will restart.

> [!IMPORTANT]
> Switching between embedded Object Storage and user-managed Object Storage isn’t supported, starting with S3 is recommended as a more scalable solution, as data migration won’t be possible later on.

<a id="verify-s3-storage-is-used"></a>

#### Verify S3 Storage Is Used

> [!WARNING]
> Develocity will start even if your S3 configuration is incorrect.

To confirm that Develocity is storing incoming Build Scans in S3 and also able to read Build Scan data from S3, you should first upload a new Build Scan to your Develocity instance. Second, confirm that you can view the Build Scan. Finally, confirm that the Build Scan is stored in your S3 bucket, by running:

```shell
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
```

```shell
aws s3 ls s3://develocity-application-data-${ACCOUNT_ID}/build-scans/ \(1)
  --recursive --human-readable --summarize
```

1. If you used a custom prefix, use it here instead of build-scans.

**Output:**

```
2025-05-27 19:11:06    6.6 KiB build-scans/2025/05/27/aprvi3bnnxyzm

Total Objects: 1
   Total Size: 6.6 KiB
```

<a id="next_steps"></a>

## Next Steps

*   [Kubernetes Helm Chart Configuration Guide](https://docs.gradle.com/develocity/2026.1/reference/helm-charts/cluster/): Develocity Helm chart options.
    
*   [Develocity Administration](https://docs.gradle.com/develocity/2026.1/administration/): Learn how to configure and administer Develocity.
    
*   [DPE University](https://dpeuniversity.gradle.com/app/catalog?product=Develocity): A free, self-paced training portal to get the most out of Develocity.