1

我是 Dropwizard 的新手,并希望在应用程序引导时从 AWS SSM 参数存储中检索秘密。我有两个关于如何做到这一点的问题:

  1. 我应该在哪里做这个?在初始化方法中?
  2. 调用 AWS SSM Parameter Store 后,放置它的最佳位置是哪里?我快速浏览了 Bootstrap 类,但对我来说,我应该把秘密等东西放在哪里以便以后检索,这并不明显。

谢谢

4

1 回答 1

1

ConfigurationSourceProvider您可以通过设置用 Parameter Store 变量的值替换配置设置来实现您想要的。

@Override
public void initialize(Bootstrap<MyConfiguration> bootstrap) {
    ParameterStoreSourceProvider parameterStoreSourceProvider =
            new ParameterStoreSourceProvider(bootstrap.getConfigurationSourceProvider());
    bootstrap.setConfigurationSourceProvider(parameterStoreSourceProvider);
}

实现ConfigurationSourceProvider从委托接管配置输入流以替换值的 a。

public class ParameterStoreSourceProvider implements ConfigurationSourceProvider {
    private final ConfigurationSourceProvider delegate;
    private final StringSubstitutor substitutor;

    public ParameterStoreSourceProvider(ConfigurationSourceProvider delegate) {
        this.delegate = delegate;
        this.substitutor = new StringSubstitutor(new ParameterStoreLookup());
    }

    @Override
    public InputStream open(String path) throws IOException {
        try (Scanner scanner = new Scanner(delegate.open(path))) {
            String config = scanner.useDelimiter("\\A").next();
            String substituted = substitutor.replace(config);
            return new ByteArrayInputStream(substituted.getBytes(StandardCharsets.UTF_8));
        }
    }
}

实现您ParameterStoreLookup让其StringSubstitutor用作变量解析器的位置。

public class ParameterStoreLookup implements StringLookup {
    @Override
    public String lookup(String s) {
        // Lookup the value from Parameter Store and return.
        return null;
    }
}

完成上述步骤后,您可以在配置文件中定义一个变量,如下所示:

database:
    driverClass : org.postgresql.Driver
    url: ${DB_URL}
    user: ${DB_USER}
    password: ${DB_PASSWORD}
logging:
    level: INFO
    appenders:
        - type: console

有关定义变量的更多信息,请参阅StringSubstitutor。确保将commons-text添加到您的依赖项中。

于 2018-11-05T19:50:13.910 回答