Private/Get-GCPInstanceData.ps1

function Get-GCPInstanceData {
    [CmdletBinding()]
    param(
        [string]$Project
    )

    $null = Assert-GCloudAuthenticated
    $resolvedProject = Get-GCloudProject -Project $Project
    $instances = Invoke-GCloudJson -Arguments @('compute', 'instances', 'list', "--project=$resolvedProject")

    foreach ($instance in $instances) {
        $zoneName = if ($instance.zone) {
            ($instance.zone -split '/')[-1]
        } else {
            $null
        }

        $machineType = if ($instance.machineType) {
            ($instance.machineType -split '/')[-1]
        } else {
            $null
        }

        $createdAt = $null

        if (-not [string]::IsNullOrWhiteSpace($instance.creationTimestamp)) {
            $createdAt = [datetime]::Parse($instance.creationTimestamp)
        }

        $networkInterfaces = @($instance.networkInterfaces)
        $primaryInterface = $networkInterfaces | Select-Object -First 1
        $accessConfigs = @($primaryInterface.accessConfigs)
        $primaryAccessConfig = $accessConfigs | Select-Object -First 1

        ConvertTo-CloudRecord `
            -Name $instance.name `
            -Provider GCP `
            -Region $zoneName `
            -Status (ConvertFrom-GCPInstanceStatus -Status $instance.status) `
            -Size $machineType `
            -CreatedAt $createdAt `
            -Metadata @{
                Project          = $resolvedProject
                Id               = $instance.id
                Zone             = $zoneName
                PrivateIpAddress = $primaryInterface.networkIP
                PublicIpAddress  = $primaryAccessConfig.natIP
                Labels           = $instance.labels
            }
    }
}