在 CDK 2.0.0 中访问 AWS SecretsManager:software.amazon.awscdk.services.secretsmanager.Secret 错误位于未命名模块中
Accessing AWS SecretsManager in CDK 2.0.0: Errors with software.amazon.awscdk.services.secretsmanager.Secret are in unnamed module
我最近从 AWS CDK v1.x 升级到 v2.0.0。我的堆栈使用 SecretsManager 访问 json 上包含许多秘密的字符串有效负载。
在 CDK 1.x 中,我使用了 SecretsManager 控制台中的示例代码来访问秘密字符串,它运行良好。但是在 CDK v2.0.0 中那些 类 不再可用,所以我需要将代码移植到 CDK v2.0.0 类.
按照 CDK 指南中的示例 (https://docs.aws.amazon.com/cdk/v2/guide/get_secrets_manager_value.html),我在我的应用中创建了一个 SecretsManagerStack,如下所示:
public class SecretsManagerStack extends Stack {
private String secretValue;
public String getSecretValue() {
return this.secretValue;
}
public SecretsManagerStack(final Construct scope, final String id) {
this(scope, id, null);
}
public SecretsManagerStack(final Construct scope, final String id, final SecretsManagerStackProps props) {
super(scope, id, props.getStackProps());
String secretName = ConfigManager.getInstance().get("$.aws.secrets.secretName");
//Note this throws throws errors like:
// java.lang.ClassCastException: class software.amazon.awscdk.services.secretsmanager.ISecret$Jsii$Proxy cannot be cast to class software.amazon.awscdk.services.secretsmanager.Secret
// (software.amazon.awscdk.services.secretsmanager.ISecret$Jsii$Proxy and software.amazon.awscdk.services.secretsmanager.Secret are in unnamed module of loader 'app')
Secret secret = (Secret)Secret.fromSecretAttributes(this, "sm-stack",
SecretAttributes.builder()
.secretCompleteArn(secretName)
.build());
// Attempt to set a role on the secret - but this 'should' not be necessary?
String accountId = ConfigManager.getInstance().get("$.aws.account");
AccountPrincipal accountPrincipal = new AccountPrincipal(accountId);
RoleProps roleProps = RoleProps.builder()
.assumedBy(accountPrincipal)
.build();
Role secretAccessRole = new Role(this, "SecretsAccessRole", roleProps);
secret.grantRead(secretAccessRole);
this.secretValue = secret.getSecretValue().toString();
//Ideally if this worked we would pass the stack as properties into other stacks so they
// could access this secretValue and parse the json into what it needs to do. But alas no.
}
}
根据指南,这似乎是相当标准的,但运气不好。在 运行 时间 returns:
java.lang.ClassCastException: class software.amazon.awscdk.services.secretsmanager.ISecret$Jsii$Proxy cannot be cast to class software.amazon.awscdk.services.secretsmanager.Secret
(software.amazon.awscdk.services.secretsmanager.ISecret$Jsii$Proxy and software.amazon.awscdk.services.secretsmanager.Secret are in unnamed module of loader 'app')
尝试向机密添加角色以读取该角色也没有任何影响(根据代码)。我的假设是没有必要,因为我 运行 宁作为帐户所有者。
正在尝试使用 Secret.fromSecretCompleteArn 样式:
secret = (Secret) Secret.fromSecretCompleteArn(this, "SecretsManagerStack", secretName);
也产生相同的结果。
由于 CDK v2.0.0 看起来很新,我在搜索中没有找到任何类似的结果,所以是时候联系我们了。有什么线索吗?有人以前在 AWS CDK v2.0.0 中见过这个吗?
这是不可能的,而且从来都不是。
无法在 CDK 中以纯文本形式读取 Secrets Manager 机密。 CDK 只能传递对秘密的引用,这将在部署期间由 CloudFormation 解析。
您可以使用 SDK 解决这个问题(您之前似乎就是这样做的),但这不是一个好的做法。您不应在 CDK 代码中处理明文机密。
需要说明的是,CDK v1 和 v2 在这方面没有区别。
我最近从 AWS CDK v1.x 升级到 v2.0.0。我的堆栈使用 SecretsManager 访问 json 上包含许多秘密的字符串有效负载。
在 CDK 1.x 中,我使用了 SecretsManager 控制台中的示例代码来访问秘密字符串,它运行良好。但是在 CDK v2.0.0 中那些 类 不再可用,所以我需要将代码移植到 CDK v2.0.0 类.
按照 CDK 指南中的示例 (https://docs.aws.amazon.com/cdk/v2/guide/get_secrets_manager_value.html),我在我的应用中创建了一个 SecretsManagerStack,如下所示:
public class SecretsManagerStack extends Stack {
private String secretValue;
public String getSecretValue() {
return this.secretValue;
}
public SecretsManagerStack(final Construct scope, final String id) {
this(scope, id, null);
}
public SecretsManagerStack(final Construct scope, final String id, final SecretsManagerStackProps props) {
super(scope, id, props.getStackProps());
String secretName = ConfigManager.getInstance().get("$.aws.secrets.secretName");
//Note this throws throws errors like:
// java.lang.ClassCastException: class software.amazon.awscdk.services.secretsmanager.ISecret$Jsii$Proxy cannot be cast to class software.amazon.awscdk.services.secretsmanager.Secret
// (software.amazon.awscdk.services.secretsmanager.ISecret$Jsii$Proxy and software.amazon.awscdk.services.secretsmanager.Secret are in unnamed module of loader 'app')
Secret secret = (Secret)Secret.fromSecretAttributes(this, "sm-stack",
SecretAttributes.builder()
.secretCompleteArn(secretName)
.build());
// Attempt to set a role on the secret - but this 'should' not be necessary?
String accountId = ConfigManager.getInstance().get("$.aws.account");
AccountPrincipal accountPrincipal = new AccountPrincipal(accountId);
RoleProps roleProps = RoleProps.builder()
.assumedBy(accountPrincipal)
.build();
Role secretAccessRole = new Role(this, "SecretsAccessRole", roleProps);
secret.grantRead(secretAccessRole);
this.secretValue = secret.getSecretValue().toString();
//Ideally if this worked we would pass the stack as properties into other stacks so they
// could access this secretValue and parse the json into what it needs to do. But alas no.
}
}
根据指南,这似乎是相当标准的,但运气不好。在 运行 时间 returns:
java.lang.ClassCastException: class software.amazon.awscdk.services.secretsmanager.ISecret$Jsii$Proxy cannot be cast to class software.amazon.awscdk.services.secretsmanager.Secret
(software.amazon.awscdk.services.secretsmanager.ISecret$Jsii$Proxy and software.amazon.awscdk.services.secretsmanager.Secret are in unnamed module of loader 'app')
尝试向机密添加角色以读取该角色也没有任何影响(根据代码)。我的假设是没有必要,因为我 运行 宁作为帐户所有者。
正在尝试使用 Secret.fromSecretCompleteArn 样式:
secret = (Secret) Secret.fromSecretCompleteArn(this, "SecretsManagerStack", secretName);
也产生相同的结果。
由于 CDK v2.0.0 看起来很新,我在搜索中没有找到任何类似的结果,所以是时候联系我们了。有什么线索吗?有人以前在 AWS CDK v2.0.0 中见过这个吗?
这是不可能的,而且从来都不是。
无法在 CDK 中以纯文本形式读取 Secrets Manager 机密。 CDK 只能传递对秘密的引用,这将在部署期间由 CloudFormation 解析。
您可以使用 SDK 解决这个问题(您之前似乎就是这样做的),但这不是一个好的做法。您不应在 CDK 代码中处理明文机密。
需要说明的是,CDK v1 和 v2 在这方面没有区别。