我有一个带有buildspec的CodeBuild项目,该项目需要数据库密码值才能运行。我希望此buildspec与环境无关,但是每个环境都需要不同的数据库密码。每个环境的数据库密码值都在其自己的密钥下存储在SSM存储中。
在这种情况下,将数据库密码传递给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发送三个请求,这会使buildspec更加复杂。在我看来,这种方法不太理想。
也许有一种方法可以使用env.parameter-store
中的ENVIRONMENT变量构造SSM密钥?
另一种方法是将密码从CodePipeline作为环境变量直接传递到CodeBuild项目。这将大大简化buildspec。但是从安全角度来看是否安全?
最好从脚本中手动调用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
documentation,无法动态构造SSM参数密钥,并且为每个环境预加载参数是错误的。这将影响性能并对API速率限制产生负面影响,并使安全审核更加困难。
在CodeBuild脚本中手动获取SSM参数
我想这可能有用,但是它将使脚本更加复杂,并且还将使其与SSM参数存储更紧密地耦合,因为它需要了解SSM存储和键名结构。
从CodePipeline传递SSM参数
查看documentation,有一种特定的环境变量类型称为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",
}]'