Skip to content

Commit 8484ee9

Browse files
are-cesclaude
andcommitted
LCORE-1724: use native AWS SDK OIDC auth instead of pre-exchanged STS creds
Mount OIDC token directly in MAPT containers and let the AWS SDK handle the STS exchange internally via AWS_WEB_IDENTITY_TOKEN_FILE and AWS_ROLE_ARN. Remove get-aws-creds task. Role ARN read from aws-mapt-credentials secret. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent cb675e0 commit 8484ee9

1 file changed

Lines changed: 35 additions & 79 deletions

File tree

.tekton/integration-tests/pipeline/lightspeed-stack-rhelai-test.yaml

Lines changed: 35 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -40,71 +40,20 @@ spec:
4040
default: 'false'
4141
type: string
4242
tasks:
43-
# ── AWS OIDC authentication ──
44-
- name: get-aws-creds
45-
description: Obtain temporary AWS credentials via OIDC federation.
46-
taskSpec:
47-
results:
48-
- name: aws-access-key-id
49-
- name: aws-secret-access-key
50-
- name: aws-session-token
51-
volumes:
52-
- name: oidc-token
53-
projected:
54-
sources:
55-
- serviceAccountToken:
56-
audience: sts.amazonaws.com
57-
expirationSeconds: 3600
58-
path: token
59-
steps:
60-
- name: assume-role
61-
image: amazon/aws-cli:latest
62-
volumeMounts:
63-
- name: oidc-token
64-
mountPath: /var/run/secrets/oidc
65-
readOnly: true
66-
script: |
67-
#!/bin/sh
68-
set -euo pipefail
69-
echo "[sts] Assuming role via OIDC..."
70-
CREDS=$(aws sts assume-role-with-web-identity \
71-
--role-arn "arn:aws:iam::313828097073:role/konflux-rhelai-ci" \
72-
--role-session-name "rhelai-$(context.pipelineRun.name)" \
73-
--web-identity-token file:///var/run/secrets/oidc/token \
74-
--duration-seconds 14400 \
75-
--output json)
76-
echo "$CREDS" | python3 -c "
77-
import json, sys
78-
c = json.load(sys.stdin)['Credentials']
79-
open('$(results.aws-access-key-id.path)', 'w').write(c['AccessKeyId'])
80-
open('$(results.aws-secret-access-key.path)', 'w').write(c['SecretAccessKey'])
81-
open('$(results.aws-session-token.path)', 'w').write(c['SessionToken'])
82-
"
83-
echo "[sts] Temporary credentials obtained (valid 4h)."
84-
echo "[sts] Key ID length: $(wc -c < $(results.aws-access-key-id.path))"
85-
echo "[sts] Secret length: $(wc -c < $(results.aws-secret-access-key.path))"
86-
echo "[sts] Token length: $(wc -c < $(results.aws-session-token.path))"
87-
echo "[sts] Key ID hash: $(md5sum $(results.aws-access-key-id.path) | cut -d' ' -f1)"
88-
echo "[sts] Token hash: $(md5sum $(results.aws-session-token.path) | cut -d' ' -f1)"
89-
9043
# ── RHEL AI provisioning (MAPT) ──
9144
- name: provision-rhelai
9245
description: Provision a RHEL AI instance with vLLM auto-started.
9346
timeout: 2h
9447
runAfter:
9548
# TODO: restore provision-cluster dependency
96-
- get-aws-creds
97-
- get-aws-creds
49+
- provision-cluster
9850
taskSpec:
9951
params:
10052
- name: rhelai-version
10153
- name: instance-type
10254
- name: model
10355
- name: debug
10456
- name: spot
105-
- name: aws-access-key-id
106-
- name: aws-secret-access-key
107-
- name: aws-session-token
10857
results:
10958
- name: host
11059
description: "RHEL AI instance hostname or IP"
@@ -118,19 +67,36 @@ spec:
11867
secretName: aws-mapt-credentials
11968
- name: host-info
12069
emptyDir: {}
70+
- name: oidc-token
71+
projected:
72+
sources:
73+
- serviceAccountToken:
74+
audience: sts.amazonaws.com
75+
expirationSeconds: 3600
76+
path: token
12177
steps:
12278
- name: create-instance
12379
image: ghcr.io/redhat-developer/mapt:pr-848
12480
imagePullPolicy: Always
12581
env:
12682
- name: HOME
12783
value: /opt/mapt/run
84+
- name: AWS_WEB_IDENTITY_TOKEN_FILE
85+
value: /var/run/secrets/oidc/token
86+
- name: AWS_ROLE_ARN
87+
valueFrom:
88+
secretKeyRef:
89+
name: aws-mapt-credentials
90+
key: AWS_ROLE_ARN
12891
volumeMounts:
12992
- name: aws-credentials
13093
mountPath: /opt/aws-credentials
13194
readOnly: true
13295
- name: host-info
13396
mountPath: /opt/host-info
97+
- name: oidc-token
98+
mountPath: /var/run/secrets/oidc
99+
readOnly: true
134100
resources:
135101
requests:
136102
cpu: "100m"
@@ -142,15 +108,6 @@ spec:
142108
#!/bin/sh
143109
set -uo pipefail
144110
145-
export AWS_ACCESS_KEY_ID="$(params.aws-access-key-id)"
146-
export AWS_SECRET_ACCESS_KEY="$(params.aws-secret-access-key)"
147-
export AWS_SESSION_TOKEN="$(params.aws-session-token)"
148-
export AWS_STS_REGIONAL_ENDPOINTS=regional
149-
echo "[mapt] Key ID length: ${#AWS_ACCESS_KEY_ID}"
150-
echo "[mapt] Secret length: ${#AWS_SECRET_ACCESS_KEY}"
151-
echo "[mapt] Token length: ${#AWS_SESSION_TOKEN}"
152-
echo "[mapt] Key ID hash: $(echo -n "$AWS_ACCESS_KEY_ID" | md5sum | cut -d' ' -f1)"
153-
echo "[mapt] Token hash: $(echo -n "$AWS_SESSION_TOKEN" | md5sum | cut -d' ' -f1)"
154111
BUCKET=$(cat /opt/aws-credentials/S3_BUCKET)
155112
RUN_ID="$(context.pipelineRun.name)"
156113
HF_TOKEN=$(cat /opt/aws-credentials/HUGGING_FACE_HUB_TOKEN)
@@ -241,12 +198,6 @@ spec:
241198
value: "$(params.debug)"
242199
- name: spot
243200
value: "$(params.spot)"
244-
- name: aws-access-key-id
245-
value: "$(tasks.get-aws-creds.results.aws-access-key-id)"
246-
- name: aws-secret-access-key
247-
value: "$(tasks.get-aws-creds.results.aws-secret-access-key)"
248-
- name: aws-session-token
249-
value: "$(tasks.get-aws-creds.results.aws-session-token)"
250201

