使用 CDK 将 AWS SM 密钥传递到 Lambda 环境
Pass AWS SM Secret Key to Lambda Environment with CDK
我在获取特定的 Secrets Manager 密钥值以通过 CDK 将其传递给我的 lambda 时遇到一些问题。
一段时间后,我终于意识到我的 SecretValue
仅在我实际将其部署到 lambda 时才得到解决,而不是 运行 通过 SAM CLI 在本地时得到解决。
通过
cdk.SecretValue.secretsManager(secretId).toString()
我得到类似 "{\"apiKey\":\"sdfsdf-sdfsdf-sddsf\"}"
的信息,但我更想直接拥有 apiKey。
不幸的是,在我的 CDK 代码中,我不能 JSON:parse(...secretsManager(..).toString())
因为这只会在部署后解决。之前,值很简单:
{{resolve:secretsmanager:apiKey:SecretString:::}}
(这似乎是一个令牌:https://docs.aws.amazon.com/cdk/latest/guide/tokens.html)
所以我想我需要一些方法来告诉 CDK 如何使用呈现的值,也许通过传递一个转换呈现结果的回调 - 这可能吗?
在我的 CDK 设置中是否有任何其他工具可以让我从秘密中接收特定密钥,以便我可以将它直接传递给 lambda?
我希望这个问题是可以理解的。预先感谢您的帮助。
您需要使用Secret. You can use any of the static from
methods to get the secret. From there you can use the secretValueFromJson方法获取值。
示例(Postgres 数据库的秘密):
import * as secretsmanager from '@aws-cdk/aws-secretsmanager';
const dbSecret = secretsmanager.Secret.fromSecretNameV2(this, 'db-secret', 'db-secret-name');
const dbUser = dbSecret.secretValueFromJson('username').toString();
const dbPass = dbSecret.secretValueFromJson('password').toString();
const dbName = dbSecret.secretValueFromJson('dbname').toString();
我使用 AWS SDK 为 Parameter Store 解决了这个问题,这是我的 stack.ts:
的摘录
import { SSM } from 'aws-sdk'
const ssmSDK = new SSM()
async function fetchParam(name: string): Promise<string> {
try {
const param = await ssmSDK
.getParameter({
Name: name,
WithDecryption: true,
})
.promise()
if (!param.Parameter || !param.Parameter.Value) {
throw new Error(`${name} parameter not found!`)
}
return param.Parameter.Value
} catch (err) {
throw new Error(`failed to fetch ${name} parameter!`)
}
}
export async function buildSearchServiceStack(
scope: cdk.App,
id: string,
props?: cdk.StackProps
): Promise<cdk.Stack> {
const stack = new cdk.Stack(scope, id, props)
const [jwtSecret, elasticPassword] = await Promise.all([
fetchParam(`/shared/jwt/SECRET`),
fetchParam('/shared/elasticsearch/URL')])
// ..
我在获取特定的 Secrets Manager 密钥值以通过 CDK 将其传递给我的 lambda 时遇到一些问题。
一段时间后,我终于意识到我的 SecretValue
仅在我实际将其部署到 lambda 时才得到解决,而不是 运行 通过 SAM CLI 在本地时得到解决。
通过
cdk.SecretValue.secretsManager(secretId).toString()
我得到类似 "{\"apiKey\":\"sdfsdf-sdfsdf-sddsf\"}"
的信息,但我更想直接拥有 apiKey。
不幸的是,在我的 CDK 代码中,我不能 JSON:parse(...secretsManager(..).toString())
因为这只会在部署后解决。之前,值很简单:
{{resolve:secretsmanager:apiKey:SecretString:::}}
(这似乎是一个令牌:https://docs.aws.amazon.com/cdk/latest/guide/tokens.html)
所以我想我需要一些方法来告诉 CDK 如何使用呈现的值,也许通过传递一个转换呈现结果的回调 - 这可能吗? 在我的 CDK 设置中是否有任何其他工具可以让我从秘密中接收特定密钥,以便我可以将它直接传递给 lambda?
我希望这个问题是可以理解的。预先感谢您的帮助。
您需要使用Secret. You can use any of the static from
methods to get the secret. From there you can use the secretValueFromJson方法获取值。
示例(Postgres 数据库的秘密):
import * as secretsmanager from '@aws-cdk/aws-secretsmanager';
const dbSecret = secretsmanager.Secret.fromSecretNameV2(this, 'db-secret', 'db-secret-name');
const dbUser = dbSecret.secretValueFromJson('username').toString();
const dbPass = dbSecret.secretValueFromJson('password').toString();
const dbName = dbSecret.secretValueFromJson('dbname').toString();
我使用 AWS SDK 为 Parameter Store 解决了这个问题,这是我的 stack.ts:
的摘录import { SSM } from 'aws-sdk'
const ssmSDK = new SSM()
async function fetchParam(name: string): Promise<string> {
try {
const param = await ssmSDK
.getParameter({
Name: name,
WithDecryption: true,
})
.promise()
if (!param.Parameter || !param.Parameter.Value) {
throw new Error(`${name} parameter not found!`)
}
return param.Parameter.Value
} catch (err) {
throw new Error(`failed to fetch ${name} parameter!`)
}
}
export async function buildSearchServiceStack(
scope: cdk.App,
id: string,
props?: cdk.StackProps
): Promise<cdk.Stack> {
const stack = new cdk.Stack(scope, id, props)
const [jwtSecret, elasticPassword] = await Promise.all([
fetchParam(`/shared/jwt/SECRET`),
fetchParam('/shared/elasticsearch/URL')])
// ..