我个人不喜欢将机密存储在 .env 文件中的想法,因此这些天我通常会使用 AWS Secrets Manager 之类的东西。您可以使用 AWS 开发工具包轻松设置密钥存储和获取密钥。当然,这一切都假设您在某个时候使用 AWS,但我喜欢这样做,因为我可以控制哪些角色可以访问我的密钥 - 所以如果您正在设置构建管道,这可能是一个这样做的好方法。在构建时,我可能会做这样的事情
import AWS from "aws-sdk";
const region = "us-east-1";
const creds = new AWS.SharedIniFileCredentials({ profile: "some-profile-name" });
AWS.config.credentials = creds;
export class SecretsManagerService {
private static _client: AWS.SecretsManager;
static get client(): AWS.SecretsManager {
if (!SecretsManagerService._client) {
SecretsManagerService._client = new AWS.SecretsManager({
region,
});
}
return SecretsManagerService._client;
}
static async getSecretValue(secretId: string): Promise<string> {
try {
const secret = await SecretsManagerService.client
.getSecretValue({ SecretId: secretId })
.promise();
return secret.SecretString!;
} catch (e) {
throw e;
}
}
}
而且,这一切都很好,除了你需要使用 Gatsby 中的秘密,所以我做了这样的事情(假设我使用 Contentful 作为我的 CMS)
import { SecretsManagerService } from "./aws-secrets.service";
import { execSync } from 'child_process';
(async () => {
const { CONTENTFUL_ENV } = process.env;
const secretPath = CONTENTFUL_ENV === 'qa' ? 'qa-secret-path' : 'prod-secret-path';
const values = await SecretsManagerService.getSecretValue(secretPath);
const parsed = JSON.parse(values);
process.env.CONTENTFUL_KEY = parsed.contentfulSecretKey;
const command = CONTENTFUL_ENV === 'qa' ? 'gatsby develop' : 'gatsby build';
execSync(command, { stdio: 'inherit'});
})();
这样我可以像这样在我的 Gatsby 配置中继承我的环境变量(再次假设我使用 Contentful 作为 CMS)。
{
resolve: "gatsby-source-contentful",
options: {
accessToken: process.env.CONTENTFUL_KEY,
environment: process.env.CONTENTFUL_ENV,
spaceId: "my-space-id",
},
},
并将你的 package.json 脚本修改成这样
"scripts": {
"develop": "CONTENTFUL_ENV=qa ts-node ./tools/index.ts",
"start": "gatsby develop",
"build": "CONTENTFUL_ENV=master ts-node ./tools/index.ts",
"serve": "gatsby serve",
"clean": "gatsby clean"
},