如何从另一个 AWS 账户中的 Amazon Elasticsearch Service 域恢复数据?

上次更新日期:2021 年 2 月 10 日

我想从另一个 AWS 账户中的 Amazon Elasticsearch Service (Amazon ES) 域恢复数据。我该如何操作?

简短描述

要从另一个 AWS 账户中的 Amazon ES 域恢复数据,您需要在您的域和您尝试从中恢复数据的 Amazon ES 域之间设置跨账户访问权限。您还必须允许您的域访问存储数据的 Amazon Simple Storage Service (Amazon S3) 存储桶。

要创建此跨账户访问权限,请执行以下步骤:

1.    在账户 A 中,设置以下内容:

来源:具有精细访问控制的 Amazon ES 域
来源: Amazon S3 存储桶

2.    在账户 B 中,使用精细访问控制设置目标(Amazon ES 域)。

注意:您无需在目标(账户 B)中创建 Amazon S3 存储桶。单个 Amazon S3 存储桶用于在 AWS 账户间还原数据。此设置也适用于没有精细访问控制的 Amazon ES 域。

解决方法

注意:本文中的示例使用 Python 和 Postman 代码编写。

为账户 A 设置跨账户访问权限

1.    在与 Amazon ES 域处于相同区域的账户 A 中创建 Amazon S3 存储桶。

2.    创建 AWS Identity Access Management (IAM) 策略以提供 Amazon S3 存储桶访问权限:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::snapshot" --> bucket ARN created in step 1.
            ]
        },
        {
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject",
                "iam:PassRole"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::snapshot/*"
            ]
        }
   ]
}

将“arn:aws:s3:::snapshot”替换为您的存储桶 ARN。

3.    创建角色并选择 Amazon Elastic Compute Cloud (Amazon EC2) 作为您的服务。

4.    添加刚刚创建的 IAM 策略。

5.    选择 Trust relationships(信任关系)。

6.    更新以下策略的信任关系:

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

将“Service”:“ec2.amazonaws.com”替换为“Service”:“es.amazonaws.com”。

注意:在后续步骤中,您可以使用角色 ARN。

7.    编辑您创建的策略:

{
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "arn:aws:iam::Account A:role/cross"
        },
        {
            "Effect": "Allow",
            "Action": "es:ESHttpPut",
            "Resource": "arn:aws:es:us-east-1:Account A:domain/srestore/*"
        }

将“arn:aws:iam::Account A:role/cross”替换为您在步骤 3 中创建的角色。此外,使用在账户 A 中列为的 Amazon ES 域更新“arn:aws:es:us-east-1:Account A:domain/srestore/*”。账户 A 中的用于集群快照。

8.    创建 IAM 用户并附加您在步骤 3 中创建的策略。这个 IAM 用户必须具有对账户 A 中的 Amazon ES 域的管理员访问权限,以便使用 FGAC 提供读/写 API 的访问权限。有关使用精细访问控制的更多信息,请参阅将角色映射到用户

9.    (可选)如果您使用 Python 代码将 Amazon S3 存储桶注册到 Amazon ES,请在账户 A 中启动 Amazon EC2 计算机,然后附加在步骤 3 中创建的 IAM 角色。

注意:确保您的安全组可以访问 Amazon ES 域。有关更多信息,请参阅将角色映射到用户

将 Amazon S3 存储桶注册到账户 A 中的源

要将 Amazon S3 存储桶注册到账户 A 中的域,请执行以下步骤:

1.    使用包含 Amazon ES 域终端节点和 S3 存储桶名称的 URL 更新 PUT 字段。例如:

https://endpointofES domain.amazonaws.com/_snapshot/snapshot

2.    选择 Authorization(授权)选项卡。

3.    更新 IAM 用户的 AccessKeySecretKey

4.    更新 AWS Region(AWS 域)和 Service Name(服务名称)。

5.    选择 Save(保存)。

6.    选择 Headers (标头)选项卡。

7.    为密钥类型选择 Content-Type

8.    为密钥值选择 Application/JSON(应用程序/JSON)。

9.    选择 Save(保存)。

10.    选择 Body(正文)选项卡。

11.    请使用以下代码:

{
    "type": "s3",
    "settings" : {
        "bucket" : "snapshot",
        "region" : "us-east-1",
        "role_arn" : "arn:aws:iam::Account A:role/cross"
}

12.    选择 Send(发送)以通过 Amazon ES 控制台提交查询。注册完成后,您会收到 Status Code: 200 OK(状态代码:200 正常)消息。

13.    在账户 A 中登录 Kibana。然后,检查 Amazon S3 存储桶上的可用数据。

14.    使用以下命令拍摄新快照:

PUT /_snapshot/<registered_snapshot_repository>/<snapshot_name>

以下是示例输出:

GET _cat/snapshot/casnapshot
today SUCCESS 1585190280 02:38:00 1585190284 02:38:04 3.9s 4 4 0 4

此输出验证是否完成了对账户 A 中 Amazon ES 域的 Amazon S3 存储桶注册。

为账户 B 设置跨账户访问

1.    在账户 B 中创建策略和 IAM 角色,以指定与账户 A 相同的 Amazon S3 存储桶 ARN:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::snapshot"  --> S3 bucket ARN from Account A
            ]
        },
        {
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject",
                "iam:PassRole"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::snapshot/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "arn:aws:iam::Account B:role/cross"  --> role created in Account B 
        },
        {
            "Effect": "Allow",
            "Action": "es:*",
            "Resource": "arn:aws:es:us-east-1:Account B:domain/restore/*"  --> Destination ES domain in Account B
        }
    ]
}

以下是您的角色的信任策略示例:

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

2.    将您之前创建的 IAM 角色附加到账户 B 中的 IAM 用户。这一 IAM 用户必须对账户 B 中的目标(具有 FGAC 的 Amazon ES 域)具有管理员访问权限。有关更新 IAM 用户访问权限的更多信息,请参阅将角色映射到用户

3.     更新账户 A 中的存储桶的 Amazon S3 存储桶策略,以为账户 B 提供对存储桶的访问权限:

{
    "Version": "2012-10-17",
    "Id": "Policy1568001010746",
    "Statement": [
        {
            "Sid": "Stmt1568000712531",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::Account B:role/cross"  --> Role which is created in Account B 
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::snapshot"
        },
        {
            "Sid": "Stmt1568001007239",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::Account B:role/cross" -->  Role which is created in Account B 
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::snapshot/*"
        }
    ]
}

4.    将 Amazon S3 存储桶注册到您的 Amazon ES 域(在账户 B 中)。

注意:您必须使用账户 B 中的 IAM 用户的身份验证凭证。请确保选择 Amazon ES 作为目标。

{
    "type": "s3",
    "settings" : {
        "bucket" : "snapshot",
        "region" : "us-east-1",
        "role_arn" : "arn:aws:iam::Account B:role/cross" ->  role which is created in Account B.
}

5.    在账户 B 中登录 Kibana。

6.    检查账户 A 中的快照是否在 Amazon S3 存储桶中可用:

GET _cat/snapshots/casnapshot

以下是输出的示例:

today SUCCESS 1585190280 02:38:00 1585190284 02:38:04 3.9s 4 4 0 4

此输出确认跨账户访问权限已在账户 B 中成功设置。