【问题标题】:AWS SecretsManager value won't resolveAWS SecretsManager 值无法解析
【发布时间】:2022-08-09 04:00:59
【问题描述】:

我正在使用aws-cdk-lib (2.13.0)。这是我的代码的 sn-p:

import { App, Stack } from \'aws-cdk-lib\';
import { Secret } from \'aws-cdk-lib/aws-secretsmanager\';

export class CognitoStack extends Stack {
  constructor(scope: App) {
    super(scope, \'cognito\');

    const secret = this.getSecret(\'google\');
    console.log({ secret });
  }

  public getSecret(path: string) {
    const secret = Secret.fromSecretNameV2(this, `Secret${path}`, path);
    console.log({ path, secret, secretArn: secret.secretArn, string: secret.secretValue.toString() });
    return secret.secretValue.toJSON();
  }
}

生成的日志如下所示:

{
  path: \'google\',
  secret: <ref *1> SecretBase {
    node: Node {
      host: [Circular *1],
      _locked: false,
      _children: {},
      _context: {},
      _metadata: [],
      _dependencies: Set(0) {},
      _validations: [Array],
      id: \'Secretgoogle\',
      scope: [CognitoStack]
    },
    stack: CognitoStack {
      node: [Node],
      _missingContext: [],
      _stackDependencies: {},
      templateOptions: {},
      _logicalIds: [LogicalIDs],
      account: \'${Token[AWS.AccountId.4]}\',
      region: \'${Token[AWS.Region.8]}\',
      environment: \'aws://unknown-account/unknown-region\',
      terminationProtection: undefined,
      _stackName: \'cognito\',
      tags: [TagManager],
      artifactId: \'cognito\',
      templateFile: \'cognito.template.json\',
      _versionReportingEnabled: true,
      synthesizer: [DefaultStackSynthesizer],
      [Symbol(@aws-cdk/core.DependableTrait)]: [Object]
    },
    env: {
      account: \'${Token[AWS.AccountId.4]}\',
      region: \'${Token[AWS.Region.8]}\'
    },
    _physicalName: undefined,
    _allowCrossEnvironment: false,
    physicalName: \'${Token[TOKEN.332]}\',
    encryptionKey: undefined,
    secretName: \'google\',
    secretArn: \'arn:${Token[AWS.Partition.7]}:secretsmanager:${Token[AWS.Region.8]}:${Token[AWS.AccountId.4]}:secret:google\',
    autoCreatePolicy: false,
    [Symbol(@aws-cdk/core.DependableTrait)]: { dependencyRoots: [Array] }
  },
  secretArn: \'arn:${Token[AWS.Partition.7]}:secretsmanager:${Token[AWS.Region.8]}:${Token[AWS.AccountId.4]}:secret:google\',
  string: \'${Token[TOKEN.333]}\'
}
{ secret: \'<unresolved-token>\' }

npx cdk diff sandbox-cognito 的结果如下所示:

Stack sandbox-cognito
Resources
[~] AWS::Cognito::UserPoolIdentityProvider Google GoogleAF1E99FA
 └─ [~] ProviderDetails
     ├─ [-] Removed: .client_id
     └─ [-] Removed: .client_secret

这意味着它正在删除我能够手动设置的 client_id/client_secret。现在我试图从一个秘密加载值,它不起作用。

问题是我无法解析 JSON(请注意日志中的 &lt;unresolved-token&gt;。我认为它尚未解决,但我不确定如何解决......它正在尝试解析这个字符串文字:${Token[TOKEN.333]},而不是秘密值。我怎样才能得到秘密字符串的结果?

    标签: typescript aws-cdk aws-secrets-manager


    【解决方案1】:

    将您现有的密钥导入为SecretValue。使用 .toString() 方法将其传递给 clientSecret:string 属性。

    // Existing secret as SecretValue.  Or use Secret.fromSecretNameV2.
    const secretVal = cdk.SecretValue.secretsManager('GoogleSecrets', {
      jsonField: 'client-secret',
    });
    
    new cognito.UserPoolIdentityProviderGoogle(this, 'GoogleProvider', {
      userPool,
      // creates a dynamic reference which resolves to the actual secret value at deploy-time
      clientSecret: secretVal.toString(),
      clientId: 'my-id',
    });
    

    解释

    SecretValue.toString() 在生命周期中“解析”为不同的值: 当你 console.log 它时,你会得到一个(无用的)不透明占位符 Token 值,例如 ${Token[TOKEN.198]}。在合成时,CDK 在模板中呈现 CloudFormation dynamic reference

    //my-stack.template.json
    {"client_secret": "{{resolve:secretsmanager:arn:aws:secretsmanager:us-east-1:123456789012:secret:GoogleSecrets:SecretString:client-secret::}}"}
    

    在部署时,CloudFormation “解决”实际的来自动态参考的秘密值。

    重要的一点是,实际的秘密值永远不会暴露给您的本地环境或模板工件。

    【讨论】:

    • 谢谢您的帮助!我试图获取整个 JSON 对象,而不是每个单独的秘密。一旦我切换到分别获取每个秘密,它就起作用了!
    【解决方案2】:

    使用 secretValue.unsafeUnwrap() ,这是让它与 CDK 一起工作的唯一方法。否则它将失败,因为秘密数据在 cdk 使用的生成的 yaml 或 json 文件中可用......换句话说,云形成。

    【讨论】:

      猜你喜欢
      • 2019-01-09
      • 2021-06-14
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 2021-09-02
      • 1970-01-01
      • 2012-04-04
      • 2021-09-09
      相关资源
      最近更新 更多