Erfahren Sie, welcher Benutzer die GCE-Instanz erstellt hat


7

Wir haben mehrere abrechnungsfähige Projekte in unserem GCP-Konto und jedes von ihnen verfügt über mehrere Compute Engine-Instanzen. Ich möchte unkritische Instanzen entfernen, um die unnötige Abrechnung zu reduzieren. Aber bevor ich das mache, muss ich wissen, welche Instanz für was verwendet wird und dafür muss ich wissen, welcher Benutzer sie überhaupt erstellt hat.

Wie lerne ich den Ersteller jeder Instanz entweder mit Google Cloud Shelloder kennen Google Cloud Console?

Antworten:


7

Hinweis: Ich bin noch kein GCE-Benutzer. Die Antwort basiert ausschließlich auf der Dokumentation.

Sie können Überwachungsprotokolle in Google Cloud Consoleden Admin-Aktivitätsprotokollen anzeigen :

Admin-Aktivitätsprotokolle enthalten Protokolleinträge für API-Aufrufe oder andere Verwaltungsaktionen, die die Konfiguration oder Metadaten von Ressourcen ändern. In den Protokollen wird beispielsweise aufgezeichnet, wann VM-Instanzen und App Engine-Anwendungen erstellt werden und wann Berechtigungen geändert werden. Um die Protokolle anzeigen zu können, müssen Sie über die IAM-Rollen Logging / Logs Viewer oder Project / Viewer verfügen .

Sie würden nach den Benutzeridentitäten in Überwachungsprotokollen suchen :

Überwachungsprotokolle zeichnen die Identität des Benutzers auf, der protokollierte Aktionen ausführt. Die Identität wird im AuthenticationInfoFeld von AuditLog- Objekten gespeichert .

Idealerweise suchen Sie nach Erstellungsereignissen für GCE-Instanzen, aber einige / alle sind möglicherweise zu alt für die Aufbewahrungsrichtlinie für Protokolle. Suchen Sie dann möglicherweise nach dem Start der VM-Instanz oder anderen relevanten Ereignissen.

Sie können auch die Überwachungsprotokollinformationen überprüfen und möglicherweise mit denen aus Nutzungsberichten oder exportierten Rechnungsinformationen vergleichen .

Wenn dies eine regelmäßige, laufende Aktivität ist, möchten Sie möglicherweise eine automatisierte Pipeline für den Export und die Verarbeitung von Protokollen einrichten .


2

Ich bin mir nicht sicher, ob Sie das geklärt haben, aber ich musste etwas Ähnliches tun, um herauszufinden, wer die Instanz gestartet hat, damit ich sie dazu bringen kann, die Instanz zu stoppen, wenn sie sie nicht verwenden. Ich habe eine Protokollierungsabfrage zusammengestellt:

resource.type = gce_instance AND (jsonPayload.event_subtype = compute.instances.start OR jsonPayload.event_subtype = compute.instances.insert ) AND jsonPayload.event_type = GCE_OPERATION_DONE AND timestamp >= "2018-10-29T14:28:34-07:00" AND jsonPayload.actor.user!="" AND jsonPayload.resource.name=my-sweet-instance-name

Und hier ist die NodeJS-Funktion, die ich zusammengestellt habe, um sie zu erhalten:

const Logging   = require( '@google-cloud/logging' );
const moment    = require( 'moment' );

const logging   = new Logging( );




var getStartInfo = function( instanceName, querySince, cb ) {

    var tstart = ( querySince ? querySince : moment( ).subtract( 48, 'hours' ).format( ) ); // 

    var theLogFilter = 'resource.type = gce_instance AND ' +
        '(jsonPayload.event_subtype = compute.instances.start OR jsonPayload.event_subtype = compute.instances.insert ) AND ' +
        'jsonPayload.event_type = GCE_OPERATION_DONE AND ' +
        'timestamp >= "' + tstart + '" AND ' +
        'jsonPayload.actor.user!="" AND ' +
        'jsonPayload.resource.name=' + instanceName;

    logging.getEntries( {
        filter: theLogFilter,
        autoPaginate: false
    }, ( err, entries, nextQuery, apiResponse ) => {


        if ( err ) {
            console.log( "ERROR: " + err );
            cb( err );
            return;
        }

        var item, startedBy, startTime, runningTime, mostRecentStart;

        //console.log( 'Entries: ' + JSON.stringify( entries ) );
        // Mabye if none found, we try again with a longer querySince?
        if ( entries.length == 0 ) {

            console.log( "\nNo log entries found for instance '" + instanceName + "'. Filter:" );
            console.log( theLogFilter );
            cb( "No entries found" );
            return;
        }


        // Are these sorted by time?
        for ( var i = 0; i < entries.length; i++ ) {


            startedBy = entries[ i ].metadata.jsonPayload.fields.actor.structValue.fields.user.stringValue;
            startTime = entries[ i ].metadata.jsonPayload.fields.event_timestamp_us.stringValue / 1000; // This is nano seconds since epoch

        }

        if ( cb )
            cb( null, { "startedBy": startedBy, "startTime": moment( startTime ).format() } );

    } );

}

Hoffentlich hilft das jemandem, denn es war ein gutes Stück Arbeit, es zusammenzustellen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.