Давайте узнаем, как связать секреты с ролями в IAM с помощью Chamber!

Устали управлять переменными среды в вашей команде / машинах / что угодно? Хотите, чтобы они были распределены и привязаны к ролям IAM? Попробуем сделать это с камерой.

Настройка камеры

Примечание: эти инструкции по установке применимы к macOS. установка камеры должна быть такой же в Linux, хотя хранилище AWS будет отличаться в зависимости от вашей системы. См. Инструкции в файлах readmes.

Прежде чем мы начнем с камеры, вам необходимо создать ключ KMS с псевдонимом parameter_store_key, который будет использоваться камерой.

Если вы используете Terraform, вы можете просто использовать эти блоки ресурсов:

Загрузочная камера (есть много проблем с использованием go для установки, как описано в файле readme).

$: curl -LOs https://github.com/segmentio/chamber/releases/download/v2.3.2/chamber-v2.3.2-darwin-amd64

Переименуйте двоичный файл с помощью mv:

$: mv chamber-v2.3.2-darwin-amd64 chamber

А затем сделайте его исполняемым:

$: chmod 755 chamber

Вам может потребоваться sudo для копирования файла, и вам может потребоваться chown -R ${whoami}:admin /usr/local/bin заранее, в зависимости от вашей версии macOS или версии, изначально установленной на вашем компьютере. Мне приходилось делать это на моей рабочей машине, но не на моем личном ноутбуке. К сожалению, я не помню, какие версии начинались.

Скопируйте файл в папку bin:

$: cp chamber /usr/local/bin

Возможно, вам потребуется перезагрузить терминал сейчас, и тогда which chamber должен вернуть /usr/local/bin/chamber.

Теперь нам нужно установить aws-vault, который передает правильный профиль в камеру (среди некоторых других интересных функций, которые вы должны проверить).

$: brew cask install aws-vault

Добавьте свой профиль по умолчанию в aws-vault или любой другой профиль, который вы используете в качестве «корневого» профиля. Вы также можете изменить default на любое значение для вызова этого профиля в aws-vault:

$: aws-vault add default

Вставьте свои ключи доступа к AWS и секретные ключи доступа в запросы, и пора проверить этого плохого парня! Я использую другой профиль AWS с предполагаемой ролью, хотя вы также можете просто использовать здесь свой профиль по умолчанию.

$: aws-vault exec otherProfile —- aws s3 ls

Должны быть указаны сегменты в otherProfile. Если у вас нет сегментов S3, вы можете попробовать что-нибудь вроде aws iam list-roles

Не стесняйтесь заменять otherProfile любым другим role_arn подобным профилем, который у вас есть в вашем файле учетных данных, он будет работать.

А теперь можно написать секрет:

$: aws-vault exec otherProfile —- chamber write $SERVICE $KEY $VALUE

Где $SERVICE - произвольный идентификатор (IE dw для хранилища данных или web для вещей, связанных с веб-сайтом), $KEY - это то, что вы хотите, чтобы секрет был вызван и на что ссылались (подробнее об этом позже), а $VALUE - фактическое значение секрета.

Пример:

$: aws-vault exec otherProfile —- chamber write dw TF_VAR_DATABASE_USERNAME myUsername

Итак, теперь я могу прочитать это значение:

$: aws-vault exec otherProfile —- chamber read dw TF_VAR_DATABASE_USERNAME
Key Value Version LastModified User
tf_var_database_username myUsername 1 04–18 14:29:47 arn:aws:sts::12345….

Из сказанного следует отметить одно: секретное имя (ключ) будет храниться в нижнем регистре. Когда вы его вытащите, он будет преобразован в верхний регистр. Не используйте секретные ключи с учетом регистра!

Фактическое использование вещи

Первоначально я нашел камеру, когда искал хороший способ обработки переменных Terraform в команде, и он очень хорошо решил эту проблему. Некоторые из них немного специфичны для Terraform (ну, Terragrunt), но они показывают, как вы на самом деле используете камеру, так что не пропускайте это!

В приведенном выше примере вы заметите TF_VAR. Это связано с тем, что Terraform считывает переменные из среды, если они доступны, и обозначает их префиксом TF_VAR_.

Итак, если у вас есть это в variables.tf:

variable “DATABASE_USERNAME” {}

Terraform попытается прочитать переменную среды TF_VAR_DATABASE_USERNAME при выполнении плана или применении.

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

$: aws-vault exec otherProfile —- chamber exec dw —- terragrunt plan

Это передает наш профиль otherProfile в камеру, которая загружает переменные камеры (из хранилища параметров AWS в другой учетной записи профиля) во время выполнения terragrunt plan. И что очень важно: их не существует на хост-машине после. Это означает, что ваш .zshrc не обязательно должен состоять из 200 строк разных ключей API для того приложения React, которое вы пытались отладить в прошлом году, как и ваш товарищ по команде. И когда этот ключ API обновляется, происходит одно централизованное обновление для всей команды. И доступ ограничен. И данные зашифрованы. Намного лучше, чем отправлять сообщения через Slack!

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

$: alias chmbrop='aws-vault exec otherProfile —- chamber'

Тогда вы просто сделаете chmbrop exec dw —- terragrunt plan. Или, может быть, вы называете все это псевдонимом 🤷‍♀

Дополнительный контент:

Что делает Serverless Guru?

Serverless Guru помогает компаниям создавать масштабируемые и экономичные приложения в облаке. Мы помогаем обучать компании тому, как использовать IAC, бессерверные и облачные сервисы. Мы помогаем перенести существующие приложения в облако и оптимизировать существующие приложения в облаке, чтобы сделать их более рентабельными. Мы являемся партнером по бессерверной разработке и партнером-консультантом AWS.

Что мы упустили?

Когда вы оставляете свой ответ, обязательно оставьте комментарий ниже или напишите свой ответ @serverlessgurux в Twitter.

Даллас Слотер

Старший облачный архитектор - Serverless Guru

LinkedIn

Увидимся в следующий раз! 😃

Если вы хотите узнать больше о Serverless Guru, подпишитесь на нас в Medium, Twitter, Instagram, Facebook или LinkedIn!