将 AWS ElasticSearch 与 S3 结合使用的角色问题

问题描述 投票:0回答:3

我在 AWS 云中有一个 ElasticSearch 实例,运行良好。但我需要用S3来设置它来存储快照。

首先,我需要通过将以下内容发布到端点(模拟 json 示例)来设置 S3 存储库:

PUT _snapshot/my_s3_repository
{
   "type": "s3",
   "settings": {
      "bucket": "my_bucket_name",
      "region": "us-west"
    }
}

但作为回报我得到以下:

"Message": "settings.role_arn is needed for snapshot registration."

有什么想法吗?我尝试过修改 IAM 中的角色,但没有成功。

java json amazon-web-services elasticsearch amazon-s3
3个回答
7
投票

将 AWS 论坛帖子中的内容复制到此处,以防论坛消失:


快照 S3 存储库的注册过程需要角色和签名的请求。

要创建签名请求来注册 S3 端点,您可以使用 python 脚本。请参阅下面的示例。

所有此过程如下所述: http://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-managementomains.html 但是,总而言之,您可以按照以下步骤操作:

1) 创建 IAM 策略并将其添加到角色:

示例角色如下所示:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "es.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
} 

像这样的示例策略应附加到之前的角色:

{
    "Version":"2012-10-17",
    "Statement":[
        {
            "Action":[
                "s3:ListBucket"
            ],
            "Effect":"Allow",
            "Resource":[
                "arn:aws:s3:::es-index-backups"
            ]
        },
        {
            "Action":[
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject",
                "iam:PassRole"
            ],
            "Effect":"Allow",
            "Resource":[
                "arn:aws:s3:::es-index-backups/*"
            ]
        }
    ]
} 

2) 注册快照目录

作为有权访问新角色的 IAM 用户,您必须先向 Amazon Elasticsearch Service 注册快照目录,然后再拍摄手动索引快照。此一次性操作要求您使用向 Amazon ES 授予权限的 IAM 角色签署您的 AWS 请求。

保存以下示例Python代码并修改以下值: 区域:您创建快照存储库的 AWS 区域 终端节点:您的 Amazon ES 域的终端节点 aws_access_key_id:IAM 凭证 aws_secret_access_key:IAM 凭证 path:快照存储库的位置

注意:Python 客户端要求将 boto 包安装在您将注册快照存储库的计算机上。 从 boto.connection 导入 AWSAuthConnection

class ESConnection(AWSAuthConnection):

    def __init__(self, region, **kwargs):
        super(ESConnection, self).__init__(**kwargs)
        self._set_auth_region_name(region)
        self._set_auth_service_name("es")

    def _required_auth_capability(self):
        return ['hmac-v4']

if __name__ == "__main__":

    client = ESConnection(
            region='us-east-1',
            host='search-weblogs-etrt4mbbu254nsfupy6oiytuz4.us-east-1.es.a9.com',
            aws_access_key_id='my-access-key-id',
            aws_secret_access_key='my-access-key', is_secure=False)

    print 'Registering Snapshot Repository'
    resp = client.make_request(method='PUT',
            path='/_snapshot/weblogs-index-backups',
            data='{"type": "s3","settings": { "bucket": "es-index-backups","region": "us-east-1","role_arn": "arn:aws:iam::123456789012:role/MyElasticsearchRole"}}')
    body = resp.read()
    print body

注册S3存储库后,您将能够使用curl手动拍摄和恢复快照。例如:

手动拍摄快照:

curl -XPUT 'http://<Elasticsearch_domain_endpoint>/_snapshot/snapshot_repository/snapshot_name'

手动恢复快照:

curl -XPOST 'http://search-weblogs-abcdefghijklmnojiu.us-east-1.a9.com/_snapshot/weblogs-index-backups/snapshot_1/_restore'

注意:您无法将索引快照恢复到已包含同名索引的 Amazon ES 集群。目前,Amazon ES 不支持 Elasticsearch _close API,因此您必须使用以下替代方案之一: 删除同一 Amazon ES 域上的索引,然后恢复快照 将快照恢复到不同的 Amazon ES 域


1
投票

我在使用 RestHighLevelClient 时介入了这个问题,因为它发送空的 settings json。

这有效:

curl --location --request PUT 'http://amazon_url/_snapshot/manual-snapshots/test1?master_timeout=1m&wait_for_completion=false' \
--header 'Content-Type: application/json' \
--data-raw '{
  "indices": "test-v1",
  "ignore_unavailable": false
}
'

这不起作用:

curl --location --request PUT 'http://amazon_url/_snapshot/manual-snapshots/test1?master_timeout=1m&wait_for_completion=false' \
--header 'Content-Type: application/json' \
--data-raw '{
  "indices": "test-v1",
  "ignore_unavailable": false,
  "include_global_state": false,
  "settings" : {
  }
}
'

错误:

{
    "Message": "settings.role_arn is needed for snapshot registration."
}

解决方案是延长

CreateSnapshotRequest

public class AmazonCreateSnapshotRequest extends CreateSnapshotRequest {
    @Override
    public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
        // When request send with empty settings Amazon throw error:
        // settings.role_arn is needed for snapshot registration.
        // So we set settings to null to make sure that we not send empty settings
        if (settings() == EMPTY_SETTINGS) {
            settings((Settings) null);
        }
        return super.toXContent(builder, params);
    }
}

0
投票

以上答案适用于Elasticsearch。

请遵循此 Opensearch 文档:

https://docs.aws.amazon.com/opensearch-service/latest/developerguide/managedomains-snapshot-registerdirectory.html

© www.soinside.com 2019 - 2024. All rights reserved.