GCEインスタンスを作成したユーザーを知る方法


7

GCPアカウントには課金が有効なプロジェクトがいくつかあり、それぞれに複数のCompute Engineインスタンスがあります。不要な請求を減らすために、重要ではないインスタンスを削除したい。しかし、その前に、どのインスタンスが何のために使用されているかを知る必要があります。そのためには、最初にどのユーザーがインスタンスを作成したかを知る必要があります。

Google Cloud Shellまたはを使用して、各インスタンスの作成者を知るにはどうすればよいGoogle Cloud Consoleですか?

回答:


7

注:私はまだGCEユーザーではありません。回答はドキュメントのみに基づいています。

あなたはすることができ、監査ログの表示にはGoogle Cloud Console、より具体的に管理アクティビティログ

管理アクティビティログには、リソースの構成やメタデータを変更するAPI呼び出しやその他の管理アクションのログエントリが含まれています。たとえば、ログは、VMインスタンスとApp Engineアプリケーションが作成されたとき、および権限が変更されたときを記録します。ログを表示するには、IAMロールLogging / Logs Viewerまたは Project / Viewerが必要です。

監査ログでユーザーIDを探します。

監査ログには、ログに記録されたアクションを実行しているユーザーのIDが記録されます。IDはAuthenticationInfoAuditLog オブジェクトのフィールドに保持されます。

理想的には、GCEインスタンス作成イベントを探しますが、それらの一部またはすべてがログ保持ポリシーには古すぎる可能性があります。次に、VMインスタンスの開始またはその他の関連イベントを検索します。

監査ログ情報を確認し、場合によっては、使用状況レポートまたはエクスポートされた請求情報からの情報と相互参照することもできます。

これが定期的な進行中のアクティビティである場合は、自動ログエクスポートおよび処理パイプラインをセットアップすることができます。


2

これを整理したかどうかはわかりませんが、インスタンスを開始したユーザーを取得するために同様のことをしなければならなかったので、インスタンスを使用していない場合はインスタンスを停止するようにバッジを付けることができます。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() } );

    } );

}

うまくいけば、一緒にまとめるのにかなりの労力が費やされたので、それは誰かを助けるでしょう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.