我有一个带有构建规范的 CodeBuild 项目,该项目需要数据库密码值才能运行。我希望这个构建规范与环境无关,但每个环境都需要不同的数据库密码。每个环境的数据库密码值都存储在它自己的密钥下的 SSM 存储中。
在这种情况下,将数据库密码传递给 CodeBuild 项目的更好方法是什么?
使用 CodeBuildenv.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 发出三个请求,这会使 buildspec 更加复杂。这种方法对我来说似乎不是最理想的。
也许有一种方法可以使用 ENVIRONMENT 变量以某种方式构造 SSM 密钥env.parameter-store
?
从 CodePipeline 传递 SSM 参数
另一种方法是将密码从 CodePipeline 作为环境变量直接传递给 CodeBuild 项目。这将大大简化构建规范。但是从安全的角度来看它安全吗?
在 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…"
这种方法会更安全吗?