Comment puis-je restaurer les données d'un domaine Amazon OpenSearch Service dans un autre compte AWS ?

Date de la dernière mise à jour : 06/08/2021

Je souhaite restaurer les données d'un domaine Amazon OpenSearch Service (successeur d'Amazon Elasticsearch Service) dans un autre compte AWS. Comment puis-je procéder ?

Brève description

Pour restaurer les données d'un domaine OpenSearch Service dans un autre compte AWS, vous devez configurer l'accès entre comptes. L'accès entre comptes doit être établi entre votre domaine OpenSearch Service et le domaine depuis lequel vous tentez de restaurer les données. Vous devez également autoriser votre domaine à accéder au compartiment Amazon Simple Storage Service (Amazon S3) dans lequel vos données sont stockées.

Pour créer cet accès entre comptes, effectuez les opérations suivantes :

1.    Dans le compte A, configurez les éléments suivants :
Source : domaine OpenSearch Service avec contrôle d'accès précis
Source : compartiment Amazon S3

2.    Dans le compte B, configurez votre destination (domaine OpenSearch Service) avec un contrôle d'accès précis.

Remarque : vous n'avez pas besoin de créer un compartiment S3 dans la destination (compte B). Un compartiment S3 unique est utilisé pour restaurer les données sur les comptes AWS. Cette configuration fonctionne également pour les domaines OpenSearch Service sans contrôle d'accès précis.

Résolution

Remarque : les exemples donnés dans cet article utilisent le code Python et Postman.

Configurer l'accès entre comptes pour le compte A

1.    Créez un compartiment S3 dans le compte A dans la même région que le domaine OpenSearch Service.

2.    Créez une politique AWS Identity Access Management (IAM) pour fournir des autorisations d'accès au compartiment 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/*"
            ]
        }
   ]
}

Remarque : remplacez « arn:aws:s3:::snapshot » par votre ARN de compartiment de l'étape 1.

3.    Créez un rôle IAM et sélectionnez Amazon Elastic Compute Cloud (Amazon EC2) comme service.

4.    Ajoutez la politique IAM (créée à l'étape 2) à votre rôle IAM nouvellement créé.

5.    Ouvrez votre rôle IAM et choisissez Relations d'approbation.

6.    Mettez à jour la relation d'approbation de la politique suivante :

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

Remarque : remplacez "Service": "ec2.amazonaws.com" par "Service": "es.amazonaws.com". Enregistrez également l'ARN du rôle dont vous aurez besoin pour les étapes ultérieures.

7.    Choisissez l'une des options suivantes :
Modifiez la politique (de l'étape 2) pour inclure les autorisations « iam:PassRole », en rattachant la politique à votre rôle IAM.
-ou-
Créez une nouvelle politique IAM, en la rattachant à votre rôle IAM.

Remarque : vous pouvez avoir toutes vos autorisations définies sous un seul rôle IAM en modifiant la politique. Ou, si vous souhaitez créer une nouvelle politique IAM et répartir les autorisations, vous pouvez réutiliser la politique IAM pour un autre cas d'utilisation.

Voici un exemple de politique avec les autorisations IAM requises :

{
    "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/*"
    }
  ]
}

Cette politique doit être attachée à l'utilisateur ou au rôle IAM qui est utilisé pour signer la requête HTTP.

Remarque : remplacez « arn:aws:iam::Account A:role/cross » par le rôle que vous avez créé à l'étape 3. De plus, mettez à jour « ARN:AWS:ES:US-EAST-1:Account A:Domain/srestore/* » avec le domaine OpenSearch Service répertorié comme source dans le compte A. La source du compte A est utilisée pour les instantanés de cluster.

8.    Créez un utilisateur IAM et attachez la politique que vous avez créée à l'étape 2 (qui inclut les autorisations requises pour accéder à Amazon S3). Cet utilisateur IAM doit disposer d'un accès administrateur au domaine OpenSearch Service dans le compte A pour fournir l'accès à l'API en lecture/écriture à l'aide du FGAC. Pour plus d'informations sur l'utilisation d'un contrôle d'accès précis, consultez Mapper le rôle d'instantané dans les tableaux de bord OpenSearch (si vous utilisez un contrôle d'accès précis).

9.    (Facultatif) Si vous utilisez du code Python pour enregistrer le compartiment S3 sur OpenSearch Service, lancez une machine Amazon EC2 dans le compte A. Ensuite, attachez le rôle IAM créé à l'étape 3.

Remarque : assurez-vous que votre groupe de sécurité peut accéder au domaine OpenSearch Service.

Enregistrez le compartiment S3 à la source dans le compte A

Pour enregistrer le compartiment S3 dans le domaine source dans le compte A, effectuez les opérations suivantes :

1.    Mettez à jour le champ PUT avec une URL qui inclut le point de terminaison du domaine OpenSearch Servie et le nom du compartiment S3. Par exemple :

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

2.    Cliquez sur l'onglet Autorisation.

3.    Mettez à jour AccessKey et SecretKey de l'utilisateur IAM.

4.    Mettez à jour la région AWS et Nom du service.

5.    Sélectionnez Save (Enregistrer).

6.    Choisissez l'onglet En-têtes.

7.    Sélectionnez Content-Type pour votre type de clé.

8.    Sélectionnez Application/JSON pour la valeur de votre clé.

9.    Sélectionnez Save (Enregistrer).

10.    Cliquez sur l'onglet Corps.

11.    Utilisez le code suivant :

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

12.    Choisissez Envoyer pour envoyer la requête à l'aide de la console OpenSearch Service. Une fois l'enregistrement terminé, vous recevrez un message Code de statut : 200 OK.

13.    Connectez-vous aux tableaux de bord OpenSearch dans le compte A. Ensuite, vérifiez les données disponibles sur le compartiment S3.

Remarque : les tableaux de bord OpenSearch succèdent à Kibana.

14.    Utilisez la commande suivante pour prendre un nouvel instantané :

PUT /_snapshot/<registered_snapshot_repository>/<snapshot_name>

Voici un exemple de sortie :

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

Cette sortie vérifie la fin de l'enregistrement du compartiment S3 dans le domaine OpenSearch Service dans le compte A.

Configurer l'accès entre comptes pour le compte B

1.    Créez une politique et un rôle IAM dans le compte B, en spécifiant le même ARN de compartiment S3 que le compte A :

{
    "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
        }
    ]
}

Voici un exemple de politique d'approbation pour votre rôle :

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

2.    Attachez le rôle IAM que vous avez précédemment créé à l'utilisateur IAM dans le compte B. Le même utilisateur IAM doit disposer d'un accès administrateur à la destination (domaine avec FGAC) dans le compte B. Pour plus d'informations sur la mise à jour de l'accès utilisateur IAM, consultez Enregistrement d'un référentiel d'instantanés manuels.

3.     Mettez à jour la politique de compartiment S3 pour votre compartiment dans le compte A, en fournissant un accès au compte B à votre compartiment :

{
    "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.    Enregistrez le compartiment S3 dans votre domaine (dans le compte B).

Remarque : vous devez utiliser les informations d'identification d'authentification de l'utilisateur IAM dans le compte B. Assurez-vous de choisir OpenSearch Service comme destination.

{
    "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.    Connectez-vous aux tableaux de bord OpenSearch dans le compte B.

6.    Vérifiez les instantanés du compte A qui sont disponibles dans le compartiment S3 :

GET _cat/snapshots/casnapshot

Voici un exemple de la sortie :

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

Cette sortie confirme que l'accès entre comptes est correctement configuré dans le compte B.