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:
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
2. Attach service permissions
Grant only what your skills need.Redshift
Redshift
Athena
Athena
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: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:Troubleshooting
sts:AssumeRole AccessDenied (self-assume)
sts:AssumeRole AccessDenied (self-assume)
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.Service connection timeout
Service connection timeout
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.

