[PYTHON] Massenbereitstellung mit CFn, um manuelle Schnappschüsse des Elastic Search Service mit Lambda zu erstellen

Stellen Sie den manuellen Snapshot-Erfassungsmechanismus mit Cloudformation sofort mit Amazon Elasticsearch Service (AES) bereit. Außerdem werden alte Schnappschüsse mit Curator automatisch gelöscht. Es ist überraschend schwierig, nur einen Schnappschuss zu machen.

Python-Skripte basieren auf denen in dieser AWS-Dokumentation.

https://docs.aws.amazon.com/ja_jp/elasticsearch-service/latest/developerguide/curator.html

Was du machen willst

Mach das. Das Skript ist fast das gleiche wie das in der AWS-Dokumentation, daher denke ich, dass es eine Ebene ist, die Sie leicht verstehen können, wenn Sie es lesen. Es gibt auch Kommentare.

image.png

Manuelle Schnappschüsse erforderlich

Im Juli 2019 wurden automatische Schnappschüsse wie folgt verbessert, und stündliche Schnappschüsse werden jetzt 14 Tage lang in S3 gespeichert.

https://aws.amazon.com/jp/about-aws/whats-new/2019/07/amazon-elasticsearch-service-increases-data-protection-with-automated-hourly-snapshots-at-no-extra-charge/

Dies allein ist sehr praktisch, da Sie eine Stunde vor dem Ausfall in die Situation zurückkehren können, selbst wenn Daten aufgrund eines gleichzeitigen Ausfalls mehrerer Knoten verloren gehen.

Automatische Snapshots werden jedoch in einen verwalteten S3-Bucket aufgenommen, sodass beim Löschen der Domäne alles gelöscht wird.

Es gibt auch Einschränkungen, z. B. dass ein Snapshot nicht in einer anderen Domäne wiederhergestellt werden kann, z. B. wenn Sie ein Duplikat einer Domäne erstellen möchten.

Ich denke, es gibt einige Bedürfnisse, um Kibana-Definitionen und Index-Maps in verschiedenen Domänen zu verwenden. Zu diesem Zweck empfiehlt es sich, parallel zum automatischen Schnappschuss einen manuellen Schnappschuss zu erstellen.

Obwohl es eine Referenz-URL gibt

Es gibt nur einen bewährten Service und offizielle Informationen zu diesem Bereich.

https://docs.aws.amazon.com/ja_jp/elasticsearch-service/latest/developerguide/curator.html

Selbst wenn ich dies so wie es ist auf Lambda kopiere, funktioniert es nicht. Die im Python-Beispielskript verwendete Bibliothek muss so eingerichtet sein, dass sie von Lambda separat importiert werden kann.

Darüber hinaus sind IAM und andere Einstellungen erforderlich, um manuelle Snapshots durchzuführen. Hier gibt es ein Handbuch, aber wenn Sie nicht daran gewöhnt sind, wissen Sie nicht, was Sie tun sollen.

https://docs.aws.amazon.com/ja_jp/elasticsearch-service/latest/developerguide/es-managedomains-snapshots.html

In diesem Artikel soll eine Umgebung erstellt werden, in der dieses Programm (eine leicht modifizierte Version) funktioniert.

Arbeitsvoraussetzung

Dies ist die Voraussetzung für die in diesem Artikel ausgeführte Operation.

Arbeitsterminalseite

Mindestens Linux- oder Mac-Computer mit den folgenden Komponenten installiert: (Ich arbeite übrigens an wsl2)

AWS-Seite

Ausführungsmethode

Download von Github

Laden Sie das folgende Repository von Github herunter.

$ git clone [email protected]:yomon8/aes-snapshot-sample.git
$ cd aes-snapshot-sample/

https://github.com/yomon8/aes-snapshot-sample

Einstellen der Dateianpassung

Geben Sie die Variablen in die Konfigurationsdatei ein.

$ cp settings.sh{.sample,}
$ vim settings.sh

Es gibt die folgenden Elemente, stellen Sie sie also entsprechend Ihrer Umgebung ein.

#Name des Cloudformation-Stapels
readonly STACK_NAME=es-snapshot-sample

#Bucket zum Hochladen von Cloudformation-Paketen
readonly STACK_S3_BUCKET=bucket-name
readonly STACK_S3_PREFIX=es-snapshot-sample

