[PYTHON] Bis Sie einen Schnappschuss des Amazon Elasticsearch-Dienstes erhalten und wiederherstellen

Als ich einen Schnappschuss von Amazon Elasticsearch Service (im Folgenden als es bezeichnet) gemacht habe, bin ich bei der Behörde hängen geblieben, daher werde ich ihn zusammenfassen. Die Nutzungsumgebung ist Mac.

【Hintergrund】

――Wie können Sie manuell einen Schnappschuss von es machen? ――Die Behörde scheint etwas kompliziert zu sein, also lasst es uns einmal anfassen ――Messen wir, wie lange es dauern wird, bis das Gerät abgerufen und wiederhergestellt ist

Ich begann meine Hände mit einem solchen Gefühl der Herausforderung zu bewegen.

[Was ich tatsächlich getan habe]

Ich habe es durch ein solches Verfahren möglich gemacht! !! !!

Machen Sie manuell Schnappschüsse zu S3

Um einen Schnappschuss manuell zu erstellen, sind folgende Maßnahmen erforderlich.

--Erstellen eines Eimers für s3

Das diesmal geschriebene Skript ist in Python geschrieben, kann aber auch in Java, Ruby, Node, Go geschrieben werden. Weitere Informationen finden Sie in diesem offiziellen Dokument.

Dann möchte ich in der Reihenfolge erklären.

Erstellen eines S3-Buckets

Erstellen Sie manuell einen Bucket zum Speichern von Schnappschüssen. Dieses Mal habe ich `` `arn: aws: s3 ::: test-es-snapshot``` in der S3-Konsole erstellt. Dies ist an den folgenden beiden Stellen erforderlich

Organisieren Sie IAM-Rollen und -Richtlinien

Es gibt drei Orte, an denen Sie diese Zeit überprüfen können

1. Erstellen Sie eine ES-Servicerolle (arn: aws: iam :: username: role / es_s3_role).

Bearbeiten Sie die Vertrauensstellung wie folgt Der Auftraggeber gibt an, "wer diese Rolle übernehmen wird". Der folgende Service gibt es an, was bedeutet, dass "die erstellte Servicerolle es übernimmt" (glaube ich).

Beschrieben in der Vertrauensbeziehung der Servicerolle


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

2. Fügen Sie der Servicerolle eine Richtlinie für den Zugriff auf S3 und das Abrufen von Daten hinzu

Erstellen Sie eine Verwaltungsrichtlinie mit dem Namen create-es-backup-policy mit den folgenden Inhalten und hängen Sie sie an die oben erstellte Servicerolle an.

create-es-backup-policy(An die erstellte Servicerolle anhängen)


{
  "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. Ermöglichen Sie den Zugriff für IAM-Rollen auf der Kibana-Seite

Wählen Sie in Kibana ** Sicherheit **, ** Rollenzuordnungen **, ** Hinzufügen *. Wählen Sie für ** Rolle ** ** manage_snapshots ** aus. Geben Sie dann im entsprechenden Feld die ARN des IAM-Benutzers oder der IAM-Rolle an. Geben Sie die ARN des Benutzers in den Abschnitt ** [Benutzer] ** ein. Geben Sie die ARN der Rolle in den Abschnitt ** [Backend-Rollen] ** ein. ( Dies gibt Berechtigungen für Rolleninformationen zur Verwendung von Snapshots.) Dieses Mal habe ich die ARN-Informationen der erstellten Servicerolle an der Stelle mit dem Namen "Backend-Rollen" auf der Seite "Rollenzuordnungen von Kibana" eingegeben. (Ich sollte in der Lage sein, die Anmeldeinformationen durch Ausführen der IAM-Richtlinie festzulegen, aber ich habe einen Fehler festgestellt, sodass ich ihn mit dieser Methode vermieden habe.)

Dies ist das Ende der Organisation rund um die IAM-Rolle.

Registrieren Sie ein manuelles Snapshot-Repository

Führen Sie das folgende Python-Skript aus (im Referenzmaterial wurde die Authentifizierung mit dem Zugriffsschlüssel durchgeführt, derzeit wird jedoch offiziell keine Authentifizierung mit dem Zugriffsschlüssel empfohlen).

register-repositry.py


import boto3
import requests
from requests_aws4auth import AWS4Auth

region = 'Regionsname' # 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 = 'es Domain-Endpunkt/' # /Vergiss nicht

# Register repository
path = '_snapshot/test-es-snapshot' # the Elasticsearch API endpoint
url = host + path
payload = {
  "type": "s3",
  "settings": {
    "bucket": "Eimername",
    "region": "Regionsname",
    "role_arn": "Name der Servicerolle erstellt"
  }
}

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

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

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

Bestätigen Sie, dass die Antwort wie folgt lautet

200
{"acknowledged":true}

Machen Sie einen manuellen Schnappschuss

snapshot.py


import boto3
import requests
from requests_aws4auth import AWS4Auth

region = 'Regionsname' # 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 = 'es Domain-Endpunkt/' # /Vergiss nicht

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

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

print(r.text)

Ausführungsbeispiel


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

Überprüfen Sie das Repository, aus dem der Snapshot erstellt wurde

check_repository.py


import boto3
import requests
from requests_aws4auth import AWS4Auth

region = 'Regionsname' # 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 = 'es Domain-Endpunkt/' # /Vergiss nicht

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

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

print(r.text)

Ausführungsbeispiel


-> % python check_repository.py
Enter MFA code for :
{
  "cs-automated-enc" : {
    "type" : "s3"
  },
  "test-es-snapshot" : {
    "type" : "s3",
    "settings" : {
      "bucket" : "test-es-snapshot",
      "region" : "Regionsname",
      "role_arn" : "Name der Servicerolle erstellt"
    }
  }
}

Überprüfen Sie den Erfassungsstatus des Schnappschusses

check_snapshot.py


import boto3
import requests
from requests_aws4auth import AWS4Auth

region = 'Regionsname' # 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 = 'es Domain-Endpunkt/' # /Vergiss nicht

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

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

print(r.text)

Ausführungsbeispiel


-> % python check_snapshot.py
Enter MFA code for :
{
  "snapshots" : [ {
    "snapshot" : "my-snapshot-1",
    "uuid" : "*************",
    "version_id" : ******,
    "version" : "7.8.0",
    "indices" : [ "Indexname ①", "Indexname ②",・ ・ ・ ・ ・ ・],
    "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
    }
  } ]
}

