Передача секретов лямбде на этапе развертывания (CodePipeline) с помощью Serverless? - PullRequest
3 голосов
/ 15 января 2020

У меня есть CodePipeline с GitHub в качестве источника, настройка. Я пытаюсь, без успеха, передать один секретный параметр (в данном случае секретный ключ Stripe, в настоящее время определенный в файле .env -> пояснение ниже) к указанной c лямбде на этапе развертывания при выполнении CodePipeline. ,

Стадия развертывания в моем случае - это в основном проект CodeBuild, который запускает развертывание. sh скрипт:

#! /bin/bash npm install -g serverless@1.60.4 serverless deploy --stage $env -v -r eu-central-1

Объяснение:

I я пытался сделать это с помощью serverless-dotenv-plugin, который служит цели, когда развертывание выполняется локально, но когда оно выполняется через CodePipeline, он возвращает ошибку при выполнении лямбды и по причине:

Источник CodePipeline имеет значение GitHub (файл .env не фиксируется), при каждом изменении в хранилище git запускается выполнение CodePipeline. К тому времени, когда он достигает стадии развертывания, все узлы модулей установлены (serverless-dotenv-plugin вместе с ними), и когда команда serverless deploy --stage $env -v -r eu-central-1 выполняется, serverless-dotenv-plugin будет искать файл .env, в котором хранится мой секрет, выиграет ' Не могу найти его, поскольку нет файла .env, потому что мы находимся за пределами «локальной» области, и когда лямбда-запрос требует этот секретный триггер, он выдаст ошибку, похожую на эту:

On further inspection this error transforms into {message:

Итак, мой вопрос: возможно ли это сделать с помощью dotenv / serverless-dotenv-plugin или этот подход следует отбросить? Должен ли я использовать SSM Parameter Store или Secrets Manager? Если да, может кто-нибудь объяснить, как? :)

1 Ответ

3 голосов
/ 16 января 2020

Итак, после дальнейшего изучения этой темы c Я думаю, что у меня есть решение. Хранилище параметров SSM vs Secrets Manager - это совершенно другая топика c, но для моей цели SSM Paremeter Store - выбор, который я выбрал go вместе с этой проблемой. И в основном это можно сделать двумя способами.

1. Используйте AWS хранилище параметров

Просто добавьте секрет в консоль хранилища параметров AWS, а затем укажите значение в вашем serverless.yml как переменную окружения Lambda. Serverless Framework может извлечь значение из вашей AWS учетной записи хранилища параметров при развертывании.

provider: environement: stripeSecretKey: ${ssm:stripeSecretKey}

Наконец, вы можете ссылаться на него в своем коде так же, как и раньше:

const stripe = Stripe(process.env.stripeSecretKey);

PROS: Это можно использовать вместе с локальным файлом .env как для локального, так и для удаленного использования, сохраняя ваш код Lambda одинаковым, ie. process.env.stripeSecretKey

CONS: Поскольку секреты расшифровываются и затем устанавливаются как переменные среды Lambda при развертывании, если вы go на своей консоли Lambda, вы сможете увидеть секретные значения в виде простого текста. (Что-то вроде некоторых проблем безопасности)

Это подводит меня ко второму способу сделать это, который я считаю более безопасным и который я в конечном итоге выбираю:

2. Сохраните в AWS хранилище параметров и расшифруйте во время выполнения Чтобы не раскрывать секреты в виде простого текста на вашей AWS лямбда-консоли, вы можете вместо этого расшифровать их во время выполнения. Вот как:

  • Добавьте секреты в консоль хранилища параметров AWS, как на предыдущем шаге.

  • Измените свой лямбда-код Для прямого вызова хранилища параметров и расшифровки значения во время выполнения:

    import stripePackage from 'stripe'; const aws = require('aws-sdk'); const ssm = new aws.SSM();

    const stripeSecretKey = ssm.getParameter( {Name: 'stripeSecretKey', WithDecryption: true} ).promise(); const stripe = stripePackage(stripeSecretKey.Parameter.Value);

( Небольшой совет: Если ваша лямбда определена как асинхронная c функция, обязательно используйте ключевое слово await перед ssm.getParameter (...). Обещание ();)

PROS: Ваши секреты не раскрываются в виде простого текста.

CONS: Ваш Lambda-код становится немного сложнее, и это дополнительная задержка, так как он должен получить значение из магазина. (Но, учитывая, что это только один параметр, и он бесплатный, это хороший компромисс, я думаю)

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

Надеюсь, это кому-нибудь поможет, приятное кодирование :)

...