尝试为 ELK 创建 S3 snaphost 存储库时出现 HTTP 503 错误

HTTP 503 error when trying to create a S3 snaphost repo for ELK

每当我尝试 create a repository for an Elasticsearch snapshot on an Amazon S3 bucket:

时都会收到 HTTP 503 错误
[root@myserver ~]# curl -XPUT 'https://myes.example.org:9200/_snapshot/s3_repository' -H 'Content-Type: application/json' -d '
{
  "type": "s3",
  "settings": { "bucket": "mybucket/elk" }
}'

30 秒后超时:

{"error":{"root_cause":[{"type":"process_cluster_event_timeout_exception","reason":"failed to process cluster event (put_repository [s3_repository]) within 30s"}],"type":"process_cluster_event_timeout_exception","reason":"failed to process cluster event (put_repository [s3_repository]) within 30s"},"status":503}

但是,S3 存储桶确实可以从我的服务器访问:

[root@myserver ~]# aws s3 cp testfile s3://mybucket/elk/ --sse AES256

upload: ./testfile to s3://mybucket/elk/testfile 

可能是什么原因以及如何解决?

您需要确保凭证正确存储在密钥库中。

cat /aws/access_key | base64 --decode | bin/elasticsearch-keystore add --stdin --force s3.client.default.access_key && \
cat /aws/secret_key | base64 --decode | bin/elasticsearch-keystore add --stdin --force s3.client.default.secret_key

来自插件文档:

S3 存储库插件

S3 存储库插件添加了对使用 S3 作为 {ref}/modules-snapshots.html[Snapshot/Restore].

存储库的支持

如果您正在寻找 Elasticsearch on AWS 的托管解决方案,请访问 http://www.elastic.co/cloud

开始使用 AWS

该插件提供了一个名为 s3 的存储库类型,可以在创建存储库时使用。存储库默认使用 ECS IAM 角色或 EC2 IAM 角色凭证进行身份验证。唯一的强制设置是存储桶名称:

PUT _snapshot/my_s3_repository
{
  "type": "s3",
  "settings": {
    "bucket": "my_bucket"
  }
}

客户端设置

用于连接到 S3 的客户端有许多可用的设置。客户端设置名称的格式为 s3.client.CLIENT_NAME.SETTING_NAME。由 s3 存储库查找的默认客户端名称称为 default。可以使用存储库设置客户端对其进行修改。例如:

PUT _snapshot/my_s3_repository
{
  "type": "s3",
  "settings": {
    "bucket": "my_bucket",
    "client": "my_alternate_client"
  }
}

大多数客户端设置都在 elasticsearch.yml 中指定,但有些是敏感的,必须存储在 {ref}/secure-settings.html[elasticsearch keystore] 中。

例如,在启动节点之前,运行这些命令将 AWS 访问密钥设置添加到密钥库:

bin/elasticsearch-keystore add s3.client.default.access_key
bin/elasticsearch-keystore add s3.client.default.secret_key

此插件的所有客户端安全设置都是{ref}/secure-settings.html#reloadable-secure-settings[reloadable]。重新加载设置后,用于传输快照内容的内部 s3 客户端将使用密钥库中的最新设置。任何现有的 s3 存储库以及任何新创建的存储库都将选取存储在密钥库中的新值。

或者,您可以运行 Kibana Dev Tools 中的以下内容轻松注册 s3 快照存储库。

PUT _snapshot/s3_repository
{
  "type": "s3",
  "settings": {
    "bucket": "<s3-bucket-name>",
    "region": "<region_name>",
    "access_key": "<access_key>",
    "secret_key": "<secret_key>",
    "compress": true
  }
}

看起来这是一个暂时性错误,现在它可以正常工作了。

顺便说一句,还需要在JSON中指定base_path设置:

{
  "type": "s3",
  "settings": { "bucket": "mybucket",  "base_path": "elk"}
}