【发布时间】:2014-07-25 20:31:31
【问题描述】:
我的elasticsearch.yml 文件中有以下两个设置。它们是唯一从环境变量中提取的变量。
cloud.aws.access_key: ${AWS_ACCESS_KEY_ID}
cloud.aws.secret_key: ${AWS_SECRET_KEY}
当我重新启动 elasticsearch 以从环境中加载这些内容时,我收到一个无法解决它们的错误。我已经对其进行了测试,但它也无法解决,因此此错误适用于两者(它首先在底部失败)
- IllegalArgumentException[Could not resolve placeholder 'AWS_SECRET_KEY']
java.lang.IllegalArgumentException: Could not resolve placeholder 'AWS_SECRET_KEY'
at org.elasticsearch.common.property.PropertyPlaceholder.parseStringValue(PropertyPlaceholder.java:124)
at org.elasticsearch.common.property.PropertyPlaceholder.replacePlaceholders(PropertyPlaceholder.java:81)
at org.elasticsearch.common.settings.ImmutableSettings$Builder.replacePropertyPlaceholders(ImmutableSettings.java:1060)
at org.elasticsearch.node.internal.InternalSettingsPreparer.prepareSettings(InternalSettingsPreparer.java:101)
at org.elasticsearch.bootstrap.Bootstrap.initialSettings(Bootstrap.java:106)
at org.elasticsearch.bootstrap.Bootstrap.main(Bootstrap.java:177)
at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:32)
我通过 github 上的 elasticsearch 代码库进行了一些调查,发现了这段从环境变量中提取的代码。
ImmutableSettings.java#resolvePlaceholder from elasticsearch@github
即。 应该从环境变量中提取的函数内的行是:
Code from resolvePlaceholder that pulls out environment variables
但是,在从函数 PropertyPlaceholder#parseStringValue 内部运行 resolvePlaceholder 之后,System.getenv 调用必须返回 null,因为这是引发该错误的唯一方法。
我编写了一个简单的测试程序,它本质上是ImmutableSettings.java#resolvePlaceholder 的副本,以测试System.getenv 是否在我的系统上正确提取了环境变量。这实际上返回了我期望的值。
public class Cool {
public static void main(String[] args) {
System.out.println(resolvePlaceholder(args[0]));
}
public static String resolvePlaceholder(String placeholderName) {
if (placeholderName.startsWith("env.")) {
// explicit env var prefix
System.out.println("1: placeholderName.startsWith(\"env.\")");
return System.getenv(placeholderName.substring("env.".length()));
}
String value = System.getProperty(placeholderName);
if (value != null) {
System.out.println("2: System.getProperty");
return value;
}
value = System.getenv(placeholderName);
if (value != null) {
System.out.println("3: System.getenv");
return value;
}
return "Map should've had it";
}
}
运行时,这是输出,显示我们正在获取设置的环境变量(由于显而易见的原因隐藏了键):
[ec2-user@ip-172-31-34-195 ~]$ java Cool AWS_SECRET_KEY
3: System.getenv
XXXXXXXXXXXXXXXXXX
[ec2-user@ip-172-31-34-195 ~]$ java Cool AWS_ACCESS_KEY_ID
3: System.getenv
XXXXXXXXXXXXXXXXXX
elasticsearch 无法从elasticsearch.yml 解析我的环境变量是怎么回事?在这一点上,我已经做了很多挖掘工作,但我确信在拐角处有一个简单的解决方案。任何帮助将不胜感激。
【问题讨论】:
标签: elasticsearch environment-variables