如何在GitLab流水线中使用IAM角色部署AWS资源
配置GitLab流水线通过IAM角色认证AWS并部署Terraform
1. 在AWS中创建可被GitLab扮演的IAM角色
首先要在AWS侧配置信任策略,允许GitLab的OIDC身份提供商触发角色扮演:
- 打开AWS IAM控制台,创建新角色,选择「Web身份」作为信任类型
- 身份提供商选择GitLab对应的OIDC(若未添加,GitLab.com的OIDC地址为
https://gitlab.com,受众填https://gitlab.com;自托管GitLab需填写自身实例的OIDC地址) - 为角色附加Terraform部署所需的权限策略(比如针对EC2、S3等资源的精细权限,避免使用过于宽泛的全量权限)
- 编辑角色的信任策略,限制仅特定GitLab项目/分支的流水线可扮演该角色,示例策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::你的AWS账户ID:oidc-provider/gitlab.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "gitlab.com:sub": "project_path:你的GitLab用户名/项目名:ref_type:branch:ref:main" } } } ] }
提示:
gitlab.com:sub的值可按需调整,比如限制到特定标签、分支或项目,防止权限滥用。
2. 在GitLab项目中配置OIDC相关变量
- 进入GitLab项目,依次打开「设置」→「CI/CD」→「变量」
- 添加以下配置变量(无需明文密钥):
AWS_ACCOUNT_ID:你的AWS账户IDAWS_ROLE_ARN:刚创建的IAM角色ARN(格式示例:arn:aws:iam::123456789012:role/GitLabTerraformDeployRole)
3. 编写.gitlab-ci.yml流水线配置
以下是基础的Terraform部署流水线示例,通过OIDC获取AWS临时凭证:
stages: - deploy deploy_terraform: stage: deploy image: hashicorp/terraform:latest before_script: # 安装AWS CLI(若镜像自带可省略) - apk add --no-cache aws-cli jq # 通过GitLab提供的JWT令牌获取AWS临时凭证 - | RESPONSE=$(aws sts assume-role-with-web-identity \ --role-arn $AWS_ROLE_ARN \ --role-session-name "GitLab-Terraform-Deploy" \ --web-identity-token $CI_JOB_JWT_V2 \ --duration-seconds 3600) export AWS_ACCESS_KEY_ID=$(echo $RESPONSE | jq -r '.Credentials.AccessKeyId') export AWS_SECRET_ACCESS_KEY=$(echo $RESPONSE | jq -r '.Credentials.SecretAccessKey') export AWS_SESSION_TOKEN=$(echo $RESPONSE | jq -r '.Credentials.SessionToken') # 初始化Terraform - terraform init script: - terraform plan - terraform apply -auto-approve only: - main
说明:
$CI_JOB_JWT_V2是GitLab自动注入的流水线JWT令牌,用于和AWS OIDC交互;若GitLab版本较旧,可替换为$CI_JOB_JWT。
4. Terraform提供商配置注意事项
确保Terraform的AWS提供商不使用静态密钥,直接依托AWS默认凭证链读取临时凭证,示例配置:
provider "aws" { region = "us-east-1" # 无需手动配置access_key和secret_key,自动读取环境变量中的临时凭证 }
额外提醒
- 权限最小化:给IAM角色分配的权限仅满足Terraform部署需求,避免过度授权
- 有效期调整:
duration-seconds最大可设为3600秒(1小时),若流水线运行时间更长,需调整角色的最大会话时长 - 自托管GitLab:需先在AWS IAM中添加自身实例的OIDC提供商,地址格式为
https://你的GitLab实例地址/.well-known/openid-configuration
内容的提问来源于stack exchange,提问作者CMR H
相关产品推荐
相关产品推荐

