Yandex.Cloud
:
وفقًا للجدول الزمني ، قم بإنشاء أقراص SNAPSHOT في المثيل المستخدم. في الوقت نفسه ، يجب أن يكون من الممكن وضع علامة على الأقراص التي تحتاج إلى نسخ احتياطي والتي لا تحتاج إلى ذلك.
المهام الفرعية:
- يجب حذف اللقطات الأقدم من n من الأيام تلقائيًا من التخزين. في هذه الحالة ، يجب أن يكون من الممكن تغيير n.
- يجب أن تحتوي اللقطات على عنوان يمكن للمستخدم قراءته. وتطابق مع النمط التالي:
% %- %-% %
لذلك ، إذا لزم الأمر ، كان واضحًا لأي شخص ما يجب نشر سيارات جديدة. (في الإصدار الأخير ، يتم تنفيذه بواسطة نص برمجي منفصل يتم تنفيذه من جهاز تابع لجهة خارجية).
التقدم:
لا توجد وظيفة منتظمة في 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 يجب أن تكون من نوع السلسلة.
حسنا. نحن نكتب وظيفة من شأنها إزالة اللقطات التي تقل مدتها عن ساعة واحدة من الولادة (للاختبار). نطلق. لا نحصل على شيء. لاشىء على الاطلاق. ليس خطأ في حقل إخراج الخطأ ، ولكن الإجراء الذي نحتاجه.
التكرار 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}}
التكرار 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;
حصلنا على الخطأ:
{
"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 لم تتمكن من تحليل سلسلة الخاصية المفترض إنشاؤها ، والتي يجب أن تحتوي على التاريخ والوقت كسلسلة ، وفقًا للوثائق.
المجموع - في منصة Yandex Cloud ، تم العثور على تناقض آخر بين الوثائق والوضع الحقيقي للأمور. إذا كانت لديك نفس مهمتي ، فلا داعي لقضاء يوم عمل كامل فيها.