【问题标题】:How to get the value of an api key in CDK (AWS)如何在 CDK (AWS) 中获取 api 密钥的值
【发布时间】:2026-01-17 11:10:01
【问题描述】:

我有这个问题。我想创建一个只能使用 API 密钥访问的 API 网关——这部分已经完成。现在我想将 API 密钥的值存储在秘密管理器中。我可以将硬编码值存储在机密管理器中,但不能存储 API 密钥的实际值。创建 api 密钥的代码是:

const key = api.addApiKey('ApiKey');

并且我可以将硬编码值存储在秘密管理器中:

const secret = new secretsmanager.Secret(this, 'Secret', {
      description: "Secret ",
      secretName: "secret",
      generateSecretString: {
        secretStringTemplate: JSON.stringify({"api_key" : "some_value"}),
        generateStringKey: "string_key",
      }
    });

如何存储 api 密钥而不是硬编码值?

【问题讨论】:

  • 这是自定义Lambda rotation function,你在找什么?
  • 我基本上只是想将我创建的api密钥传递给secretsmanager insted of "some_value"
  • Here你可以找到例子供参考。
  • 非常感谢,但我已经看过这些例子了。他们没有说明您如何将 api 密钥存储在秘密管理器中

标签: amazon-web-services api aws-cdk


【解决方案1】:

我不认为我们可以在没有自定义资源的情况下提取 api 键值。

但这很容易反过来做。我们首先需要生成密钥并使用该值来创建 api 密钥。

    const secret = new secretsmanager.Secret(this, 'Secret', {
        generateSecretString: {
            generateStringKey: 'api_key',
            secretStringTemplate: JSON.stringify({ username: 'web_user' }),
            excludeCharacters: ' %+~`#$&*()|[]{}:;<>?!\'/@"\\',
        },
    });
    this.restApi.addApiKey('ApiKey', {
        apiKeyName: `web-app-key`,
        value: secret.secretValueFromJson('api_key').toString(),
    });

【讨论】:

  • 非常感谢!!这正是我想要的!
  • 太棒了!很高兴我能帮上忙。
  • 顺便说一句,如果秘密名称不存在于秘密管理器中,有没有办法只生成一个新秘密?例如。当您执行 cdk destroy 和 cdk 部署时。随着时间的推移,我也遇到了 API 密钥和存储在秘密管理器中的 api 密钥之间奇怪的不匹配问题。
  • 我认为 cdk destroy 后跟 cdk deploy 会失败,因为 secret 在删除后实际上以相同的名称存储在 aws 中至少 7 天
  • @smallbirds 作为秘密管理器资源不会立即被删除,秘密管理器总是存在问题,您可以在每次销毁和重新创建时传递不同的 secretName 属性。或传递不同的 id Secret 用于派生秘密名称。