首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在CDK 2.0.0中访问AWS SecretsManager :使用software.amazon.awscdk.services.secretsmanager.Secret的错误在未命名模块中

在CDK 2.0.0中访问AWS SecretsManager :使用software.amazon.awscdk.services.secretsmanager.Secret的错误在未命名模块中
EN

Stack Overflow用户
提问于 2021-12-06 08:22:15
回答 1查看 640关注 0票数 0

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

在CDK1.x中,我使用了SecretsManager控制台中的示例代码来访问秘密字符串,并且运行良好。但是,在CDKv2.0.0中,这些类不再可用,因此我需要将代码移植到CDKv2.0.0类中。

按照CDK指南(value.html)中的示例,我在我的应用程序中创建了一个SecretsManagerStack,如下所示:

代码语言:javascript
复制
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.

    }
}

根据指南,这似乎是相当高的库存标准,但运气不佳。在运行时,它返回:

代码语言:javascript
复制
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样式:

代码语言:javascript
复制
secret = (Secret) Secret.fromSecretCompleteArn(this, "SecretsManagerStack", secretName);

也产生同样的结果。

因为CDKv2.0.0看起来很新,所以我在搜索中没有发现任何类似的结果,所以有时间联系。有什么线索吗?有人在AWS CDK v2.0.0中见过这个吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-06 12:23:07

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

在CDK中,“秘密管理器”机密不能作为纯文本阅读。CDK只能传递对周围秘密的引用,这将在部署期间由CloudFormation解决。

您可以通过使用SDK (这似乎是您以前所做的)来破解这个问题,但这不是一个好的实践。您不应该在CDK代码中处理明文秘密。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70242586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档