別の 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 バケットを作成する必要はありません。AWS アカウント全体でデータを復元するために、1 つの Amazon S3 バケットを使用します。この設定は、きめ細かなアクセスコントロールなしで 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.    [信頼関係 ] を選択します。

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 で作成したロールに置き換えます。また、"arn:aws:es:us-east-1:Account A:domain/srestore/*" を更新し、をアカウント A のソースとして一覧表示されている Amazon ES ドメインと置き換えます。アカウント A のソースは、クラスタースナップショットに使用します。

8.    IAM ユーザーを作成し、ステップ 3 で作成したポリシーをアタッチします。この同じ IAM ユーザーは、FGAC を使用して読み取り/書き込み API へのアクセスを提供するために、アカウント A にある Amazon ES ドメインへの管理者アクセス権が必要です。きめ細かなアクセスコントロールの使用の詳細については、「ユーザーへのロールのマッピング」を参照してください。

9.    (オプション) Python コードを使用して Amazon S3 バケットを Amazon ES に登録する場合は、アカウント A で Amazon EC2 マシンを起動してから、ステップ 3 で作成した IAM ロールをアタッチします。

注: セキュリティグループが Amazon ES ドメインにアクセスできることを確認してください。詳細については、「ユーザーへのロールのマッピング」を参照してください。

アカウント A のソースへ Amazon S3 バケットを登録する

アカウント A のソースドメインに Amazon S3 バケットを登録するには、次の手順を実行します。

1.    Amazon ES ドメインエンドポイントと S3 バケット名を含む URL で [PUT] フィールドを更新します。例:

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

2.    [認証] タブを選択します。

3.    IAM ユーザーのアクセスキーSecretKey を更新します。

4.    AWS リージョンサービス名を更新します。

5.    [保存] を選択します。

6.    [ヘッダー] タブを選択します。

7.    キータイプとして [Content-Type] を選択します。

8.    キー値として [アプリケーション/JSON] を選択します。

9.    [保存] を選択します。

10.    [ボディ] タブを選択します。

11.    以下のコードを使用します。

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

12.    Amazon ES コンソールからクエリを送信するには、[送信] を選択します。登録が完了すると、「Status Code: 200 OK」というメッセージを受け取ります。

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 バケットを (アカウント B の) Amazon ES ドメイン に登録します。

注: アカウント 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.    Amazon S3 バケットで利用できるアカウント A のスナップショットをチェックします。

GET _cat/snapshots/casnapshot

出力の例を次に示します。

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

この出力により、アカウント B でクロスアカウントアクセスが正常に設定されたことが確認できます。