[PYTHON] Jusqu'à ce que vous obteniez un instantané du service Amazon Elasticsearch et que vous le restauriez

Lorsque j'ai pris un instantané d'Amazon Elasticsearch Service (ci-après dénommé es), je me suis retrouvé coincé autour de l'autorité, je vais donc le résumer. L'environnement d'utilisation est Mac.

【Contexte】

――Comment pouvez-vous prendre manuellement un instantané de es? ――Cela semble un peu compliqué autour de l'autorité, alors touchons-le une fois ―― Mesurons le temps qu'il faudra pour obtenir et restaurer

J'ai commencé à bouger mes mains avec un tel sens du défi.

[Ce que j'ai réellement fait]

-Voir Document officiel -Se reporter à [Amazon Elasticsearch Service] Comment restaurer à partir d'un instantané manuel (cet article) J'ai vraiment fait référence) --Donner des autorisations dans Kibana

Je l'ai fait par une telle procédure! !! !!

Prendre manuellement des instantanés sur S3

Afin de créer un instantané manuellement, les mesures suivantes sont requises comme condition préalable.

--Créer un seau pour s3 --Organiser les rôles et les politiques IAM (← J'ai eu du mal ici)

Le script écrit cette fois est écrit en python, mais il peut aussi être écrit en Java, Ruby, Node, Go. Veuillez vous référer à ce Document officiel

Ensuite, je voudrais expliquer dans l'ordre.

Créer un compartiment S3

Créez manuellement un bucket pour stocker les instantanés. Cette fois, j'ai créé `` arn: aws: s3 ::: test-es-snapshot '' dans la console S3. Ceci est nécessaire aux deux endroits suivants

--Dans la déclaration de ressources de la stratégie IAM attachée au rôle IAM --Dans la charge utile python utilisée pour l'enregistrement du référentiel d'instantanés

Organiser les rôles et les stratégies IAM

Il y a trois endroits à vérifier cette fois

1. Créez un rôle de service ES (arn: aws: iam :: username: role / es_s3_role).

Modifiez la relation d'approbation comme suit Ce que le directeur précise est «qui assumera ce rôle» Le service suivant indique es, ce qui signifie "le rôle de service créé prend es" (je pense)

Décrit dans la relation de confiance du rôle de service


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

2. Joindre une stratégie d'accès à S3 et de récupération de données au rôle de service

Créez une politique de gestion appelée create-es-backup-policy avec le contenu suivant et attachez-la au rôle de service créé ci-dessus.

create-es-backup-policy(Attacher au rôle de service créé)


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

3. Autoriser l'accès pour les rôles IAM côté Kibana

Dans Kibana, sélectionnez ** Sécurité **, ** Mappages de rôles **, ** Ajouter **. Pour ** Rôle **, sélectionnez ** manage_snapshots **. Spécifiez ensuite l'ARN de l'utilisateur IAM ou du rôle IAM dans le champ approprié. Saisissez l'ARN de l'utilisateur dans la section ** [Utilisateurs] **. Saisissez l'ARN du rôle dans la section ** [Rôles backend] *. ( Cela permet aux informations de rôle d'utiliser des instantanés) Cette fois, j'ai entré les informations ARN du rôle de service créé à l'endroit appelé Rôles backend sur la page intitulée Mappages de rôles de Kibana. (Je devrais être en mesure de définir les informations d'identification en exécutant la stratégie IAM, mais je suis resté coincé avec une erreur, donc je l'ai évité avec cette méthode)

C'est la fin de l'organisation autour du rouleau IAM.

Enregistrer un référentiel d'instantanés manuel

Exécutez le script python suivant (dans le matériel de référence, l'authentification a été effectuée avec la clé d'accès, mais actuellement officiellement, l'authentification avec la clé d'accès n'est pas recommandée)

register-repositry.py


import boto3
import requests
from requests_aws4auth import AWS4Auth

region = 'Nom de la région' # e.g. us-west-1
service = 'es'
credentials = boto3.Session().get_credentials()
awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token)
host = 'point de terminaison de domaine es/' # /N'oublie pas

# Register repository
path = '_snapshot/test-es-snapshot' # the Elasticsearch API endpoint
url = host + path
payload = {
  "type": "s3",
  "settings": {
    "bucket": "Nom du godet",
    "region": "Nom de la région",
    "role_arn": "Nom du rôle de service créé"
  }
}

headers = {"Content-Type": "application/json"}

r = requests.put(url, auth=awsauth, json=payload, headers=headers)

print(r.status_code)
print(r.text)

Confirmez que la réponse est la suivante

200
{"acknowledged":true}

Prendre un instantané manuel

snapshot.py


import boto3
import requests
from requests_aws4auth import AWS4Auth

region = 'Nom de la région' # e.g. us-west-1
service = 'es'
credentials = boto3.Session().get_credentials()
awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token)
host = 'point de terminaison de domaine es/' # /N'oublie pas

path = '_snapshot/test-es-snapshot/my-snapshot-1' # the Elasticsearch API endpoint
url = host + path

r = requests.put(url, auth=awsauth)

print(r.text)

Exemple d'exécution


-> % python snapshot.py
Enter MFA code for :
{"accepted":true}

Vérifiez le référentiel à partir duquel l'instantané a été pris

check_repository.py


import boto3
import requests
from requests_aws4auth import AWS4Auth

region = 'Nom de la région' # e.g. us-west-1
service = 'es'
credentials = boto3.Session().get_credentials()
awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token)
host = 'point de terminaison de domaine es/' # /N'oublie pas

