Skip to main content
The AWS APIs Operator runs in your VPC and calls services such as Redshift, Athena and Power BI with IAM roles through EKS Pod Identity. No AWS credentials leave your cluster.

How the operator works

The Agent Controller’s skill relay (agent-controller) assumes an IAM role through Pod Identity and hands the call to the AWS Operator, which calls the AWS API in your VPC. The Agent Controller runs as the agent-controller ServiceAccount and everything else as default: associate the role with both, not with one pod. The role needs three trust principals:
The self-assume statement must not have an ExternalId condition. The Agent Controller calls sts:AssumeRole on its own role without passing an external ID. If this statement has a condition, you’ll get AccessDenied errors.

Air-gapped installs

The air-gapped chart (xpander-airgap) ships no AWS Operator pod, and the operator leg stays off unless agent-controller.awsOperator.url is set. Instead, AWS skill calls (Redshift, S3, Athena, EKS) run from the functions service: the agent-controller assumes the skill connection’s role and passes it temporary credentials. Redshift Data API calls carry a database user such as IAMR:<role-name>. The steps below still apply. A missing permission fails with not authorized to perform: <action>, for example s3:ListAllMyBuckets or athena:ListWorkGroups. Grant these per skill (taken from the calls each skill makes, not yet verified on a live air-gapped install):

1. Create the IAM role

Add the self-assume permission policy:

2. Attach service permissions

Grant only what your skills need.
Full walkthrough: Amazon Redshift (Self-Hosted).

3. Associate the role with Pod Identity

4. Network access

For a service inside your VPC, such as a private Redshift cluster, allow the EKS cluster security group:
Services outside your VPC, such as S3 and Athena, need no change: the NAT Gateway handles outbound access.

5. Configure in xpander

Each AWS skill connection in xpander Chat takes:

Supported AWS skills

Any AWS service IAM can reach works. Common ones:

Redshift

Query private Redshift clusters

Athena

Run Athena queries

Power BI

Connect to Power BI datasets

Credential Management with AWS Secrets Manager

A skill can read its keys from AWS Secrets Manager at runtime, so they never enter xpander’s database.

How Secrets Manager works

1

Turn it on

Enable “Use AWS Secrets Manager” in the skill’s connection settings in xpander.
2

Point to the secret

Provide the secret ARN, for example arn:aws:secretsmanager:us-east-1:123456789012:secret:my-api-key-AbCdEf.
3

xpander reads it at runtime

The pod reads it with its IAM role. Nothing is persisted.

Required permissions

Add to the IAM role:
Use specific secret ARNs instead of wildcards. Organize secrets by environment (xpander/prod/, xpander/staging/) and enable CloudTrail for audit logging.

Troubleshooting

Add sts:TagSession to both the trust policy AND as a permission policy on the role.
The Agent Controller re-assumes its own role internally. The trust policy needs a SelfAssume statement for the role’s own ARN without an ExternalId condition. Also add sts:AssumeRole as a permission policy.
Check that the service’s security group allows the relevant port from the EKS cluster security group. A VPC-internal service must be in the same VPC, or reachable through VPC peering or a transit gateway.

Next steps

Connect a private Redshift cluster

The full walkthrough.

Browse the skills catalog

Every skill.