Schnappschuss wiederherstellen

Wenn zum Zeitpunkt der Wiederherstellung ein Index mit demselben Namen vorhanden ist, kann dieser nicht wiederhergestellt werden. Sie müssen daher den Index, den Sie wiederherstellen möchten, einmal löschen. Das Verfahren zum einmaligen Löschen und Wiederherstellen des angegebenen Index ist unten dargestellt.

Löschen Sie den Index einmal

delete_index.py


import boto3
import requests
from requests_aws4auth import AWS4Auth

region = 'Regionsname' # 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 = 'es Domain-Endpunkt/' # /Vergiss nicht

# DELETE INDEX
path = 'Indexname'
url = host + path

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

print(r.text)

Ausführungsbeispiel


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

Wählen Sie in der es-Konsole die Domäne aus und wechseln Sie zur Registerkarte Index, um festzustellen, ob der Index gelöscht wurde. Sie können auch im Dashboard sehen, dass weniger Dokumente durchsucht werden können.

Stellen Sie den angegebenen Index wieder her

restore_one.py


import boto3
import requests
from requests_aws4auth import AWS4Auth

region = 'Regionsname' # 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 = 'es Domain-Endpunkt/' # /Vergiss nicht

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

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

print(r.text)

Ausführungsbeispiel


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

Zusammenfassung

Das Referenzmaterial war sehr nützlich, um Schnappschüsse abzurufen und wiederherzustellen. (Fast das gleiche.) Ich hatte große Probleme, IAM-Rollen und -Richtlinien zu organisieren. .. .. Es war schwierig, wenn ich nicht herausfinden konnte, welche Politik mit welcher Rolle verbunden war. ..

Ich hoffe, es wird jedem helfen. ..

Recommended Posts

Bis Sie einen Schnappschuss des Amazon Elasticsearch-Dienstes erhalten und wiederherstellen
Bis Sie tägliche Daten für mehrere Jahre japanischer Bestände erhalten und diese in einer einzigen CSV (Python) speichern
Massenbereitstellung mit CFn, um manuelle Schnappschüsse des Elastic Search Service mit Lambda zu erstellen
Während des Studiums von JQuery und Python bis zur Veröffentlichung eines Webdienstes auf GCP
Wenn Sie eine Methode in einer Ruby-Klasse definieren und dann eine Methode darin definieren, wird sie zu einer Methode der ursprünglichen Klasse.
Bis Sie mit Python unter Windows 7 eine maschinelle Lernumgebung erstellen und ausführen
Holen Sie sich ein Bild von einer Webseite und ändern Sie die Größe
Holen Sie sich Python-Webseite, Zeichenkodierung und Anzeige
Holen Sie sich eine globale IP und exportieren Sie sie in Google Spreadsheets
Senden Sie eine Anfrage von AWS Lambda an Amazon Elasticsearch Service
Es ist überraschend mühsam, eine Liste mit dem Datum und der Uhrzeit der letzten Anmeldung von Arbeitsbereichen abzurufen
Was ist ein Hund? Volumen der GET-Anforderungen und Abfrageparameter
Lassen Sie uns überlegen, ob es sich um eine PDF- und eine Ausnahmeverarbeitung handelt. Bis Sie Ihre eigene Ausnahmeverarbeitung erstellen
Rufen Sie eine Liste der Kameraparameter ab, die mit cv2.VideoCapture festgelegt werden können, und machen Sie daraus einen Wörterbuchtyp