スナップショットをすばやく簡単に作成して自動的に削除する方法

物語は、私がどのようにして解決するのに2日かかった問題を抱えていたかについてです。ドキュメントに不一致が見つかり、Yandexクラウドの実際の世界はYandexで書かれていましたが、答えはありませんでした。



Yandex.Cloud



タスク:



スケジュールに従って、使用済みインスタンスにSNAPSHOTディスクを作成します。同時に、バックアップが必要なディスクとそうでないディスクにマークを付けることができるはずです。



サブタスク:



  • n日より古いスナップショットは、ストレージから自動的に削除する必要があります。この場合、nを変更できるはずです。
  • スナップショットには、人間が読めるタイトルが必要です。そして、次のパターンに一致します。



    %  %- %-%  %


そのため、必要に応じて、何から新しい車を配備するかが人に明らかでした。(最終バージョンでは、サードパーティのマシンから実行される別のbashスクリプトによって実装されます)。



進捗状況:



Y.cloudには、このタスクを実行する通常の機能はありません。



解決策は、リソースを節約するために、Y.cloud自体の内部の関数を犠牲にしてそれを実装することです。スナップショットを作成するために、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;


*この関数を呼び出すときは、FODLER_IDを環境に渡し、サービスアカウントを指定する必要があります。



次に、この関数へのスケジュールされた呼び出しが追加されます。そして、タスクは解決されます。



サブタスク1.



当初、同じNodeJS12関数を使用して実行することが決定されました。

作業のロジック:スナップショットの作成日を分析し、現在の日付とnの差と比較し、制限を超えている場合は削除します。



これを行うには、公式ドキュメントを参照し、CreatedAtパラメーターが文字列タイプである必要があることを確認してください。



OK。生後1時間未満のスナップショットを削除する関数を作成しています(テスト用)。ローンチします。何も得られません。何もありません。エラー出力フィールドのエラーではありませんが、必要なアクションです。



反復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;


反復2.



エラー本文に応答メッセージが表示されるよう関数を変更します。



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


これを組み合わせると、次のようになります。



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


ここから結論を導き出します。CreatedAtは文字列ではなく、オブジェクトです。



反復3。



CreatedAtを使用しようとしています。機能を変更します。



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;


エラーが発生します:



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


このエラーは、応答オブジェクト "createdAt":{"seconds":{"low":1594137358,"high":0,"unsigned":false}}

Iteration 4のプロパティの出力を以前に観察したにもかかわらず、存在しないオブジェクトからsecondsプロパティを取得しようとしていることを示しています



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;


エラーが発生します:



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


便宜上、ループを5回に減らしました。



反復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;
;


エラーが発生します:



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


この回答は、ドキュメントによると、Date関数がcreatedAtプロパティ文字列を解析できなかったことを示しています。この文字列には日付と時刻が文字列として含まれているはずです。



合計-YandexCloudプラットフォームでは、ドキュメントと実際の状況との間に別の不一致が見つかりました。あなたが私のものと同じ仕事をしているなら、あなたはそれに丸一日を費やす必要はありません。



All Articles