用Python客户端在Amazon Elasticsearch服务中创建IAM账户并安全访问
亚马逊 Elasticsearch 服务允许使用 IAM 或 IP 地址进行访问控制。一开始我是通过 IP 地址过滤进行操作的,但考虑到未来可能陷入困境,所以改用了 IAM。
另外,由于需要等待大约20分钟才能反映在 Amazon Elasticsearch 服务的访问策略更改上,这实在很麻烦。所以,我认为尽早进行 IAM (身份和访问管理)转换会更轻松一些。(在等待反映期间,服务仍可使用)
创建IAM用户
我正在 IAM 用户页面
https://console.aws.amazon.com/iam/home#users
中创建一个“新用户”
→ 我会随意创建一个
完成后,点击”显示用户安全认证信息”链接,并记录帐户名、访问密钥 ID 和密钥。
如果可以的话,请在左侧选项卡中显示“用户”页面,并选择先前创建的用户。
将显示“用户的ARN”,请也将其复制下来。
这种类型的 → arn:aws:iam::000000000000:user/xxxxxxxxxxxxx
创建 Elasticsearch 访问策略
Amazon Elasticsearch Service的控制台
https://ap-northeast-1.console.aws.amazon.com/es/home
打开应用,选择域名。
修改访问策略 → 选择一个模板 → 允许或拒绝对一个或多个AWS账户或IAM用户的访问选项。
作用:允许在 Account ID 或 ARN 上,粘贴先前的 ARN。
生成访问政策的 JSON,然后点击「提交」→「确定」按钮。
再次打开访问策略修改页面后,状态将显示为正在处理。在反映完成后,此处将变为激活状态(无需刷新浏览器)。大约需要20分钟。
如果也允许使用IP地址的话
如果按照这个步骤创建访问策略,没有进行 IAM 认证就无法访问 ES,所以如果想从浏览器中访问 Kibana 会有一些麻烦。因此,使用 OR 条件来允许访问 Kibana 的 IP 地址可能更方便实用。
将策略添加到访问策略的声明列表中。
(上面的是IP地址白名单,下面的是使用IAM进行控制)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "es:*",
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"000.000.000.000"
]
}
},
"Resource": "arn:aws:es:ap-northeast-1:000000000000:domain/hogehoge/*"
},
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::000000000000:user/xxxxxxxxxxxxx"
},
"Action": "es:*",
"Resource": "arn:aws:es:ap-northeast-1:000000000000:domain/hogehoge/*"
}
]
}
编写测试脚本
请参考这个 Issue:https://github.com/elastic/elasticsearch-py/issues/280
请安装所需的库。
$ pip install elasticsearch requests_aws4auth
也许还需要使用requests库。在我的环境中已经安装了,所以不确定是否需要。
编码
import elasticsearch
from requests_aws4auth import AWS4Auth
host = 'xxxxxxxx.ap-northeast-1.es.amazonaws.com'
awsauth = AWS4Auth(
'アクセスキーID',
'シークレットアクセスキー', 'ap-northeast-1', 'es')
es = elasticsearch.Elasticsearch(
hosts=[{'host': host, 'port': 443}],
http_auth=awsauth,
use_ssl=True,
verify_certs=True,
connection_class=elasticsearch.connection.RequestsHttpConnection
)
print(es.info())
print(es.cluster.health())
我会在之前的AWS Elasticsearch访问策略页面上等待”Status”变为”Active”。您可以保持页面打开并等待,无需频繁刷新浏览器。
在融入前
elasticsearch.exceptions.AuthorizationException: TransportError(403, '{"Message":"User: arn:aws:iam::000000000000:user/xxxxxxxxxxxxx is not authorized to perform: es:ESHttpGet on resource: arn:aws:es:ap-northeast-1:000000000000:domain/hogehoge/"}')
发生了这个错误。
状态变为活跃后
{'version': {'lucene_version': '4.10.4', 'build_timestamp': '2015-04-27T09:21:06Z', 'build_snapshot': False, 'build_hash': '62ff9868b4c8a0c45860bebb259e21980778ab1c', 'number': '1.5.2'}, 'status': 200, 'cluster_name': '000000000000:hedgehoge', 'tagline': 'You Know, for Search', 'name': 'Ororo Munroe'}
{'active_primary_shards': 11, 'number_of_pending_tasks': 0, 'cluster_name': '000000000000:hedgehoge', 'relocating_shards': 0, 'active_shards': 11, 'status': 'yellow', 'timed_out': False, 'number_of_nodes': 1, 'unassigned_shards': 11, 'number_of_data_nodes': 1, 'initializing_shards': 0}
收到了结果?
…建筑古老… …)