Yandex.Cloud
:
selon le calendrier, créez des disques SNAPSHOT dans l'instance utilisée. Dans le même temps, il devrait être possible de marquer les disques qui doivent être sauvegardés et ceux qui ne le sont pas.
Sous-tâches:
- Les instantanés datant de plus de n jours doivent être automatiquement supprimés du stockage. Dans ce cas, il devrait être possible de changer n.
- Les instantanés doivent avoir un titre lisible par l'homme. Et correspond au modèle suivant:
% %- %-% %
De sorte que, si nécessaire, il était évident pour une personne de savoir quoi déployer de nouvelles voitures. (dans la version finale, il est implémenté par un script bash distinct exécuté à partir d'une machine tierce).
Progression:
Il n'y a pas de fonction régulière dans Y.cloud qui effectue cette tâche.
La solution est de l'implémenter au détriment de la fonction à l'intérieur de Y.cloud lui-même, pour économiser des ressources. Pour créer des instantanés, une fonction a été écrite dans 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;
* Lors de l'appel de cette fonction, vous devez passer FODLER_ID via l'environnement et spécifier le compte de service.
Ensuite, un appel programmé à cette fonction est ajouté. Et la tâche est résolue.
Sous-tâche 1.
Dans un premier temps, il a été décidé de le faire via la même fonction NodeJS12
Logique de travail: analyser la date de création du snapshot, la comparer à la différence entre la date courante et n, et si la limite est dépassée, la supprimer.
Pour ce faire, reportez - vous à la documentation officielle et voyez que le paramètre CreatedAt doit être de type chaîne.
D'ACCORD. Nous écrivons une fonction qui supprimera les instantanés qui sont à moins d'une heure de la naissance (pour le test). Nous lançons. Nous n'obtenons rien. Rien du tout. Pas une erreur dans le champ de sortie d'erreur, mais l'action dont nous avons besoin.
Itération 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;
Itération 2. Modifiez la
fonction pour qu'elle affiche un message de réponse dans le corps de l'erreur.
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\"},…..»
Après avoir peigné lequel, nous voyons ce qui suit:
{
"labels": {},
"productIds": [],
"id": "fd813o0n3p753lhqphie",
"folderId": "b1gfub3omefcfvchsd0f",
"createdAt": {
"seconds": {
"low": 1594137358,
"high": 0,
"unsigned": false
}
De là, nous tirons une conclusion. CreatedAt n'est pas une chaîne mais un objet.
Itération 3.
Nous essayons de travailler avec CreatedAt. Nous changeons la fonction.
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;
Nous obtenons l'erreur:
{
"errorMessage": "Cannot read property 'seconds' of undefined",
"errorType": "TypeError",
"stackTrace": [
{
"function": "Runtime.handler",
"file": "/function/code/index.js",
"line": 14,
"column": 29
}
]
L'erreur nous indique que nous essayons de récupérer la propriété seconds d'un objet inexistant, bien que nous ayons précédemment observé la sortie des propriétés de l'objet de réponse
"createdAt":{"seconds":{"low":1594137358,"high":0,"unsigned":false}}
Itération 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;
Nous obtenons l'erreur:
{
"errorMessage": "{\"seconds\":{\"low\":1594137358,\"high\":0,\"unsigned\":false}}",
"errorType": "Error",
"stackTrace": [
{
"function": "Runtime.handler",
"file": "/function/code/index.js",
"line": 13,
"column": 11
}
]
}
Réduction de la boucle à 5 itérations pour plus de commodité.
Itération 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;
;
Nous obtenons l'erreur:
{
"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
}
]
}
Cette réponse nous indique que la fonction Date n'a pas pu analyser la chaîne de propriété supposée createdAt, qui devrait contenir la date et l'heure sous forme de chaîne, selon la documentation.
Total - dans la plate-forme Yandex Cloud, un autre écart entre la documentation et l'état réel des choses a été trouvé. Si vous avez la même tâche que la mienne, vous n'avez pas à y consacrer toute une journée de travail.