Comment restaurer des données d'un domaine Amazon Elasticsearch Service dans un autre compte AWS ?

Dernière mise à jour : 10/02/2021

Je souhaite restaurer des données d'un domaine Amazon Elasticsearch Service (Amazon ES) dans un autre compte AWS. Comment dois-je procéder ?

Brève description

Pour restaurer des données d'un domaine Amazon ES dans un autre compte AWS, vous devez configurer l'accès entre comptes entre votre domaine et le domaine Amazon ES à partir de lequel vous essayez de restaurer des 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 Amazon ES avec contrôle d'accès précis
Source : compartiment Amazon S3

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

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

Résolution

Remarque : les exemples donnés dans cet article sont écrits en codes Python et Postman.

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

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

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

Remplacez « arn:aws:s3:::snapshot » par votre ARN de compartiment.

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

4.    Ajoutez la stratégie IAM que vous venez de créer.

5.    Choisissez Relations de confiance.

6.    Mettez à jour la relation d'approbation de la stratégie suivante :

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

Remplacez « Service » : « ec2.amazonaws.com » par « Service » : « es.amazonaws.com ».

Remarque : vous utilisez le rôle ARN pour les étapes ultérieures.

7.    Modifiez la stratégie que vous avez créée :

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

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 Amazon ES 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 stratégie que vous avez créée à l'étape 3. Cet utilisateur IAM doit disposer d'un accès administrateur au domaine Amazon ES qui se trouve dans le compte A pour fournir l'accès à l'API de lecture/écriture à l'aide du FGAC. Pour plus d'informations sur l'utilisation du contrôle d'accès précis, consultez Mappage de rôles aux utilisateurs.

9.    (Facultatif) Si vous utilisez du code Python pour enregistrer le compartiment Amazon S3 auprès d'Amazon ES, 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 Amazon ES. Pour plus d'informations, consultez Mappage de rôles aux utilisateurs.

Enregistrement du compartiment Amazon S3 dans la source dans le compte A

Pour enregistrer le compartiment Amazon 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 Amazon ES et le nom du compartiment S3. Par exemple :

https://endpointofES domain.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.    Choisissez 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.    Choisissez 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 soumettre la requête via la console Amazon ES. Une fois l'enregistrement terminé, vous recevez un message Code d'état : 200 OK.

13.    Connectez-vous à Kibana dans le compte A. Ensuite, vérifiez les données disponibles sur le compartiment Amazon S3.

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 l'achèvement de l'enregistrement du compartiment Amazon S3 sur le domaine Amazon ES dans le compte A.

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

1.    Créez une stratégie et un rôle IAM dans le compte B, en spécifiant le même ARN de compartiment Amazon S3 que 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 stratégie 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 Amazon ES avec FGAC) dans le compte B. Pour plus d'informations sur la mise à jour de l'accès utilisateur IAM, consultez Mappage de rôles aux utilisateurs.

3.     Mettez à jour la politique de compartiment Amazon 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 Amazon S3 sur votre domaine Amazon ES (dans le compte B).

Remarque : vous devez utiliser les informations d'authentification de l'utilisateur IAM dans le compte B. Assurez-vous de choisir Amazon ES 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 à Kibana dans le compte B.

6.    Vérifiez les instantanés du compte A qui sont disponibles dans le compartiment Amazon 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.