访问CDK 2.0.0中的AWS SecretsManager:软件错误.amazon.awsdk.services.S



我最近从AWS CDK v1.x升级到v2.0.0。我的堆栈使用SecretsManager访问json上的字符串负载,该负载包含许多机密。

在CDK1.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.
}
}

根据指南,它看起来很普通,但运气不好。运行时返回:

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中见过这个吗?

这是不可能的,而且从来都不是。

Secrets Manager机密不能在CDK中以纯文本形式读取。CDK只能传递对周围秘密的引用,这将在部署期间由CloudFormation解决。

你可以通过使用SDK来解决这个问题(看起来你以前就是这么做的(,但这不是一个好的做法。您不应该在CDK代码中处理明文机密。

需要明确的是,CDK v1和v2在这方面没有区别。

最新更新