GitLab CI阶段间变量传递及同阶段多镜像脚本实现问询
解决方案
一、跨阶段传递AWS STS凭证
要把stage_one获取的AWS临时凭证传递到stage_two,用GitLab CI的**制品(artifacts)**就能实现,具体步骤如下:
1. 在stage_one中保存凭证到文件并配置制品
修改stage_one的脚本,把STS返回的凭证写入一个环境变量文件,然后通过artifacts声明要传递的文件:
stage_one: stage: transform image: alpineimage script: - apt update && apt install -y awscli # 调用STS获取凭证并写入aws-credentials.env文件 - aws sts assume-role \ --role-arn arn:aws:iam::123456789012:role/MyAssumedRole \ --role-session-name MySessionName \ --query "Credentials.[AccessKeyId,SecretAccessKey,SessionToken]" \ --output text | awk '{printf "AWS_ACCESS_KEY_ID=%s\nAWS_SECRET_ACCESS_KEY=%s\nAWS_SESSION_TOKEN=%s", $1, $2, $3}' > aws-credentials.env artifacts: paths: - aws-credentials.env expire_in: 1h # 设置过期时间,降低凭证泄露风险
2. 在stage_two中加载凭证文件
stage_two会自动下载stage_one生成的制品文件,直接读取并导出变量即可使用:
stage_two: stage: transform image: someotherimage script: # 加载凭证文件中的环境变量 - export $(cat aws-credentials.env | xargs) # 这里执行需要AWS权限的操作,比如aws s3 ls、aws lambda invoke等
二、同一阶段使用不同镜像运行脚本(无需传递凭证)
GitLab CI单个job只能绑定一个镜像,但可以在同一个stage下创建多个独立job,每个job用不同镜像,两种实现方式:
方式1:共享前置凭证job
先做一个专门获取凭证的前置job,同一stage下的其他job都依赖它,直接复用凭证:
# 前置job:获取AWS凭证 get_aws_credentials: stage: prepare image: alpineimage script: - apt update && apt install -y awscli - aws sts assume-role \ --role-arn arn:aws:iam::123456789012:role/MyAssumedRole \ --role-session-name MySessionName \ --query "Credentials.[AccessKeyId,SecretAccessKey,SessionToken]" \ --output text | awk '{printf "AWS_ACCESS_KEY_ID=%s\nAWS_SECRET_ACCESS_KEY=%s\nAWS_SESSION_TOKEN=%s", $1, $2, $3}' > aws-credentials.env artifacts: paths: - aws-credentials.env expire_in: 1h # 同一transform阶段的不同镜像job stage_job_alpine: stage: transform image: alpineimage needs: [get_aws_credentials] # 依赖凭证job script: - export $(cat aws-credentials.env | xargs) # 执行alpine镜像专属的脚本 stage_job_other: stage: transform image: someotherimage needs: [get_aws_credentials] script: - export $(cat aws-credentials.env | xargs) # 执行someotherimage镜像专属的脚本
方式2:每个job单独获取凭证
如果你的AWS角色允许重复调用STS,也可以直接在每个镜像的job里单独执行assume-role,省去传递凭证的步骤:
stage_job_alpine: stage: transform image: alpineimage script: - apt update && apt install -y awscli - export $(printf "AWS_ACCESS_KEY_ID=%s AWS_SECRET_ACCESS_KEY=%s AWS_SESSION_TOKEN=%s" \ $(aws sts assume-role \ --role-arn arn:aws:iam::123456789012:role/MyAssumedRole \ --role-session-name MySessionName-Alpine \ --query "Credentials.[AccessKeyId,SecretAccessKey,SessionToken]" \ --output text)) # 执行脚本 stage_job_other: stage: transform image: someotherimage script: # 先确保镜像有AWS CLI,没有的话先安装 - apt update && apt install -y awscli - export $(printf "AWS_ACCESS_KEY_ID=%s AWS_SECRET_ACCESS_KEY=%s AWS_SESSION_TOKEN=%s" \ $(aws sts assume-role \ --role-arn arn:aws:iam::123456789012:role/MyAssumedRole \ --role-session-name MySessionName-Other \ --query "Credentials.[AccessKeyId,SecretAccessKey,SessionToken]" \ --output text)) # 执行脚本
内容的提问来源于stack exchange,提问作者kyagu
相关产品推荐
相关产品推荐

