So erstellen Sie schnell und einfach Schnappschüsse und entfernen diese automatisch

Die Geschichte handelt davon, wie ich ein Problem hatte, dessen Lösung 2 Tage dauerte. In der Dokumentation wurde eine Diskrepanz festgestellt, und die reale Welt der Yandex-Cloud wurde in Yandex geschrieben, aber es gab keine Antwort.



Yandex.Cloud



Aufgabe:



Erstellen Sie gemäß dem Zeitplan SNAPSHOT-Datenträger in der verwendeten Instanz. Gleichzeitig sollte es möglich sein, die Festplatten zu markieren, die gesichert werden müssen und die nicht.



Unteraufgaben:



  • Schnappschüsse, die älter als n Tage sind, sollten automatisch aus dem Speicher gelöscht werden. In diesem Fall sollte es möglich sein, n zu ändern.
  • Schnappschüsse müssen einen lesbaren Titel haben. Und passen Sie das folgende Muster an:



    %  %- %-%  %


So war es für eine Person bei Bedarf klar, was sie für neue Autos einsetzen sollte. (In der endgültigen Version wird es von einem separaten Bash-Skript implementiert, das von einem Computer eines Drittanbieters ausgeführt wird.)



Fortschritt:



Y.cloud verfügt nicht über eine Standardfunktion, die diese Aufgabe ausführt.



Die Lösung besteht darin, sie auf Kosten der Funktion in Y.cloud selbst zu implementieren, um Ressourcen zu sparen. Um Schnappschüsse zu erstellen, wurde eine Funktion in NodeJS12 geschrieben



const ycsdk = require("yandex-cloud/api/compute/v1");
const FOLDER_ID = process.env.FOLDER_ID;
async function handler(event, context) {
    const snapshotService = new ycsdk.SnapshotService();
    const diskService = new ycsdk.DiskService();
    const diskList = await diskService.list({
        folderId: FOLDER_ID,
    });
    for (const disk of diskList.disks) {
        if ('snapshot' in disk.labels) {
            snapshotService.create({
                folderId: FOLDER_ID,
                diskId: disk.id
            });
        }
    }
}
exports.handler = handler;


* Wenn Sie diese Funktion aufrufen, müssen Sie FODLER_ID durch die Umgebung übergeben und das Dienstkonto angeben.



Als nächstes wird ein Aufruf dieser Funktion zu einem Zeitplan hinzugefügt. Und die Aufgabe ist gelöst.



Unteraufgabe 1.



Zunächst wurde beschlossen, dies über dieselbe NodeJS12-Funktion zu tun.

Arbeitslogik: Analysieren Sie das Erstellungsdatum des Schnappschusses, vergleichen Sie es mit der Differenz zwischen dem aktuellen Datum und n, und löschen Sie es, wenn das Limit überschritten wird.



Dazu finden Sie in der offiziellen Dokumentation und sehen , dass der CreatedAt Parameter der String - Typ sein muss.



IN ORDNUNG. Wir schreiben eine Funktion, mit der Schnappschüsse entfernt werden, die weniger als 1 Stunde nach der Geburt liegen (für den Test). Wir starten. Wir bekommen nichts. Gar nichts. Kein Fehler im Fehlerausgabefeld, sondern die Aktion, die wir benötigen.



Iteration 1.



const ycsdk = require("yandex-cloud/api/compute/v1");

const FOLDER_ID = process.env.FOLDER_ID;

const date = new Date();
date.setHours( date.getHours() - 1 );

async function handler(event, context) {
  const snapshotService = new ycsdk.SnapshotService();

  const {snapshots} = await snapshotService.list({folderId: FOLDER_ID});
  for ( let snapshot in snapshots ) {
    const dateSnapshot = new Date( snapshot.createdAt );
    if ( dateSnapshot.getTime() > date.getTime() ) snapshotService.delete({snapshotId: snapshot.id});
  }
}

exports.handler = handler;


Iteration 2. Ändern Sie die



Funktion so, dass im Fehlerkörper eine Antwortmeldung angezeigt wird.



const ycsdk = require("yandex-cloud/api/compute/v1");

const FOLDER_ID = process.env.FOLDER_ID;

const date = new Date();
date.setHours( date.getHours() - 1 );

async function handler(event, context) {
  const snapshotService = new ycsdk.SnapshotService();

  const {snapshots} = await snapshotService.list({folderId: FOLDER_ID});
  throw Error( JSON.stringify( snapshots ) );
}

exports.handler = handler;

   :
