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:
- 在 AWS 控制台中手动创建密钥 github 令牌是一种跨应用程序资源,可能会在多个 CDK 应用程序中重复使用。而不是捆绑
它到特定的应用程序,在控制台中手动创建它。接下来,在您的管道堆栈中,在应用程序中使用 SecretValue's
cdk.SecretValue.secretsManager('github-token')
静态方法来获取对秘密的引用。2
- 在新的、单独的 CDK 应用程序中创建机密在单独的“共享”CDK 应用程序中创建机密和 IAM 用户等跨应用程序资源。部署应用程序,更新
将 github-令牌值转换为实际令牌值,然后在您的应用程序中读取它的值。2
- 在您的应用程序的单独堆栈中创建密钥部署应用程序。秘密堆栈将部署,但管道堆栈将失败(因为秘密是 CDK 生成的)。更新控制台中的令牌值,重新部署您的应用程序。第二次,管道将找到有效令牌并部署成功。
(1) 高级单堆栈选项:将带有令牌值的部署时参数传递给调用 PutSecretValue API 的自定义资源。复杂,有过度设计的味道。
(2) 秘密的固定费用为每月 0.50 美元,因此在多个应用程序之间共享 github-令牌秘密可能是值得的。
我正在将我的 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);
参考文档: 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:
- 在 AWS 控制台中手动创建密钥 github 令牌是一种跨应用程序资源,可能会在多个 CDK 应用程序中重复使用。而不是捆绑
它到特定的应用程序,在控制台中手动创建它。接下来,在您的管道堆栈中,在应用程序中使用 SecretValue's
cdk.SecretValue.secretsManager('github-token')
静态方法来获取对秘密的引用。2 - 在新的、单独的 CDK 应用程序中创建机密在单独的“共享”CDK 应用程序中创建机密和 IAM 用户等跨应用程序资源。部署应用程序,更新 将 github-令牌值转换为实际令牌值,然后在您的应用程序中读取它的值。2
- 在您的应用程序的单独堆栈中创建密钥部署应用程序。秘密堆栈将部署,但管道堆栈将失败(因为秘密是 CDK 生成的)。更新控制台中的令牌值,重新部署您的应用程序。第二次,管道将找到有效令牌并部署成功。
(1) 高级单堆栈选项:将带有令牌值的部署时参数传递给调用 PutSecretValue API 的自定义资源。复杂,有过度设计的味道。
(2) 秘密的固定费用为每月 0.50 美元,因此在多个应用程序之间共享 github-令牌秘密可能是值得的。