Skip to content

Commit 63c1d28

Browse files
are-cesclaude
andcommitted
LCORE-1724: use OIDC federation for AWS credentials
Replace static AWS access keys with short-lived STS credentials obtained via OIDC federation. Separate get-aws-creds task ensures creds are available for both provision and destroy steps. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 62a2b1c commit 63c1d28

1 file changed

Lines changed: 67 additions & 4 deletions

File tree

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

Lines changed: 67 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,19 +40,65 @@ 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+
4385
# ── RHEL AI provisioning (MAPT) ──
4486
- name: provision-rhelai
4587
description: Provision a RHEL AI instance with vLLM auto-started.
4688
timeout: 2h
4789
runAfter:
4890
- provision-cluster
91+
- get-aws-creds
4992
taskSpec:
5093
params:
5194
- name: rhelai-version
5295
- name: instance-type
5396
- name: model
5497
- name: debug
5598
- name: spot
99+
- name: aws-access-key-id
100+
- name: aws-secret-access-key
101+
- name: aws-session-token
56102
results:
57103
- name: host
58104
description: "RHEL AI instance hostname or IP"
@@ -90,8 +136,9 @@ spec:
90136
#!/bin/sh
91137
set -uo pipefail
92138
93-
export AWS_ACCESS_KEY_ID=$(cat /opt/aws-credentials/AWS_ACCESS_KEY_ID)
94-
export AWS_SECRET_ACCESS_KEY=$(cat /opt/aws-credentials/AWS_SECRET_ACCESS_KEY)
139+
export AWS_ACCESS_KEY_ID="$(params.aws-access-key-id)"
140+
export AWS_SECRET_ACCESS_KEY="$(params.aws-secret-access-key)"
141+
export AWS_SESSION_TOKEN="$(params.aws-session-token)"
95142
BUCKET=$(cat /opt/aws-credentials/S3_BUCKET)
96143
RUN_ID="$(context.pipelineRun.name)"
97144
HF_TOKEN=$(cat /opt/aws-credentials/HUGGING_FACE_HUB_TOKEN)
@@ -182,6 +229,12 @@ spec:
182229
value: "$(params.debug)"
183230
- name: spot
184231
value: "$(params.spot)"
232+
- name: aws-access-key-id
233+
value: "$(tasks.get-aws-creds.results.aws-access-key-id)"
234+
- name: aws-secret-access-key
235+
value: "$(tasks.get-aws-creds.results.aws-secret-access-key)"
236+
- name: aws-session-token
237+
value: "$(tasks.get-aws-creds.results.aws-session-token)"
185238

186239
# ── OpenShift cluster provisioning (same as existing e2e pipeline) ──
187240
- name: eaas-provision-space
@@ -416,9 +469,18 @@ spec:
416469
params:
417470
- name: debug
418471
value: "$(params.debug)"
472+
- name: aws-access-key-id
473+
value: "$(tasks.get-aws-creds.results.aws-access-key-id)"
474+
- name: aws-secret-access-key
475+
value: "$(tasks.get-aws-creds.results.aws-secret-access-key)"
476+
- name: aws-session-token
477+
value: "$(tasks.get-aws-creds.results.aws-session-token)"
419478
taskSpec:
420479
params:
421480
- name: debug
481+
- name: aws-access-key-id
482+
- name: aws-secret-access-key
483+
- name: aws-session-token
422484
volumes:
423485
- name: aws-credentials
424486
secret:
@@ -445,8 +507,9 @@ spec:
445507
#!/bin/sh
446508
set -uo pipefail
447509
448-
export AWS_ACCESS_KEY_ID=$(cat /opt/aws-credentials/AWS_ACCESS_KEY_ID)
449-
export AWS_SECRET_ACCESS_KEY=$(cat /opt/aws-credentials/AWS_SECRET_ACCESS_KEY)
510+
export AWS_ACCESS_KEY_ID="$(params.aws-access-key-id)"
511+
export AWS_SECRET_ACCESS_KEY="$(params.aws-secret-access-key)"
512+
export AWS_SESSION_TOKEN="$(params.aws-session-token)"
450513
export AWS_DEFAULT_REGION="us-east-1"
451514
BUCKET=$(cat /opt/aws-credentials/S3_BUCKET)
452515
RUN_ID="$(context.pipelineRun.name)"

0 commit comments

Comments
 (0)