我们的GCP帐户中有几个启用了结算功能的项目,每个项目都有多个Compute Engine实例。我想删除非关键实例只是为了减少不必要的账单。但是在执行此操作之前,我需要知道哪个实例用于什么,为此,我首先需要知道哪个用户创建了它。

我如何了解该实例的创建者使用Google Cloud ShellGoogle Cloud Console每个实例?

#1 楼

注意:我还不是GCE用户,答案仅是基于文档。

您可以在Google Cloud Console中查看审核日志,更具体地说是Admin Activity日志:


管理员活动日志包含API调用或其他
管理操作的日志条目,这些日志条目修改了
资源的配置或元数据。例如,日志记录何时创建VM实例和App
引擎应用程序以及何时更改权限。要
查看日志,您必须具有IAM角色Logging / Logs Viewer或
Project / Viewer。


您将在审核中寻找用户身份日志:


审核日志记录执行已记录操作的用户的身份。
身份保留在AuditLog对象的AuthenticationInfo字段中。


理想情况下,您会在寻找GCE实例创建事件,但是其中一些/全部对于日志保留策略而言可能太旧了。然后也许搜索VM实例启动或其他相关事件。

您还可以检查审计日志信息,也可以将其与使用情况报告中的审计日志信息或导出的账单信息进行交叉引用。

如果这是常规活动,那么您可能需要设置自动日志导出和处理管道。

#2 楼

不知道您是否解决了这个问题,但是我必须做些类似的事情来让谁启动实例,以便如果他们不使用实例,我可以r使他们停止实例。我整理了一个Logging查询:

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

这是我整理得到的nodejs函数:

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

    } );

}


希望能对某人有所帮助,因为将它们组合在一起是一项很大的工作。