使用AWS ElasticSearch和S3的角色问题

Gei*_*eir 8 java json amazon-s3 amazon-web-services elasticsearch

我在AWS云中有一个ElasticSearch实例,工作正常.但是我需要用S3来设置它来存储快照.

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

PUT _snapshot/my_s3_repository
{
   "type": "s3",
   "settings": {
      "bucket": "my_bucket_name",
      "region": "us-west"
    }
}
Run Code Online (Sandbox Code Playgroud)

但作为回报,我得到以下内容:
"Message": "settings.role_arn is needed for snapshot registration."

有任何想法吗?我试过在IAM中乱搞角色而没有运气.

Dou*_*oug 6

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


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

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

所有这些过程都在这里描述:http : //docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-managedomains.html 但是,总而言之,您可以按照以下步骤操作:

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

示例角色如下所示:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "es.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
} 
Run Code Online (Sandbox Code Playgroud)

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

{
    "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/*"
            ]
        }
    ]
} 
Run Code Online (Sandbox Code Playgroud)

2) 注册快照目录

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

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

注意: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
Run Code Online (Sandbox Code Playgroud)

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

要手动拍摄快照:

curl -XPUT 'http://<Elasticsearch_domain_endpoint>/_snapshot/snapshot_repository/snapshot_name'
Run Code Online (Sandbox Code Playgroud)

要手动恢复快照:

curl -XPOST 'http://search-weblogs-abcdefghijklmnojiu.us-east-1.a9.com/_snapshot/weblogs-index-backups/snapshot_1/_restore'
Run Code Online (Sandbox Code Playgroud)

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