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