#AES-Hostname (AES wird unter der Annahme eines VPC-Zugriffs erstellt)
readonly AES_HOST=vpc-xxxxxxxxxxxxxxxxxxxxxx.ap-northeast-1.es.amazonaws.com

#Geben Sie das Subnetz an, das auf AES zugreifen kann
readonly LAMBDA_SUBNET_ID=subnet-xxxxxxxxxxxxxxxxxxxxxx

#Geben Sie SG an, die auf AES zugreifen kann
readonly LAMBDA_SECURITY_GROUP_ID=sg-xxxxxxxxxxxxxxxxxxx

#Name des Speicherorts für AES-Snapshots
readonly SNAPSHOT_REPOSITORY_NAME=your-repo

#Präfix mit dem Namen des AES-Snapshots
readonly SNAPSHOT_PREFIX=your-snapshot

Cloudformation-Bereitstellung

Danach klicken Sie auf das Bereitstellungsskript und Sie sind fertig. Das erstmalige Herunterladen der Layer-Software dauert lange. In meiner Umgebung dauert es weniger als 10 Minuten.

$ ./deploy.sh
~ Ausgelassen ~

Registrieren Sie das Snapshot-Repository

Wenn ich "deploy.sh" ausführe, wird am Ende die folgende Meldung angezeigt.

1.Führen Sie den folgenden Befehl zu Beginn einmal aus.
aws lambda invoke --function-name aes-snapshot-sample-AESRegistSnapshotRepositoryFun-1SHIY9NWSSH8B:live /dev/null

Wie in der Nachricht angegeben, wird beim Ausführen des Befehls Lambda zum Registrieren des Repositorys ausgeführt.

$ aws lambda invoke --function-name aes-snapshot-sample-AESRegistSnapshotRepositoryFun-1SHIY9NWSSH8B:live /dev/null
{
    "StatusCode": 200,
    "ExecutedVersion": "1"
}

Lassen Sie uns überprüfen, ob das Repository registriert ist. Ein Repository namens "my-repo" ist registriert.

GET _cat/repositories?v
id           type
cs-automated   s3
my-repo        s3

Machen Sie ein Backup

Zu diesem Zeitpunkt habe ich gerade das Repository registriert, sodass es keinen Schnappschuss gibt. Selbst wenn Sie die folgende API drücken, sollte der Snapshot nicht angezeigt werden.

GET _cat/snapshots/my-repo

Sie sollten eine weitere Nachricht in "deploy.sh" sehen, um einen Schnappschuss zu machen.

2.Führen Sie den folgenden Befehl aus, um einen Schnappschuss manuell zu erstellen.   
Darüber hinaus ist dieses Lambda so eingestellt, dass die Ausführung geplant wird.
aws lambda invoke --function-name aes-snapshot-sample-AESRotateSnapshotFunction-1GB4JKXMNZ8KQ:live /dev/null

Sie können eine Sicherung erstellen, indem Sie den hier angezeigten Befehl ausführen.

$ aws lambda invoke --function-name aes-snapshot-sample-AESRotateSnapshotFunction-1GB4JKXMNZ8KQ:live /dev/null
{
    "StatusCode": 200,
    "ExecutedVersion": "1"
}
GET _cat/snapshots/my-repo?v
id                            status start_epoch start_time end_epoch  end_time duration indices successful_shards failed_shards total_shards
my-snapshot-2019-11-13-12-35 SUCCESS 1573647456  12:17:36   1573647456 12:17:36    459ms       1                 1             0            1

Sie können bestätigen, dass die Snapshot-Daten auch in S3 enthalten sind.

image.png

Da die Sicherung für eine Weile in CloudWatch Event gestartet ist, funktioniert sie außerdem einmal täglich, ohne den oben beschriebenen Befehl auszuführen.

image.png

Sie können den Zeitplan im folgenden Teil von "template.yaml" anpassen. Abgesehen vom Zeitplan habe ich nur einige Skripte mitgebracht. Bitte passen Sie sie an und verwenden Sie sie.

      Events:
        Rule:
          Type: Schedule
          Properties:
            Schedule: cron(5 16 * * ? *)

Was machst du