«"errorMessage": "[{\"labels\":{},\"productIds\":[],\"id\":\"fd813o0n3p753lhqphie\",\"folderId\":\"b1gfub3omefcfvchsd0f\",\"createdAt\":{\"seconds\":{\"low\":1594137358,\"high\":0,\"unsigned\":false}},\"diskSize\":{\"low\":1073741824,\"high\":0,\"unsigned\":false},\"status\":2,\"sourceDiskId\":\"ef3ivjn6340h9e8incbq\"},…..»


Nachdem wir welche gekämmt haben, sehen wir Folgendes:



{
    "labels": {},
    "productIds": [],
    "id": "fd813o0n3p753lhqphie",
    "folderId": "b1gfub3omefcfvchsd0f",
    "createdAt": {
      "seconds": {
        "low": 1594137358,
        "high": 0,
        "unsigned": false
      }


Von hier ziehen wir eine Schlussfolgerung. CreatedAt ist keine Zeichenfolge, sondern ein Objekt.



Iteration 3.



Wir versuchen mit CreatedAt zu arbeiten. Wir ändern die Funktion.



const ycsdk = require("yandex-cloud/api/compute/v1");

const FOLDER_ID = process.env.FOLDER_ID;

const date = new Date();
date.setHours( date.getHours() - 1 );

async function handler(event, context) {
  const snapshotService = new ycsdk.SnapshotService();

  const {snapshots} = await snapshotService.list({folderId: FOLDER_ID});
  for ( let snapshot in snapshots ) {

    if ( snapshot.createdAt.seconds.low > date.getTime() / 1000 ) {
      snapshotService.delete({snapshotId: snapshot.id});
    }
  }
}

exports.handler = handler;


Wir bekommen den Fehler:



{
    "errorMessage": "Cannot read property 'seconds' of undefined",
    "errorType": "TypeError",
    "stackTrace": [
        {
            "function": "Runtime.handler",
            "file": "/function/code/index.js",
            "line": 14,
            "column": 29
        }
    ]


Der Fehler sagt uns, dass wir versuchen, die Eigenschaft second von einem nicht vorhandenen Objekt abzurufen, obwohl wir zuvor die Ausgabe der Eigenschaften des "createdAt":{"seconds":{"low":1594137358,"high":0,"unsigned":false}}

Antwortobjekts Iteration 4 beobachtet haben.



const ycsdk = require("yandex-cloud/api/compute/v1");

const FOLDER_ID = process.env.FOLDER_ID;

const date = new Date();
date.setHours( date.getHours() - 1 );

async function handler(event, context) {
  const snapshotService = new ycsdk.SnapshotService();

  const {snapshots} = await snapshotService.list({folderId: FOLDER_ID});
  for ( let i = 0; i < 5; i++ ) {
    throw Error( JSON.stringify( snapshots[i].createdAt ) );
  }

}

exports.handler = handler;


Wir bekommen den Fehler:



{
    "errorMessage": "{\"seconds\":{\"low\":1594137358,\"high\":0,\"unsigned\":false}}",
    "errorType": "Error",
    "stackTrace": [
        {
            "function": "Runtime.handler",
            "file": "/function/code/index.js",
            "line": 13,
            "column": 11
        }
    ]
}


Die Schleife wurde der Einfachheit halber auf 5 Iterationen reduziert.



Iteration 5.



const ycsdk = require("yandex-cloud/api/compute/v1");

const FOLDER_ID = process.env.FOLDER_ID;

const date = new Date();
date.setHours( date.getHours() - 1 );

async function handler(event, context) {
  const snapshotService = new ycsdk.SnapshotService();

  const {snapshots} = await snapshotService.list({folderId: FOLDER_ID});
  const list = [];
  list.push( date.getTime() / 1000 );
  for ( let i in snapshots ) {
    const d = new Date( snapshots[i].createdAt );
    list.push( d.getTime() / 1000 );
  }
  throw Error( JSON.stringify( list ) );

}

exports.handler = handler;
;


Wir bekommen den Fehler:



{
    "errorMessage": "[1594135869.705,null,null,null,null,null,null,null]",
    "errorType": "Error",
    "stackTrace": [
        {
            "function": "Runtime.handler",
            "file": "/function/code/index.js",
            "line": 18,
            "column": 9
        }
    ]
}


Diese Antwort teilt uns mit, dass die Date-Funktion die angeblich erstellte Eigenschaftszeichenfolge At, die Datum und Uhrzeit als Zeichenfolge enthalten sollte, laut Dokumentation nicht analysieren konnte.



Insgesamt - In der Yandex Cloud-Plattform wurde eine weitere Diskrepanz zwischen der Dokumentation und dem tatsächlichen Stand der Dinge festgestellt. Wenn Sie die gleiche Aufgabe wie ich haben, können Sie jetzt nicht einen ganzen Arbeitstag damit verbringen.



All Articles