AWS CDK 是否可以创建具有空白值或占位符值的密钥?

Is it possible for AWS CDK to create a secret with a blank or placeholder value?

我正在将我的 CodePipeline 连接到 Github,所以我添加了以下行:

CodePipelineSource.gitHub("username/repo", "main", {
   authentication: cdk.SecretValue.secretsManager("github-token")
})

当我 运行 cdk deploy 时,它预期会失败:

Pipeline/Pipeline (Pipeline9850B417) Secrets Manager can't find the specified secret. (Service: AWSSecretsManager; Status Code: 400; Error Code: ResourceNotFoundException; Request ID: eaa59d67-bb64-472c-abc4-9d4896c09d7e; Proxy: null)

CDK 是否可以使用 空白或占位符值 创建秘密,这样它仍然会因某种访问被拒绝而失败,但我可以继续到 AWS 控制台并填写值。

澄清:我不希望 CDK 创建 OAuth 令牌。我想实现的是 运行 cdk deploy,失败了,去 Secrets Manager 找到带有占位符值的秘密,输入值,再次 运行 cdk deploy,并在那次成功。

您可以像创建任何其他资源一样创建机密。

const secret = new secretsmanager.Secret(this, 'Secret');

它将用生成的占位符值填充它。您还可以使用 secret.grantRead(role);

授予某些角色 read/write 访问秘密的权限

参考文档: https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_secretsmanager.Secret.html

您还需要告诉 CDK 您的管道依赖于秘密 my_pipeline.node.addDependency(secret);

有点棘手。长话短说,我们必须在管道堆栈之外创建秘密。

我们可以用 CDK 创建一个生成的 Secret(并得到它的 secretValue: SecretValue)。但是,正如您发现的那样,挑战在于使用实际的 github 令牌值安全地更新机密。在 synth 操作中设置 mySecret.secretValue 并推迟实际令牌值更新将不起作用。 CDK 生成的秘密值将导致管道堆栈部署失败并出现 Invalid credentials 错误。

那么我们如何创建秘密、设置它的值并将它提供给合成动作呢?有几种选择。每个都涉及在管道堆栈外构造秘密1:

  1. 在 AWS 控制台中手动创建密钥 github 令牌是一种跨应用程序资源,可能会在多个 CDK 应用程序中重复使用。而不是捆绑 它到特定的应用程序,在控制台中手动创建它。接下来,在您的管道堆栈中,在应用程序中使用 SecretValue'scdk.SecretValue.secretsManager('github-token') 静态方法来获取对秘密的引用。2
  2. 在新的、单独的 CDK 应用程序中创建机密在单独的“共享”CDK 应用程序中创建机密和 IAM 用户等跨应用程序资源。部署应用程序,更新 将 github-令牌值转换为实际令牌值,然后在您的应用程序中读取它的值。2
  3. 在您的应用程序的单独堆栈中创建密钥部署应用程序。秘密堆栈将部署,但管道堆栈将失败(因为秘密是 CDK 生成的)。更新控制台中的令牌值,重新部署您的应用程序。第二次,管道将找到有效令牌并部署成功。

(1) 高级单堆栈选项:将带有令牌值的部署时参数传递给调用 PutSecretValue API 的自定义资源。复杂,有过度设计的味道。

(2) 秘密的固定费用为每月 0.50 美元,因此在多个应用程序之间共享 github-令牌秘密可能是值得的。