我有一个带有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…"
这种方法会更安全吗?
答案 0 :(得分:0)
使用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"
}]