Cara membuat snapshot dengan cepat dan mudah dan menghapusnya secara otomatis

Ceritanya tentang bagaimana saya memiliki masalah yang membutuhkan waktu 2 hari untuk diselesaikan. Perbedaan ditemukan dalam dokumentasi dan dunia nyata awan Yandex ditulis di Yandex, tetapi tidak ada jawaban. Tugas



Yandex.Cloud



:



Menurut jadwal, buat disk SNAPSHOT dalam contoh yang digunakan. Pada saat yang sama, harus dimungkinkan untuk menandai disk yang perlu dicadangkan dan mana yang tidak.



Subtugas:



  • Snapshot yang lebih lama dari n hari harus dihapus secara otomatis dari penyimpanan. Dalam hal ini, mungkin untuk mengubah n.
  • Snapshot harus memiliki judul yang dapat dibaca manusia. Dan cocokkan pola berikut:



    %  %- %-%  %


Sehingga, jika perlu, jelas bagi seseorang dari apa yang harus digunakan mobil baru. (dalam versi final, ini diimplementasikan oleh skrip bash terpisah yang dijalankan dari mesin pihak ketiga).



Kemajuan:



Tidak ada fungsi reguler di Y.cloud yang melakukan tugas ini.



Solusinya adalah dengan mengimplementasikannya dengan mengorbankan fungsi di dalam Y.cloud itu sendiri, untuk menghemat resource. Untuk membuat snapshot, fungsi ditulis di NodeJS12



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;


* Saat memanggil fungsi ini, Anda harus meneruskan FODLER_ID melalui lingkungan dan menentukan akun layanan.



Selanjutnya, panggilan terjadwal ke fungsi ini ditambahkan. Dan masalahnya terpecahkan.



Subtugas 1.



Awalnya, diputuskan untuk melakukannya melalui fungsi NodeJS12 yang sama

Logika pekerjaan: menganalisis tanggal pembuatan snapshot, membandingkannya dengan selisih antara tanggal dan n saat ini, dan jika batas terlampaui, hapus.



Untuk melakukan ini, lihat dokumentasi resmi dan lihat bahwa parameter CreatedAt harus berjenis string.



BAIK. Kami sedang menulis fungsi yang akan menghapus snapshot yang kurang dari 1 jam sejak lahir (untuk pengujian). Kami meluncurkan. Kami tidak mendapatkan apa-apa. Tidak ada sama sekali. Bukan kesalahan di bidang keluaran kesalahan, tetapi tindakan yang kita butuhkan.



Iterasi 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;


Iterasi 2. Ubah



fungsi sehingga menampilkan pesan respons di badan kesalahan.



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\"},…..Β»


Setelah menyisir, kita melihat yang berikut ini:



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


Dari sini kami menarik kesimpulan. CreatedAt bukanlah sebuah string tapi sebuah objek.



Iterasi 3.



Kami mencoba untuk bekerja dengan CreatedAt. Kami mengubah fungsinya.



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;


Kami mendapatkan kesalahan:



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


Kesalahan memberi tahu kita bahwa kita mencoba mengambil properti detik dari objek yang tidak ada, meskipun sebelumnya kita mengamati output dari properti objek respons "createdAt":{"seconds":{"low":1594137358,"high":0,"unsigned":false}}

Iterasi 4.



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;


Kami mendapatkan kesalahan:



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


Mengurangi loop menjadi 5 iterasi untuk kenyamanan.



Iterasi 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;
;


Kami mendapatkan kesalahan:



{
    "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
        }
    ]
}


Jawaban ini memberi tahu kita bahwa fungsi Tanggal tidak dapat mengurai string properti yang seharusnya dibuatAt, yang seharusnya berisi tanggal dan waktu sebagai string, menurut dokumentasi.



Total - di platform Yandex Cloud, ditemukan perbedaan lain antara dokumentasi dan keadaan sebenarnya. Jika Anda memiliki tugas yang sama dengan saya, Anda tidak perlu menghabiskan waktu seharian untuk mengerjakannya.



All Articles