本文
Cloud Runでは sm://<project_id>/<secret_name>
の形式で環境変数をセットして起動すれば自動的にSecretManagerから秘密情報を取得して展開してくれます。(言語不問)
同様の機能がCloud Functionsにもあったらいいなと思ったんですが、Go言語版のみしかサポートされていなかったので、Node.js版を作成しました。
const { SecretManagerServiceClient } = require('@google-cloud/secret-manager');
async function resolveSecret(element) {
const client = new SecretManagerServiceClient();
const [, , projectId, secretName] = element.split('/');
const name = `projects/${projectId}/secrets/${secretName}/versions/latest`;
const [version] = await client.accessSecretVersion({
name: name,
});
return version.payload.data.toString();
}
async function substituteSecrets() {
const resolved = await Promise.all(
Object.entries(process.env)
.filter(([_, element]) => element.startsWith('sm://'))
.map(async ([key, element]) => [key, await resolveSecret(element)])
);
for (const [key, element] of resolved) {
process.env[key] = element;
}
}
参考
https://github.com/GoogleCloudPlatform/berglas
https://www.npmjs.com/package/@google-cloud/secret-manager