У меня есть проект CodeBuild со спецификацией сборки, для работы которого требуется пароль базы данных. Я хочу, чтобы эта спецификация сборки не зависела от среды, но для каждой среды требуется свой пароль базы данных. Значение пароля базы данных для каждой среды хранится в хранилище SSM под собственным ключом.

Как лучше передать пароль базы данных проекту CodeBuild в этом сценарии?

Использование CodeBuild's 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, что усложняет спецификацию сборки. Мне такой подход кажется неоптимальным.

Может быть, есть способ как-то построить SSM-ключ, используя переменную ENVIRONMENT в env.parameter-store?

Передача параметров SSM из CodePipeline

Другой подход - передать пароль из CodePipeline в качестве переменной среды непосредственно в проект CodeBuild. Это значительно упростит спецификацию сборки. Но безопасно ли это с точки зрения безопасности?

Получить параметры SSM вручную в скрипте CodeBuild

Не лучше ли вызвать 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…"

Будет ли такой подход более безопасным?

3
Slava Fomin II 30 Ноя 2019 в 17:42

1 ответ

Использование env.parameter-store CodeBuild

Просмотр документации < / a>, невозможно динамически создать ключ параметра SSM, а параметры предварительной загрузки для каждой среды просто неверны. Это повлияет на производительность и отрицательно повлияет на ограничения скорости API, а также усложнит аудит безопасности.

Получить параметры SSM вручную в скрипте CodeBuild

Я предполагаю, что это может сработать, но это сделает сценарий более сложным, а также более тесно связывает его с хранилищем параметров SSM, потому что ему нужно будет знать о хранилище SSM и структуре имени ключа.

Передача параметров SSM из CodePipeline

В документации есть переменная среды определенного типа под названием PARAMETER_STORE. Это позволяет получить значение из хранилища параметров SSM до вызова проекта сборки CodeBuild.

Я считаю, что это самый чистый способ достичь желаемого результата, и он не должен отрицательно влиять на безопасность, потому что параметр будет разрешен 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"
          }]
4
Slava Fomin II 6 Дек 2019 в 06:37