Функция Google Cloud: поддержка Google Cloud KMS
Я использую облачную функцию Google (GCF) с триггером Pubsub, который отправляет HTTP-запрос стороннему API.
GCF получает уведомления от темы Pubsub, используемой службой, которая не должна знать о стороннем API.
Сторонний API требует аутентификации с использованием базовой HTTP-аутентификации.
Чтобы не вводить пароль жестко в исходном коде, я использую Google KMS для создания нового зашифрованного ключа каждый раз при развертывании своей функции. Я использую Google Cloud KMS для расшифровки секрета каждый раз, когда создается функция.
Для расшифровки с помощью KMS мне нужно предоставить закрытый ключ для служебной учетной записи в Google API NodeJS.
Моя главная проблема сегодня заключается в том, что мне нужно вставить свой закрытый ключ в GCloud Bucket, если я хочу, чтобы мой GCF работал правильно.
Возможно ли с помощью Конфигуратора времени выполнения или Диспетчера развертывания настроить секреты для функции Google Cloud?
Спасибо вам.
4 ответа
Другое решение этой проблемы, появившееся только в последние несколько месяцев, заключается в использовании конфигурации среды выполнения Google Cloud с Firebase для функций: https://firebase.google.com/docs/functions/config-env
Похоже, что Firebase для функций обеспечивает доступ к нескольким функциям, которые еще не доступны другими способами.
Runtime Configurator не взимает плату за использование, но применяет следующие ограничения и квоты API:
- 1200 запросов в минуту (QPM) для запросов на удаление, создание и обновление
- 600 QPM для запросов часов.
- 6000 QPM для получения и списка запросов.
- 4 МБ данных на пользователя, который состоит из всех данных, записанных в службу Runtime Configurator, и сопутствующих метаданных.
https://cloud.google.com/deployment-manager/pricing-and-quotas
Кроме того, я нахожу этот конфликт в Firebase for Functions смешным:
Firebase SDK для облачных функций предлагает встроенную конфигурацию среды, позволяющую легко сохранять и извлекать данные этого типа для вашего проекта без необходимости повторного развертывания ваших функций.
Затем мгновение спустя:
После запуска
functions:config:set
необходимо повторно развернуть функции, чтобы сделать новую конфигурацию доступной.
Решение KMS является жизнеспособной альтернативой, однако оно кажется дорогостоящим для функций. Стоимость KMS составляет 0,06 долл. США в месяц за активный ключ, а также 0,03 долл. США за 10 000 операций.
Это затем изменит стоимость вашей облачной функции с 0,40 долл. США за миллион вызовов до 3,40 долл. США за вызовы. Это настоящий прыжок.
По состоянию на декабрь 2019 года предпочтительным способом хранения и управления секретами в Google Cloud является Secret Manager:
$ echo -n "user:pass" | gcloud beta secrets create "my-basic-auth" \
--data-file=- \
--replication-policy "automatic"
Вы также можете создавать и управлять секретами из API:
// Import the library
const {SecretManagerServiceClient} = require('@google-cloud/secret-manager');
// Create the client
const client = new SecretManagerServiceClient();
// Create the secret
const [secret] = await client.createSecret({
parent: "projects/<YOUR-PROJECT-ID>",
secretId:"my-basic-auth",
secret: {
replication: {
automatic: {},
},
},
});
// Add the version with your data
const [version] = await client.addSecretVersion({
parent: secret.name,
payload: {
data: Buffer.from("user:pass", "utf8"),
},
});
Затем в вашей облачной функции:
const [version] = await client.accessSecretVersion({
name:"projects/<YOUR-PROJECT-ID>/secrets/<MY-SECRET>/versions/1",
});
const auth = version.payload.data.toString('utf-8');
// auth is user:pass
Учетная запись службы, с которой вы развертываете свою облачную функцию, потребует roles/secretmanager.secretAccessor
разрешения.
Возможно ли с помощью Конфигуратора времени выполнения или Диспетчера развертывания настроить секреты для функции Google Cloud?
В настоящее время нет встроенной службы, которая позволяла бы вам настраивать секреты для прямого доступа к облачным функциям Google, поэтому используемый вами в настоящее время метод является надлежащим способом обработки секретов в облачных функциях в настоящее время. Это может измениться, так как продукт все еще находится в бета-версии.
Если вы хотите, вы можете отправить запрос на добавление в команду Cloud Function с помощью соответствующего средства отслеживания проблем.
Существует также служба управления ключами Google Cloud: клиент Node.js.
cd functions
npm install @google-cloud/kms
Например:
// Imports the Cloud KMS library
const {KeyManagementServiceClient} = require('@google-cloud/kms');
// Instantiates a client
const client = new KeyManagementServiceClient();
// Build the location name
const locationName = client.locationPath(functions.config().firebase.projectId, functions.config().firebase.locationId);
async function listKeyRings() {
const [keyRings] = await client.listKeyRings({
parent: locationName,
});
for (const keyRing of keyRings) {
console.log(keyRing.name);
}
return keyRings;
}
return listKeyRings();