Sie können sehen, was Sie tun, indem Sie sich den Inhalt von "deploy.sh" ansehen.

elasticsearch und Curator werden mit Docker heruntergeladen, erstellt und als Lambda Layer hochgeladen.

#!/bin/bash

#Einstellungsdatei lesen
source ./settings.sh

#Laden Sie die erforderliche Python-Bibliothek als Lambda-Ebene herunter
docker run --rm -v $(pwd)/layer/python:/python python:3.7.5-alpine pip install -t /python requests-aws4auth elasticsearch elasticsearch-curator

#Bereitstellung mit Cloudformation
aws cloudformation package --template-file ./template.yaml --output-template-file ./package.yaml \
    --s3-bucket ${STACK_S3_BUCKET} \
    --s3-prefix ${STACK_S3_PREFIX} 
aws cloudformation deploy --template-file ./package.yaml --capabilities CAPABILITY_IAM \
    --stack-name ${STACK_NAME} \
    --parameter-overrides \
    AESHost=${AES_HOST} \
    LambdaSubnetId=${LAMBDA_SUBNET_ID} \
    LambdaSecurityGroupId=${LAMBDA_SECURITY_GROUP_ID} \
    SnapshotRepositoryName=${SNAPSHOT_REPOSITORY_NAME} \
    SnapshotPrefix=${SNAPSHOT_PREFIX} 

#Nachrichtenanzeige
echo ""
echo "1.Führen Sie den folgenden Befehl zu Beginn einmal aus."
echo aws lambda invoke --function-name $(aws cloudformation describe-stacks --stack-name ${STACK_NAME} --query 'Stacks[].Outputs[?OutputKey == `RegistSnapshotFunctionName`].OutputValue' --output text):live /dev/null
echo ""
echo "2.Führen Sie den folgenden Befehl aus, um einen Schnappschuss manuell zu erstellen."
echo "Darüber hinaus ist dieses Lambda so eingestellt, dass die Ausführung geplant wird."
echo aws lambda invoke --function-name $(aws cloudformation describe-stacks --stack-name ${STACK_NAME} --query 'Stacks[].Outputs[?OutputKey == `RotateSnapshotFunctionName`].OutputValue' --output text):live /dev/null
echo ""

Schnappschuss wiederherstellen

Wenn Sie S3 registrieren, in dem der Snapshot auf dieselbe Weise als Repository gespeichert ist, können Sie ihn einfach wiederherstellen, indem Sie die unten beschriebenen Schritte ausführen.

https://docs.aws.amazon.com/ja_jp/elasticsearch-service/latest/developerguide/es-managedomains-snapshots.html#es-managedomains-snapshot-restore

Referenz

https://github.com/elastic/curator

[Tipps Hinweis] Wiederherstellen des Nicht-Kibana-Index

Oft möchten Sie etwas anderes als Kibana wiederherstellen. Sie können andere Indizes als Kibana wiederherstellen, indem Sie Folgendes ausführen. Sie können nur einen bestimmten Index wiederherstellen, indem Sie den Indexparameter ändern.

POST _snapshot/Repository-Name/Schnappschussname/_restore
{"indices": "*,-.kibana_1"}

https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html

https://docs.aws.amazon.com/ja_jp/elasticsearch-service/latest/developerguide/es-managedomains-snapshots.html#es-managedomains-snapshot-restore

Recommended Posts

Massenbereitstellung mit CFn, um manuelle Schnappschüsse des Elastic Search Service mit Lambda zu erstellen
Senden Sie eine Anfrage von AWS Lambda an Amazon Elasticsearch Service
Bis Sie einen Schnappschuss des Amazon Elasticsearch-Dienstes erhalten und wiederherstellen
Exportieren Sie den RDS-Snapshot mit Lambda (Python) nach S3.
Memo mit Python mit HiveServer2 von EMR verbunden
Machen Sie LCD-Screenshots mit Python-LEGO Mindstorms
Geben Sie Zaim-Daten mit Logstash in den Amazon Elasticsearch Service ein
Ich möchte eine lokale Variable mit Lambda binden
Eine Sammlung wettbewerbsfähiger Pro-Techniken, die mit Python gelöst werden können
So zeigen Sie eine Liste der mit pyenv installierbaren Versionen an