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

上次更新日期:2021 年 8 月 6 日

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

简短描述

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

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

1.    在账户 A 中,设置以下内容:
来源:具有精细访问控制的 OpenSearch Service 域
来源: Amazon S3 存储桶

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

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

解决方法

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

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

1.    在与 OpenSearch Service 域处于相同 Region(区域)的账户 A 中创建 S3 存储桶。

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

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

注意:将第 1 步中的“arn:aws:s3:::snapshot”替换为您的存储桶 ARN。

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

4.    将 IAM 策略(在第 2 步中创建)添加到新创建的 IAM 角色。

5.    打开你的 IAM 角色,然后选择 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,后续步骤将需要该角色 ARN。

7.    选择以下选项之一:
更新(来自第 2 步的)策略以包含 "iam:PassRole" 权限,并将策略附上您的 IAM 角色。
-或者-
创建一个新 IAM 策略,并将该策略附上您的 IAM 角色。

注意:通过更新策略,您可以将所有权限设置在一个 IAM 角色下。或者,如果您想创建新 IAM 策略并拆分权限,则可以将 IAM 策略重复用于另一个使用案例。

下面是具有所需 IAM 权限的示例策略:

{
    "Version": "2012-10-17",
    "Statement": [
    {
        "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/*"
    }
  ]
}

此策略必须附上正在用于签署 HTTP 请求的 IAM 用户或角色。

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

8.    创建 IAM 用户并附加您在第 2 步中创建的策略(其中包括访问 Amazon S3 所需的权限)。这个 IAM 用户必须拥有对账户 A 中的 OpenSearch Service 域的 Admin(管理员)访问权限,以便使用 FGAC 提供读/写 API 的访问权限。有关使用精细访问控制的详细信息,请参阅在 OpenSearch 控制面板中映射快照角色(如果使用精细访问控制)

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

注意:确保您的安全组可以访问 OpenSearch Service 域。

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

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

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

https://endpointofdomain.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(发送)以通过 OpenSearch Service 控制台提交查询。注册完成后,您将收到 Status Code: 200 OK(状态代码:200 正常)消息。

13.    在账户 A 中登录 OpenSearch 控制面板。然后,检查 S3 存储桶上的可用数据。

注意:OpenSearch 控制面板是 Kibana 的后继者。

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 中 OpenSearch Service 域的 S3 存储桶注册。

为账户 B 设置跨账户访问

1.    在账户 B 中创建策略和 IAM 角色,以指定与账户 A 相同的 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 中的 Destination(目标)(具有 FGAC 的域)具有 administrator(管理员)访问权限。有关更新 IAM 用户访问权限的更多信息,请参阅注册手动快照存储库

3.     更新账户 A 中的存储桶的 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.    将 S3 存储桶注册到您的域(在账户 B 中)。

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

{
    "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 中的 OpenSearch 控制面板。

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

GET _cat/snapshots/casnapshot

以下是输出的示例:

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

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