Skip to main content

Overview

The AWS APIs Operator is the component that lets xpander agents interact with AWS services in your account - Redshift, Athena, Power BI, and more. In a self-hosted deployment, the operator runs inside your VPC and uses IAM roles with EKS Pod Identity to authenticate. No AWS credentials leave your cluster.

How It Works

When an agent calls an AWS skill (for example, “query this Redshift table”), the request flows through the Agent Controller’s embedded skill relay (agent-controller). The relay assumes an IAM role via Pod Identity and hands the call to the AWS Operator service. The role is scoped to specific AWS services and resources, and the AWS API is called on behalf of the agent, all within your VPC. The Agent Controller runs as the agent-controller ServiceAccount, and every other component runs as the namespace’s default ServiceAccount. Create the Pod Identity association below for both; do not scope it to a single pod. The IAM role requires 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. The agent-controller leg to the operator stays off unless agent-controller.awsOperator.url is set. AWS skill calls (Redshift, S3, Athena, EKS) run from the functions service instead. The agent-controller assumes the IAM role from the skill’s connection and passes the temporary credentials to functions, which makes the AWS calls. Redshift Data API calls therefore carry a database user such as IAMR:<role-name>. The steps below still apply: create the role, attach the permissions, and associate it with Pod Identity. The role can do only what its permission policy grants. A missing action fails the call with not authorized to perform: <action>. For example, an S3 skill fails with s3:ListAllMyBuckets, and an Athena skill fails with athena:ListWorkGroups. Grant these actions for each skill you use. The list comes from the calls each skill makes. It is not yet verified on a live air-gapped install.

1. Create the IAM Role

Add the self-assume permission policy:

2. Attach Service Permissions

Attach permission policies based on which AWS skills your agents will use. Only grant what’s needed.
For a full Redshift walkthrough (cluster creation, IAM-mapped user, skill configuration), see Amazon Redshift (Self-Hosted).

3. Associate Role with Pod Identity

4. Network Access

If the AWS service runs inside your VPC (e.g., a private Redshift cluster), ensure the service’s security group allows traffic from the EKS cluster security group:
For services outside your VPC (e.g., S3, Athena), no security group changes are needed - the NAT Gateway handles outbound access.

5. Configure in xpander

Once the IAM role and network access are set up, developers can configure individual AWS skills in Xpander Chat. Each skill’s connection requires:
  • IAM Role ARN - the role created above
  • Region - your AWS region
  • Auth Method - IAM
  • Service-specific parameters (cluster ID, database name, bucket name, etc.)

Supported AWS Skills

The AWS APIs Operator supports any AWS service accessible via IAM. Common skills:

Redshift

Query private Redshift clusters

Athena

Run Athena queries

Power BI

Connect to Power BI datasets
See the skills catalog for all available skills.

Credential Management with AWS Secrets Manager

Instead of storing a skill’s API keys directly in xpander, you can pull them from AWS Secrets Manager at runtime. This keeps credentials out of xpander’s database entirely.

How It Works

  1. Enable “Use AWS Secrets Manager” in the skill’s connection settings in xpander
  2. Provide the secret ARN (e.g., arn:aws:secretsmanager:us-east-1:123456789012:secret:my-api-key-AbCdEf)
  3. The xpander pod uses its IAM role to retrieve the secret at runtime
  4. Credentials are never persisted in xpander’s storage

Required Permissions

Add Secrets Manager access 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 the service’s security group allows the relevant port from the EKS cluster security group. For VPC-internal services, they must be in the same VPC or have VPC peering/transit gateway configured.