Skip to main content
This page covers skill access to AWS (Redshift, Athena, S3, EKS), not model access. xpander calls Amazon Bedrock with the pods’ own credentials, so bedrock:InvokeModel* and bedrock:Converse* go on the role bound to the pods, not on a skill role. See Amazon Bedrock without a key and, for Hybrid, Amazon Bedrock: keyless IAM or API key.

Architecture overview

Why three tiers

Using one role for all skills, as in AWS Operator Setup? This page splits it per skill.

Step 1: Base role

The only role on the pods. No service permissions, only assume.
Add an inline policy AssumeConnectorRoles to xpander-base-role, and extend Resource as you add skills:
Associate it with the xpander service accounts:

Step 2: Skill roles

Each skill role needs a trust policy with four statements:

Trust Policy Template

SelfAssume and AllowFromBaseRole must not have an ExternalId condition. The skill relay passes none, so the skill would fail with AccessDenied.

Permission policies per skill

Self-Assume + Session Tagging (required for all skill roles)

The EKS skill also needs Kubernetes RBAC:

Step 3: Configure in xpander UI

Set each skill connection’s IAM Role ARN to its skill role, not the base role:

Adding a new skill

For S3, DynamoDB, Athena or any other AWS skill:
1

Create the skill role

Use the trust policy template above.
2

Attach service-specific permissions

Add the service permissions and the self-assume policy.
3

Update the base role

Add the new role ARN to the AssumeConnectorRoles policy on the base role.
4

Configure in xpander UI

Set the skill’s IAM Role ARN.
5

Restart the skill relay

No Pod Identity change is needed.

Role creation order

A role can’t reference itself at creation:
  1. Create the role with only the PodIdentity and CrossAccountWithExternalId trust statements.
  2. Wait 10 seconds for IAM propagation.
  3. Update the trust policy to add the SelfAssume and AllowFromBaseRole statements.

Troubleshooting

Allow sts:TagSession in both the trust policy (from the caller) and the permission policy (on the role’s own ARN).
Remove any ExternalId condition from SelfAssume and AllowFromBaseRole, and add the self-assume permission policy.
The base role’s policy must list the skill role ARN, and the skill role’s trust policy must have AllowFromBaseRole.
Self-hosted chains through the base role without an ExternalId. Add the AllowFromBaseRole trust statement.

Security recommendations

Next steps

Set up the AWS Operator

The single-role setup.

Give Bedrock access to the pods

Model access on the pod role.