別の AWS アカウントの Amazon OpenSearch Service ドメインからデータを復元するにはどうすればよいですか?

最終更新日: 2022 年 2 月 24 日

別の AWS アカウントの Amazon OpenSearch Service ドメインからデータを復元したいと考えています。これを行うにはどうすればよいですか?

簡単な説明

別の AWS アカウントの OpenSearch Service ドメインからデータを復元するには、クロスアカウントアクセスを設定する必要があります。クロスアカウントアクセスは、OpenSearch Service ドメインとデータの復元元のドメインとの間で確立する必要があります。また、データを保存する Amazon Simple Storage Service (Amazon S3) バケットへのアクセスをドメインに許可する必要があります。

このクロスアカウントアクセスを作成するには、次の手順を実行します。

1.    アカウント A で、次の設定を行います。
Source (ソース):きめ細かなアクセスコントロールを備えた OpenSearch Service ドメイン
Source (ソース): Amazon S3 バケット

2.    アカウント B で、きめ細かなアクセスコントロールで移行先 (OpenSearch Service ドメイン) を設定します。

注: 移行先 (アカウント B) に S3 バケットを作成する必要はありません。AWS アカウント全体でデータを復元するために、1 つの S3 バケットを使用します。この設定は、きめ細かなアクセスコントロールなしで OpenSearch Service ドメインでも機能します。

解決方法

注: この記事の例は、Python と Postman コードを使用しています。

アカウント A のクロスアカウントアクセスを設定する

1.    OpenSearch Service ドメインと同じリージョンのアカウント 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/*"
      ]
    }
  ]
}

注: "arn:aws:s3:::snapshot" をステップ 1 のバケット ARN に置き換えます。

3.    IAM ロールを作成し、Amazon Elastic Compute Cloud (Amazon EC2) をお使いのサービスとして選択します。

4.    新しく作成した IAM ロールに (ステップ 2 で作成した) IAM ポリシーを追加します。

5.    IAM ロールを開き、[信頼関係] を選択します。

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.    次のオプションのいずれかを選択します。
(ステップ 2 の) ポリシーを更新して、IAM ロールにポリシーを添付する「IAM: PassRole」アクセス許可を含めます。このアクセス許可により、OpenSearch サービスに S3 バケットへの書き込みアクセスが付与されます。

- または -

新しい IAM ポリシーを作成し、ポリシーを IAM ロールに添付します。

注: ポリシーを更新することで、1 つの 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 ユーザーは、FGAC を使用して読み取り/書き込み API へのアクセスを提供するために、アカウント A にある OpenSearch Service ドメインへの管理者アクセスが必要です。きめ細かなアクセスコントロールの使用の詳細については、「OpenSearch Dashboards でスナップショットロールをマッピングする (きめ細かなアクセスコントロールを使用している場合)」を参照してください。

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

注: セキュリティグループが OpenSearch Service ドメインにアクセスできることを確認してください。

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

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

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

https://endpointofdomain.amazonaws.com/_snapshot/snapshot

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

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

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

5.    [Save] を選択します。

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

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

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

9.    [Save] を選択します。

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

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

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

12.    [Send] (送信) を選択して OpenSearch Service コンソールからクエリを送信します。登録が完了すると、ステータスコード: 200 OK というメッセージを受け取ります。

13.    アカウント A で OpenSearch Dashboards にログインしてから、S3 バケットで利用できるデータを確認します。

注: OpenSearch Dashboards は Kibana の後継サービスです。

14.    次のコマンドを使用して、新しいスナップショットを作成します。

PUT /_snapshot/<registered_snapshot_repository>/<snapshot_name>

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

GET _cat/snapshots/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 を持つドメイン) への管理者アクセス権がある必要があります。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 Dashboards にログインします。

6.    S3 バケットで利用できるアカウント A のスナップショットをチェックします。

GET _cat/snapshots/casnapshot

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

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

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

Amazon OpenSearch Service は、Amazon Elasticsearch Service の後継サービスです。