Como saber qual usuário criou a instância GCE

7

Temos vários projetos habilitados para cobrança em nossa conta GCP e cada um deles tem várias instâncias do Compute Engine. Desejo remover instâncias não críticas apenas para reduzir o faturamento desnecessário. Mas antes de fazer isso, preciso saber qual instância está sendo usada para quê e para isso preciso saber qual usuário a criou em primeiro lugar.

Como conheço o criador de cada instância usando Google Cloud Shellou Google Cloud Console?

novato
fonte

Respostas:

7

Nota: Ainda não sou usuário do GCE, a resposta é baseada apenas na documentação.

Você pode estar visualizando logs de auditoria nos logs de atividade administrativaGoogle Cloud Console , mais especificamente :

Os logs de atividades administrativas contêm entradas de log para chamadas de API ou outras ações administrativas que modificam a configuração ou os metadados dos recursos. Por exemplo, os logs registram quando instâncias da VM e aplicativos do App Engine são criados e quando as permissões são alteradas. Para visualizar os logs, você deve ter as funções do IAM Log / Visualizador de Logs ou Projeto / Visualizador .

Você procuraria as identidades de usuário nos logs de auditoria :

Os logs de auditoria registram a identidade do usuário que está executando ações registradas. A identidade é mantida no AuthenticationInfocampo de objetos AuditLog .

Idealmente, você procuraria os eventos de criação da instância do GCE, mas alguns / todos eles podem ser antigos demais para a política de retenção de logs. Em seguida, talvez pesquise o início da instância da VM ou outros eventos relevantes.

Você também pode verificar e talvez fazer referência cruzada das informações dos logs de auditoria com as dos Relatórios de uso ou das informações de cobrança exportadas .

Se essa é uma atividade regular e contínua, convém configurar um pipeline automatizado de exportação e processamento de logs .

Dan Cornilescu
fonte
2

Não tenho certeza se você resolveu isso, mas eu tive que fazer algo semelhante para começar quem iniciou a instância para que eu possa impedir que eles parem a instância se eles não a estiverem usando. Eu montei uma consulta de log:

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

E aqui está a função nodejs que eu montei para obtê-lo:

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() } );

    } );

}

Espero que ajude alguém, porque foi um bom trabalho reunir.

nomadic_squirrel
fonte