我最近开始使用新的Amazon Elasticsearch Service,我似乎无法弄清楚我需要的访问策略,因此我只能从我的EC2实例访问具有特定IAM角色的服务.
以下是我目前为ES域分配的访问策略的示例:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::[ACCOUNT_ID]:role/my_es_role",
]
},
"Action": "es:*",
"Resource": "arn:aws:es:us-east-1:[ACCOUNT_ID]:domain/[ES_DOMAIN]/*"
}
]
}
Run Code Online (Sandbox Code Playgroud)
但正如我所说,这不起作用.我登录到EC2实例(my_es_role附加了角色)并尝试在"https://*.es.amazonaws.com"端点上运行简单的curl调用,我收到以下错误:
{"消息":"用户:匿名无权执行:es:ESHttpGet on resource:arn:aws:es:us-east-1:[ACCOUNT_ID]:domain/[ES_DOMAIN] /"}
有没有人知道我必须在访问策略中更改什么才能使其正常工作?
amazon-ec2 amazon-web-services elasticsearch amazon-iam amazon-elasticsearch
我创建了Amazon elasticsearch服务,并使用logstash将数据填充到其中,logstash已安装在EC2实例上.在Amazon弹性服务控制台页面上,将有一个访问Kibana的链接.
search-cluster_name-XXXXXXXXXXXXXXXXXXX.region_name.es.amazonaws.com/_plugin/kibana/
Run Code Online (Sandbox Code Playgroud)
当我点击链接时,浏览器抛出以下错误.
{"Message":"User: anonymous is not authorized to perform: es:ESHttpGet on resource: arn:aws:es:region_name:account_id:domain/cluster_name/_plugin/kibana/"}
Run Code Online (Sandbox Code Playgroud)
我确定这与ES域的访问策略有关.如何修改访问策略,以便通过点击指定的链接访问Kibana?
amazon-ec2 amazon-web-services elasticsearch kibana-4 amazon-elasticsearch
我一直在努力弄清楚如何从我的EC2实例与Amazon ES服务进行通信.
文档明确指出Amazon ES服务支持基于IAM用户和角色的访问策略.http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-createupdatedomains.html#es-createdomain-configure-access-policies
但是,当我的ES域具有此访问策略时:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789:role/my-ec2-role"
},
"Action": "es:*",
"Resource": "arn:aws:es:us-west-2:123456789:domain/myDomain/*"
}
]
}
Run Code Online (Sandbox Code Playgroud)
我无法登录ec2实例并运行curl来访问我的elasticsearch集群.
尝试对_search API进行简单的卷曲:
curl "http://search-myDomain.es.amazonaws.com/_search"
Run Code Online (Sandbox Code Playgroud)
生成身份验证错误响应:
{"Message":"User: anonymous is not authorized to perform: es:ESHttpGet on resource: arn:aws:es:us-west-2:123456789:domain/myDomain/_search"}
Run Code Online (Sandbox Code Playgroud)
为了更安全,我把AmazonESFullAccess政策放在我的IAM角色上,仍然无效.
我必须遗漏一些东西,因为能够以编程方式从使用IAM角色的ec2实例与Elasticsearch进行交互,这对于使用Amazon ES服务完成任何事情至关重要.
我也在文档中看到了这个矛盾的陈述.
基于IAM的策略示例您可以使用AWS IAM控制台而不是Amazon ES控制台创建基于IAM的访问策略.有关创建基于IAM的访问策略的信息,请参阅IAM文档.
IAM文档的链接是IAM的主页,其中包含有关如何执行此操作的零信息.有人为我找到了解决方案吗?
我正在尝试将Elasticsearch用于连接到Alexa Skills Kit的Lambda函数的数据存储.Lambda在没有Elasticsearch的情况下正常工作,但ES提供了急需的模糊匹配.
我能够从Lambda访问它的唯一方法是启用Elasticsearch全局访问,但这是一个非常糟糕的主意.我也可以通过开放访问策略或IP地址策略从我的计算机访问.有没有办法通过Lambda进行只读访问和通过IP进行读写?
在IAM上,我授予了我的Lambda角色AmazonESReadOnlyAccess.在ES方面,我试过这个,但它只适用于IP地址:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::NUMBER:root",
"arn:aws:iam::NUMBER:role/lambda_basic_execution"
]
},
"Action": "es:*",
"Resource": "arn:aws:es:us-east-1:NUMBER:domain/NAME/*"
},
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "es:*",
"Resource": "arn:aws:es:us-east-1:NUMBER:domain/NAME/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "MY IP"
}
}
}
]
}
Run Code Online (Sandbox Code Playgroud)
该论坛帖子提出了同样的问题,但未得到答复.
我们计划为我们的多租户应用程序引入弹性搜索(AWS).我们有以下选项,
根据这篇博客https://www.elastic.co/blog/found-multi-tenancy,第一个选项会产生内存问题.但不清楚其他选择.
看来如果我们使用第三个选项那么就没有数据隔离.不确定安全性.
我认为第二种选择是更好的选择,因为数据会被隔离.
帮助我确定使用多租户进行弹性搜索的最佳选项.
请注意,我们将利用AWS基础架构.
如何在Amazon Elasticsearch Service上安装elasticsearch-river-mongodb插件?
我正在尝试将AWS Managed ElasticSearch用于我的项目.
我已经关注了https://aws.amazon.com/blogs/aws/new-amazon-elasticsearch-service/,我可以启动一个实例并且成功了.但我无法使用elasticsearch传输客户端从我的服务连接到同一个实例.
我知道传输客户端应该连接到9300端口,而该端口我无法通过aws控制台打开.
这是我用来连接的代码,它可以成功连接到我在9300端口上的ec2机器上的弹性搜索设置.
ImmutableSettings.Builder settings = ImmutableSettings.settingsBuilder();
settings.put("cluster.name", "my-cluster-name")
.put("client.transport.nodes_sampler_interval", "15s")
.put("client.transport.ping_timeout", "15s")
.put("client.transport.sniff", true)
.put("client.transport.ignore_cluster_name", false).build();
client = new TransportClient(settings)
.addTransportAddress(
new InetSocketTransportAddress(
env.getProperty("elastic-host-url-provided-by-aws",80)
));
Run Code Online (Sandbox Code Playgroud)
我得到了例外
org.elasticsearch.client.transport.NoNodeAvailableException:没有配置的节点可用:[]位于org.elasticsearch.client.transport.TransportClientNodesService的org.elasticsearch.client.transport.TransportClientNodesService.ensureNodesAreAvailable(TransportClientNodesService.java:305).在org.elasticsearch.client.support.AbstractClient.index(AbstractClient.java:98)的org.elasticsearch.client.transport.support.InternalTransportClient.execute(InternalTransportClient.java:106)执行(TransportClientNodesService.java:200)
我怀疑这个错误是因为我通过HTTP端口连接TransportClient.但我不知道aws托管弹性搜索实例的TCP端口是什么.我搜索了aws文件,但我找不到任何文件.如果有人使用TransportClient连接Amazon ES,请告诉我.
注意:我已经验证我使用的elasticsearch java jar版本与服务器相同.从我的系统我可以访问Kibana和ES HTTP PORTS没有任何问题.
我使用AWS elasticsearch服务(非EC2)设置了elasticsearch服务器.它给了我一个端点https://xxx-xxxxxxxx.us-west-2.es.amazonaws.com/如果我点击这个端点(注意没有指定端口)我可以得到预期的
{
status: 200,
name: "Mastermind",
cluster_name: "xxxx",
version: {
number: "1.5.2",
build_hash: "yyyyyy",
build_timestamp: "2015-04-27T09:21:06Z",
build_snapshot: false,
lucene_version: "4.10.4"
},
tagline: "You Know, for Search"
}
Run Code Online (Sandbox Code Playgroud)
问题是如何通过不带端口号的elasticsearch java客户端获取此信息?我得到的示例代码是
Client client = TransportClient.builder().build()
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host1"), 9300));
Run Code Online (Sandbox Code Playgroud)
如果我使用此代码并将"host1"替换为我的端点,我将得到"NoNodeAvailableException"
ps:我使用的java客户端版本是2.0.0.
编辑 我最终决定选择第三方REST客户端Jest.但Brooks在下面回答的内容也非常有用 - AWS确实将端口80用于http,将443用于https.对我来说阻止者是我猜的防火墙.
Edit2
AWS ES服务文档明确说明:
该服务支持端口80上的HTTP,但不支持TCP传输.
amazon-web-services elasticsearch elasticsearch-java-api amazon-elasticsearch
根据Amazon Kinesis Streams 文档,可以多次传送记录.
确保仅处理每个记录的唯一方法是将它们临时存储在支持完整性检查的数据库中(例如DynamoDB,Elasticache或MySQL/PostgreSQL),或者只检查每个Kinesis分片的RecordId.
您是否知道更好/更有效的处理重复方法?
amazon-web-services amazon-elasticache amazon-dynamodb amazon-kinesis amazon-elasticsearch
我在AWS RDS中有数据,我想将其传输到AWS ES实例,最好每小时更新一次,或者类似.
在我的本地机器上,使用本地mysql数据库和Elasticsearch数据库,使用Logstash很容易设置它.
是否有"原生"AWS方式来做同样的事情?或者我是否需要设置EC2服务器并自行安装Logstash?
amazon-web-services elasticsearch logstash amazon-elasticsearch