path = '_snapshot/?pretty'
url = host + path

r = requests.get(url, auth=awsauth)

print(r.text)

Exemple d'exécution


-> % python check_repository.py
Enter MFA code for :
{
  "cs-automated-enc" : {
    "type" : "s3"
  },
  "test-es-snapshot" : {
    "type" : "s3",
    "settings" : {
      "bucket" : "test-es-snapshot",
      "region" : "Nom de la région",
      "role_arn" : "Nom du rôle de service créé"
    }
  }
}

Vérifiez l'état d'acquisition de l'instantané

check_snapshot.py


import boto3
import requests
from requests_aws4auth import AWS4Auth

region = 'Nom de la région' # e.g. us-west-1
service = 'es'
credentials = boto3.Session().get_credentials()
awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token)
host = 'point de terminaison de domaine es/' # /N'oublie pas

path = '_snapshot/test-es-snapshot/_all?pretty'
url = host + path

r = requests.get(url, auth=awsauth)

print(r.text)

Exemple d'exécution


-> % python check_snapshot.py
Enter MFA code for :
{
  "snapshots" : [ {
    "snapshot" : "my-snapshot-1",
    "uuid" : "*************",
    "version_id" : ******,
    "version" : "7.8.0",
    "indices" : [ "nom d'index ①", "nom d'index ②",・ ・ ・ ・ ・ ・],
    "include_global_state" : true,
    "state" : "SUCCESS",
    "start_time" : "2020-11-17T07:20:17.265Z",
    "start_time_in_millis" : 1605597617265,
    "end_time" : "2020-11-17T07:21:21.901Z",
    "end_time_in_millis" : 1605597681901,
    "duration_in_millis" : 64636,
    "failures" : [ ],
    "shards" : {
      "total" : 38,
      "failed" : 0,
      "successful" : 38
    }
  } ]
}

Restaurer l'instantané

S'il existe un index portant le même nom au moment de la restauration, il ne peut pas être restauré, vous devez donc supprimer l'index que vous souhaitez restaurer une fois. La procédure pour supprimer une fois l'index spécifié et le restaurer est indiquée ci-dessous.

Supprimer l'index une fois

delete_index.py


import boto3
import requests
from requests_aws4auth import AWS4Auth

region = 'Nom de la région' # e.g. us-west-1
service = 'es'
credentials = boto3.Session().get_credentials()
awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token)
host = 'point de terminaison de domaine es/' # /N'oublie pas

# DELETE INDEX
path = 'Nom de l'index'
url = host + path

r = requests.delete(url, auth=awsauth)

print(r.text)

Exemple d'exécution


-> % python delete_index.py
Enter MFA code for :
{"acknowledged":true}

Dans la console es, sélectionnez le domaine et accédez à l'onglet Index pour voir que l'index a été supprimé. Vous pouvez également voir sur le tableau de bord que moins de documents peuvent être recherchés.

Restaurer l'index spécifié

restore_one.py


import boto3
import requests
from requests_aws4auth import AWS4Auth

region = 'Nom de la région' # e.g. us-west-1
service = 'es'
credentials = boto3.Session().get_credentials()
awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token)
host = 'point de terminaison de domaine es/' # /N'oublie pas

path = '_snapshot/test-es-snapshot/my-snapshot-1/_restore'
url = host + path
payload = {"indices": "Nom de l'index"}
headers = {"Content-Type": "application/json"}

r = requests.post(url, auth=awsauth, json=payload, headers=headers)

print(r.text)

Exemple d'exécution


-> % python restore_one.py
Enter MFA code for :
{"accepted":true}

Sommaire

Le matériel de référence était très utile pour obtenir et restaurer des instantanés. (Presque la même.) J'ai eu beaucoup de mal à organiser les rôles et les stratégies IAM. .. .. C'était difficile si je ne pouvais pas déterminer quelle politique était attachée à quel rôle. ..

J'espère que cela sera utile à n'importe qui. ..

Recommended Posts

Jusqu'à ce que vous obteniez un instantané du service Amazon Elasticsearch et que vous le restauriez
Jusqu'à ce que vous obteniez des données quotidiennes pour plusieurs années de stock japonais et que vous les sauvegardiez dans un seul CSV (Python)
Déploiement groupé avec CFn pour prendre des instantanés manuels d'Elastic Search Service avec Lambda
En étudiant JQuery et Python jusqu'à la publication d'un service Web sur GCP
Si vous définissez une méthode dans une classe Ruby, puis définissez une méthode dans celle-ci, elle devient une méthode de la classe d'origine.
Jusqu'à ce que vous créiez un environnement d'apprentissage automatique avec Python sur Windows 7 et que vous l'exécutiez
Récupérer une image d'une page Web et la redimensionner
Obtenez la page Web Python, encodez et affichez les caractères
Obtenez une adresse IP globale et exportez-la vers des feuilles de calcul Google
Envoyer une demande d'AWS Lambda à Amazon Elasticsearch Service
Il est étonnamment difficile d'obtenir une liste de la dernière date et heure de connexion des espaces de travail
Qu'est-ce qu'un chien? Volume de requêtes GET et paramètres de requête
Examinez s'il s'agit d'un PDF et du traitement des exceptions Jusqu'à ce que vous créiez votre propre traitement des exceptions
Obtenez une liste des paramètres de caméra qui peuvent être définis avec cv2.VideoCapture et faites-en un type de dictionnaire