如何在GitLab部署中使用AWS Parameter Store存储的AWS账户凭证?
在GitLab部署流程中使用AWS Parameter Store存储的凭证
一、配置GitLab Runner的AWS访问权限
要从Parameter Store拉取凭证,首先得让GitLab Runner拥有对应的AWS访问权限,推荐两种配置方式:
EC2 Runner(优先选择)
如果你的GitLab Runner部署在AWS EC2实例上,直接给实例附加IAM角色即可,无需在GitLab中存储AWS密钥。角色需要包含SSM参数读取权限,示例IAM策略如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssm:GetParameter", "ssm:GetParametersByPath" ], "Resource": [ "arn:aws:ssm:us-east-1:123456789012:parameter/prod/*", "arn:aws:ssm:us-east-1:123456789012:parameter/prod/db/password" ] } ] }
根据你的实际参数路径和单个参数调整Resource字段即可。
非EC2 Runner
如果Runner不在AWS环境中,就在GitLab项目的Settings > CI/CD > Variables中添加AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY两个变量,记得勾选Protected和Masked选项,防止明文泄露。对应的IAM用户需要拥有上述SSM读取权限。
二、在CI配置中获取Parameter Store参数
在.gitlab-ci.yml的部署阶段,用AWS CLI拉取参数并注入环境变量:
单个参数获取
适合只需要拉取一两个参数的场景:
# 拉取加密存储的数据库密码,--with-decryption仅针对加密参数 DB_PASSWORD=$(aws ssm get-parameter --name "/prod/db/password" --with-decryption --query "Parameter.Value" --output text) # 注入环境变量供后续步骤使用 export DB_PASSWORD=$DB_PASSWORD
批量拉取路径下的参数
如果多个参数集中在同一路径下(比如/prod/app/),可以批量拉取并自动生成环境变量:
# 先安装jq(如果Runner镜像没有预装的话) apt-get update && apt-get install -y jq # 拉取路径下所有参数,转换为环境变量脚本并执行 aws ssm get-parameters-by-path --path "/prod/app/" --with-decryption --query "Parameters[*].{Name:Name,Value:Value}" --output json | jq -r '.[] | "export \(.Name | split("/")[-1])=\(.Value)"' > params.sh source params.sh
这段脚本会把参数名的最后一段作为环境变量名(比如/prod/app/API_KEY会变成API_KEY)。
三、在部署流程中使用凭证
拉取到的环境变量可以直接在后续部署命令中使用,举几个常见场景:
# 示例1:部署到ECS服务 aws ecs update-service --cluster prod-cluster --service app-service --force-new-deployment # 示例2:Terraform部署时传入变量 terraform apply -var "db_password=$DB_PASSWORD" -auto-approve # 示例3:启动Node.js应用,读取环境变量 node app.js
四、安全优化建议
- 用自定义KMS密钥加密Parameter Store中的敏感参数,不要依赖AWS默认密钥,进一步提升安全性。
- 限制IAM角色/用户的SSM权限范围,仅授权必要的参数路径,遵循最小权限原则。
- 定期轮换AWS IAM凭证(如果使用的是密钥而非实例角色)。
内容的提问来源于stack exchange,提问作者NOUR
相关产品推荐
相关产品推荐

