Cross-account S3 Access Point authentication (IRSA or EKS Pod Identity)
Use this guide when the ADOC Data Plane runs on EKS in one AWS account (Account A) and reads data through an S3 Access Point hosted in a different AWS account (Account B). The bucket and the Access Point live in Account B. Pods in Account A use one dedicated IAM role, and ADOC connects to the Access Point as the datasource.
Complete the shared setup once, then choose exactly one authentication option:
Option 1: IRSA
Option 2: EKS Pod Identity
For a scenario where the cluster, bucket, Access Point, and IAM role are all in the same AWS account, see Same-account S3 Access Point authentication. This is also a different mechanism from Cross‑Account Access Setup, which grants direct cross-account bucket access without an Access Point.
Required values
Token | Meaning |
|---|---|
| Same region as EKS, the bucket, and the Access Point |
| The account that hosts EKS |
| The account that hosts the bucket and the Access Point |
| EKS cluster name in Account A |
| The Data Plane's live namespace |
| Bucket name in Account B |
| Access Point name in Account B |
| Access Point alias, assigned after creation. Ends with |
|
|
| Allowed folder, for example |
| Dedicated IAM role in Account A. Create a new role — do not reuse a same-account Access Point role |
| OIDC host with no |
| The deployment that uses service account |
| Bucket in Account A used for Spark event logs |
Confirm service account names with kubectl -n <namespace> get sa. There is no service account named dataplane-spark. Skip any service account that does not exist. Skip any deployment that is already failing, for example CrashLoopBackOff.
Service accounts in scope
analysis-serviceanalysis-standalone-servicespark-schedulertorch-monitorsanalysis-sql-servicespark-history-serveracceldata-dataplane-spark
Shared setup
Step 1: Create the bucket in Account B
Log in to Account B.
Create bucket
<bucket>in region<region>.Keep Block Public Access enabled.
Upload sample files under
<prefix>, for exampleallowed/sample.csv.Leave the bucket policy empty until the IAM role in Account A exists.
Step 2: Create the Access Point in Account B
In S3, open bucket
<bucket>and create Access Point<ap-name>.Choose the same bucket
<bucket>.Set network to Internet, or the VPC used by the cluster.
Keep Block Public Access enabled.
Copy the Access Point ARN and alias.
Do not put a prefix condition on s3:ListBucket. ADOC Test Connection uses HeadBucket and does not send a prefix.
Step 3: Create the IAM role and inline S3 policy in Account A
Create IAM role <iam-role> in Account A. Set the trust relationship later, in Option 1 or Option 2. Attach this inline S3 policy to the role:
Cross-account access requires both the Access Point ARN and the bucket ARN on the IAM role.
Step 4: Add the Access Point policy in Account B
On Access Point <ap-name>, allow only the Account A role:
Step 5: Add the bucket policy in Account B
The Access Point policy works only if the bucket policy also allows the request. Add one of the following patterns and preserve any unrelated existing statements.
Option A: Access Point only. Use this when the role should access the bucket only through the Access Point, and no other service uses the raw bucket name.
Option B: Access Point and raw bucket. Use this when the same role must also access s3://<bucket> or s3a://<bucket>/... directly.
Option 1: IRSA
Confirm or create the OIDC provider
Strip https:// from the result. That value is <oidc-host>. If the result is empty, create the provider:
Set the IRSA trust policy
Update the trust relationship on role <iam-role>:
Remove Pod Identity associations for these service accounts, if any
If a service account has both Pod Identity and IRSA, Pod Identity wins. For an IRSA-only setup, remove those associations first.
Delete each matching association:
Annotate the service accounts
Restart deployments
Wait until the deployments are ready. If needed, find the standalone deployment:
Confirm IRSA on a pod
Expected result for IRSA: AWS_ROLE_ARN=arn:aws:iam::<account-a-id>:role/<iam-role> is present and AWS_CONTAINER_CREDENTIALS_FULL_URI is not present.
Option 2: EKS Pod Identity
Confirm the Pod Identity agent
The agent must be running.
Set the Pod Identity trust policy
In the role, add this trust policy statement:
If you already completed IRSA setup, add this statement to the existing trust policy and keep the OIDC statement. sts:TagSession is required.
Recreate service account associations
List current associations:
If a target service account already has an association, delete it before creating the new one:
Create the associations:
You can leave the IRSA annotation on the service accounts. When both exist, Pod Identity is used instead of IRSA.
Restart deployments
Wait until the deployments are ready. Spark job pods pick this up on the next crawl.
Confirm Pod Identity on a pod
Expected result for Pod Identity: AWS_CONTAINER_CREDENTIALS_FULL_URI is present and AWS_ROLE_ARN is absent.
Verify access from the cluster
Run these checks after completing either Option 1 or Option 2. Delete any leftover ap-head pod first. Create a new pod each time. Read logs after the pod reaches Completed. Do not exec into it.
1. HeadBucket using the Access Point ARN
Pass condition: the logs return JSON that includes BucketRegion.
2. HeadObject using the Access Point alias
Pass condition: the logs return JSON that includes ContentLength or ETag.
Configure the ADOC datasource
In ADOC, add a new AWS S3 datasource. For the general steps to open the Add Data Source wizard, see Amazon S3. Use these values for a cross-account Access Point connection.
Connection field | Value |
|---|---|
Region |
|
Authentication | Option 1: AWS IAM Roles For Service Accounts. Option 2: EKS Pod Identity |
Bucket Name |
|
Data Plane | This cluster's Data Plane in |
Select Test Connection. A successful result shows the datasource connected.
Asset or Observability configuration
Field | Value |
|---|---|
Asset Name | Any label |
Path Expression |
|
File Type / delimiter | Match the files under |
Crawler schedule / notify / cadence | Optional |
Run the crawl, then run the profile.
GET /validate on analysis-service is a health probe. The relevant jobs for datasource testing use type CONNECTION_VALIDATION.
Troubleshooting
If ADOC Test Connection fails on bucket access, verify that the bucket policy in Account B allows the role from Account A, in addition to the Access Point policy.
If
HeadBucketfails butHeadObjectworks, recheck that no prefix condition was added tos3:ListBucket.If IRSA is configured but pods still use container credentials, look for existing Pod Identity associations on the same service account.
If Pod Identity is configured but credentials are missing, confirm the
eks-pod-identity-agentdaemonset is running and the trust policy includessts:TagSession.If the alias fails in ADOC, use
<ap-arn>for connection testing, then confirm alias resolution separately.
For additional help, contact www.acceldata.force.com OR call our service desk +1 844 9433282
Copyright © 2025