251202
# ── OpenShift cluster provisioning (same as existing e2e pipeline) ──
252203
- name: eaas-provision-space
@@ -481,33 +432,41 @@ spec:
481432
params:
482433
- name: debug
483434
value: "$(params.debug)"
484-
- name: aws-access-key-id
485-
value: "$(tasks.get-aws-creds.results.aws-access-key-id)"
486-
- name: aws-secret-access-key
487-
value: "$(tasks.get-aws-creds.results.aws-secret-access-key)"
488-
- name: aws-session-token
489-
value: "$(tasks.get-aws-creds.results.aws-session-token)"
490435
taskSpec:
491436
params:
492437
- name: debug
493-
- name: aws-access-key-id
494-
- name: aws-secret-access-key
495-
- name: aws-session-token
496438
volumes:
497439
- name: aws-credentials
498440
secret:
499441
secretName: aws-mapt-credentials
442+
- name: oidc-token
443+
projected:
444+
sources:
445+
- serviceAccountToken:
446+
audience: sts.amazonaws.com
447+
expirationSeconds: 3600
448+
path: token
500449
steps:
501450
- name: destroy-instance
502451
image: ghcr.io/redhat-developer/mapt:pr-848
503452
imagePullPolicy: Always
504453
env:
505454
- name: HOME
506455
value: /opt/mapt/run
456+
- name: AWS_WEB_IDENTITY_TOKEN_FILE
457+
value: /var/run/secrets/oidc/token
458+
- name: AWS_ROLE_ARN
459+
valueFrom:
460+
secretKeyRef:
461+
name: aws-mapt-credentials
462+
key: AWS_ROLE_ARN
507463
volumeMounts:
508464
- name: aws-credentials
509465
mountPath: /opt/aws-credentials
510466
readOnly: true
467+
- name: oidc-token
468+
mountPath: /var/run/secrets/oidc
469+
readOnly: true
511470
resources:
512471
requests:
513472
cpu: "100m"
@@ -519,9 +478,6 @@ spec:
519478
#!/bin/sh
520479
set -uo pipefail
521480
522-
export AWS_ACCESS_KEY_ID="$(params.aws-access-key-id)"
523-
export AWS_SECRET_ACCESS_KEY="$(params.aws-secret-access-key)"
524-
export AWS_SESSION_TOKEN="$(params.aws-session-token)"
525481
export AWS_DEFAULT_REGION="us-east-1"
526482
BUCKET=$(cat /opt/aws-credentials/S3_BUCKET)
527483
RUN_ID="$(context.pipelineRun.name)"

0 commit comments

Comments
 (0)