我有一个带有构建规范的CodeBuild项目,需要数据库密码值才能运行。我希望这个构建规范与环境无关,但每个环境都需要不同的数据库密码。每个环境的数据库密码值都存储在其自己的密钥下的 SSM 存储中。
在这种情况下,将数据库密码传递给 CodeBuild 项目的更好方法是什么?
使用 CodeBuild 的env.parameter-store
似乎推荐的方法是使用 CodeBuild 的内置解决方案 (env.parameter-store
(,但是我将不得不为每个环境加载密码,然后在构建脚本中选择一个密码:
# Supported Variables
#---------------------
# - ENVIRONMENT
#
version: 0.2
env:
parameter-store:
DB_PASSWORD_PROD: "/acme/prod/DB_PASSWORD"
DB_PASSWORD_STAGE: "/acme/stage/DB_PASSWORD"
DB_PASSWORD_QA: "/acme/qa/DB_PASSWORD"
phases:
build:
commands:
- |-
case "${ENVIRONMENT}" in
"prod") DB_PASSWORD="${DB_PASSWORD_PROD}" ;;
"stage") DB_PASSWORD=${DB_PASSWORD_STAGE} ;;
"qa") DB_PASSWORD=${DB_PASSWORD_QA} ;;
esac
- echo "Doing something with $DB_PASSWORD…"
这将需要向SSM发出三个请求,并使构建规范更加复杂。这种方法对我来说看起来不是最佳的。
也许有一种方法可以在env.parameter-store
中使用环境变量以某种方式构造 SSM 密钥?
从代码管道传递 SSM 参数
另一种方法是将密码作为环境变量从 CodePipeline 直接传递给 CodeBuild 项目。这将大大简化构建规范。但从安全角度来看,它安全吗?
在代码构建脚本中手动获取 SSM 参数
从脚本手动调用 SSM 以加载所需的值会更好吗?
# Supported Variables
#---------------------
# - ENVIRONMENT
#
version: 0.2
phases:
build:
commands:
- >-
DB_PASSWORD=$(
aws ssm get-parameter
--name "/acme/${ENVIRONMENT}/DB_PASSWORD"
--with-decryption
--query "Parameter.Value"
--output text
)
- echo "Doing something with $DB_PASSWORD…"
这种方法会更安全吗?
使用 CodeBuild 的 env.parameter-store
查看文档,没有办法动态构造 SSM 参数键,并且为每个环境预加载参数是错误的。这将影响性能并对 API 速率限制产生负面影响,并使安全审计更加困难。
在代码构建脚本中手动获取 SSM 参数
我想这可以工作,但它会使脚本更加复杂,并且还会将其更紧密地耦合到 SSM 参数存储,因为它需要了解 SSM 存储和密钥名称结构。
从代码管道传递 SSM 参数
查看文档,有一个特定的环境变量类型称为PARAMETER_STORE
。这允许在调用 CodeBuild 构建项目之前从 SSM 参数存储中获取值。
我相信这是实现预期结果的最干净方法,它不应该以负面的方式影响安全性,因为参数只会在构建项目调用时由 CodePipeline 解析:
- Name: stage-stage
Actions:
- Name: stage-stage-action
RunOrder: 1
ActionTypeId:
Category: Build
Provider: CodeBuild
Owner: AWS
Version: "1"
Configuration:
ProjectName: !Ref BuildProject
EnvironmentVariables: |-
[{
"type":"PARAMETER_STORE",
"name":"DB_PASSWORD",
"value":"/acme/stage/DB_PASSWORD"
}]
- Name: prod-stage
Actions:
- Name: prod-stage-action
RunOrder: 1
ActionTypeId:
Category: Build
Provider: CodeBuild
Owner: AWS
Version: "1"
Configuration:
ProjectName: !Ref BuildProject
EnvironmentVariables: |-
[{
"type":"PARAMETER_STORE",
"name":"DB_PASSWORD",
"value":"/acme/prod/DB_PASSWORD"
}]
- Name: qa-stage
Actions:
- Name: qa-stage-action
RunOrder: 1
ActionTypeId:
Category: Build
Provider: CodeBuild
Owner: AWS
Version: "1"
Configuration:
ProjectName: !Ref BuildProject
EnvironmentVariables: |-
[{
"type":"PARAMETER_STORE",
"name":"DB_PASSWORD",
"value":"/acme/qa/DB_PASSWORD"
}]