3

我无法找出如何从 apigateway 密钥中获取 api 密钥。我可以得到它的 ID 和它的 ARN,但不能得到它的值。我知道您可以在创建密钥时指定值,但不能在创建后指定如何检索它——没有登录到 AWS GUI 并以这种方式找到它。

我查看了 aws-apigateway.ApiKey 的文档,但找不到任何获取值的方法。https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-apigateway.ApiKey.html我也看过kms键,因为你可以获得它们的价值,但我没有知道它是否可以在 API 网关使用计划的上下文中使用(不包含在下面的代码中)。

如果无法获得价值,有没有办法产生一个不会改变或会持续存在的价值?我正在使用临时 Jenkins 节点来运行 CDK。

    const apiGateway  = require('@aws-cdk/aws-apigateway');
...
    const apiKey = new apiGateway.ApiKey(this, 'api-key', {
      apiKeyName: 'my-api-key',
    });
...
    new cdk.CfnOutput(this, 'x-api-key-apiKey_id', {
      value: apiKey.keyId
      });
    new cdk.CfnOutput(this, 'x-api-key-apiKey_keyArn', {
      value: apiKey.keyArn
      });
4

2 回答 2

4

如果没有自定义资源,我们无法通过 cdk/cloudformation 检索自动生成的密钥。但是我们可以生成密钥,将其存储在密钥管理器或 ssm 密钥中,然后使用它来创建 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(),
});
于 2021-02-10T19:04:39.217 回答
1

我将使用https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/SecretsManager.html#getRandomPassword-property生成 20 个字符并设置 API 密钥。由于我的堆栈之外的任何内容都不需要密钥,因此我可以在每次进行部署时重新生成它并更新我的资源。但是,如果堆栈之外有需要密钥的东西,那么使用巴鲁的答案是最好的选择。

这样做的原因是保守秘密需要付出代价。

于 2021-02-10T19:08:42.090 回答