DevOps Engineer Job at vTech Solution, Houston, TX

YjhrSFpGRmpyaE9KTzZLKzVRNCs4K093YVE9PQ==
  • vTech Solution
  • Houston, TX

Job Description

Job Summary:


The DevOps Engineer role focuses on implementing automation, CI/CD, observability, and operational resilience for Azure data services. This involves automating infrastructure deployment, configuring build and release pipelines, integrating monitoring solutions, developing backup and recovery scripts, and supporting security enforcement.

Location:Houston, Texas, United States

Responsibilities:


- Automate deployment of infrastructure via ARM/Bicep/Terraform.
- Configure build and release pipelines for data workflows.
- Integrate logging, alerting, and cost monitoring with Azure Monitor, Log Analytics, and Application Insights.
- Develop automated backup and recovery scripts.
- Support security enforcement (private endpoints, managed identities).
- Provide operational readiness testing and DR validation.

Required Skills & Certifications:


- 5+ years in DevOps with Azure Cloud.
- Proficiency in CI/CD (Azure DevOps, GitHub Actions).
- Familiarity with PowerShell, YAML, and IaC.

Preferred Skills & Certifications:


- Experience with FinOps and environment monitoring.

Special Considerations:


- Not specified.

Scheduling:

'use client';

import * as React from 'react';

import {

ColumnDef,

flexRender,

getCoreRowModel,

useReactTable,

} from '@tanstack/react-table';

import {

Table,

TableBody,

TableCell,

TableHead,

TableHeader,

TableRow,

} from '@/components/ui/table';

import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/card';

import { CheckCircle2, XCircle, Pencil, Trash2, Plus } from 'lucide-react';

import { Button } from '@/components/ui/button';

type ComplianceMatrixRow = {

id: string;

rfpSection: string;

requirementSummary: string;

painPoint: string;

proposalSection: string;

vtechSolution: string;

keyDifferentiator: string;

compliant: string;

clarifications: string;

priceToWinStrategy: string;

};

type Props = {

data: ComplianceMatrixRow[];

onSave?: (row: ComplianceMatrixRow) => Promise;

readOnly?: boolean;

};

export function ComplianceMatrix({ data: initialData, onSave, readOnly = false }: Props) {

const [data, setData] = React.useState(initialData);

const [editingRowId, setEditingRowId] = React.useState(null);

const [editBuffer, setEditBuffer] = React.useState(null);

const [saving, setSaving] = React.useState(false);

React.useEffect(() => {

setData(initialData);

}, [initialData]);

const startEditing = (row: ComplianceMatrixRow) => {

setEditingRowId(row.id);

setEditBuffer({ ...row });

};

const cancelEditing = () => {

setEditingRowId(null);

setEditBuffer(null);

};

const updateEditBuffer = (field: keyof ComplianceMatrixRow, value: any) => {

setEditBuffer(prev => ({ ...(prev ?? {}), [field]: value }));

};

const saveEditing = async () => {

if (!editingRowId || !editBuffer) return;

setSaving(true);

try {

// Optimistic update

setData(prev => prev.map(r => (r.id === editingRowId ? ({ ...(r as any), ...(editBuffer as any) }) : r)));

// API call to save changes

if (onSave) {

await onSave(editBuffer as ComplianceMatrixRow);

}

setEditingRowId(null);

setEditBuffer(null);

} catch (err: any) {

alert(`Error saving: ${err?.message ?? 'Unknown error'}`);

} finally {

setSaving(false);

}

};

const handleDeleteRow = (id: string) => {

if (!confirm('Are you sure you want to delete this row?')) return;

setData(prev => prev.filter(r => r.id !== id));

if (editingRowId === id) cancelEditing();

};

const handleAddRow = () => {

const newRow: ComplianceMatrixRow = {

id: `new-${Date.now()}`,

rfpSection: '',

requirementSummary: '',

painPoint: '',

proposalSection: '',

vtechSolution: '',

keyDifferentiator: '',

compliant: '',

clarifications: '',

priceToWinStrategy: '',

};

setData(prev => [...prev, newRow]);

setTimeout(() => startEditing(newRow), 50);

};

const columns: ColumnDef[] = [

{

accessorKey: 'rfpSection',

header: 'RFP Section/ID',

cell: ({ row }) => {

const isEditing = row.original.id === editingRowId && !readOnly;

return isEditing ? (

updateEditBuffer('rfpSection', e.target.value)}

className="w-full border rounded px-2 py-1"

/>

) : (

{row.getValue('rfpSection')}

);

},

},

{

accessorKey: 'requirementSummary',

header: 'Requirement Summary',

cell: ({ row }) => {

const isEditing = row.original.id === editingRowId && !readOnly;

return isEditing ? (

updateEditBuffer('requirementSummary', e.target.value)}

className="w-full border rounded px-2 py-1 min-h-[64px] resize-y"

/>

) : (

{row.getValue('requirementSummary')}

);

},

},

{

accessorKey: 'painPoint',

header: 'Pain Point / Need',

cell: ({ row }) => {

const isEditing = row.original.id === editingRowId && !readOnly;

return isEditing ? (

updateEditBuffer('painPoint', e.target.value)}

className="w-full border rounded px-2 py-1 min-h-[48px] resize-y"

/>

) : (

{row.getValue('painPoint')}

);

},

},

{

accessorKey: 'proposalSection',

header: 'Proposal Section',

cell: ({ row }) => {

const isEditing = row.original.id === editingRowId && !readOnly;

return isEditing ? (

updateEditBuffer('proposalSection', e.target.value)}

className="w-full border rounded px-2 py-1"

/>

) : (

{row.getValue('proposalSection')}

);

},

},

{

accessorKey: 'vtechSolution',

header: 'vTech Solution Summary',

cell: ({ row }) => {

const isEditing = row.original.id === editingRowId && !readOnly;

return isEditing ? (

updateEditBuffer('vtechSolution', e.target.value)}

className="w-full border rounded px-2 py-1 min-h-[64px] resize-y"

/>

) : (

{row.getValue('vtechSolution')}

);

},

},

{

accessorKey: 'keyDifferentiator',

header: 'Key Differentiator',

cell: ({ row }) => {

const isEditing = row.original.id === editingRowId && !readOnly;

return isEditing ? (

updateEditBuffer('keyDifferentiator', e.target.value)}

className="w-full border rounded px-2 py-1 min-h-[48px] resize-y"

/>

) : (

{row.getValue('keyDifferentiator')}

);

},

},

{

accessorKey: 'compliant',

header: 'Compliant',

cell: ({ row }) => {

const isEditing = row.original.id === editingRowId && !readOnly;

if (isEditing) {

return (

updateEditBuffer('compliant', e.target.value)}

className="border rounded px-2 py-1"

>

Select

Yes

No

Yes (YES)

);

}

const compliantValue = String(row.getValue('compliant') ?? '').toUpperCase().trim();

const isCompliant = compliantValue === 'Y' || compliantValue === 'YES';

return isCompliant ? : ;

},

},

{

accessorKey: 'clarifications',

header: 'Clarifications / Assumptions',

cell: ({ row }) => {

const isEditing = row.original.id === editingRowId && !readOnly;

return isEditing ? (

updateEditBuffer('clarifications', e.target.value)}

className="w-full border rounded px-2 py-1 min-h-[48px] resize-y"

/>

) : (

{row.getValue('clarifications')}

);

},

},

{

accessorKey: 'priceToWinStrategy',

header: 'Price-to-Win Strategy',

cell: ({ row }) => {

const isEditing = row.original.id === editingRowId && !readOnly;

return isEditing ? (

updateEditBuffer('priceToWinStrategy', e.target.value)}

className="w-full border rounded px-2 py-1 min-h-[48px] resize-y"

/>

) : (

{row.getValue('priceToWinStrategy')}

);

},

},

{

id: 'actions',

header: 'Actions',

cell: ({ row }) => {

if (readOnly) return null;

const isEditing = row.original.id === editingRowId;

return isEditing ? (

{saving ? 'Saving...' : 'Save'}

Cancel

handleDeleteRow(row.original.id)}>

) : (

startEditing(row.original as ComplianceMatrixRow)}>

Edit

handleDeleteRow(row.original.id)}>

);

},

},

];

const table = useReactTable({

data,

columns,

getCoreRowModel: getCoreRowModel(),

});

return (

Compliance Matrix

A detailed breakdown of RFP requirements, our proposed solutions, and strategic analysis.

{!readOnly && (

Add Row

)}

{table.getHeaderGroups().map((headerGroup) => (

{headerGroup.headers.map((header) => {

return (

{header.isPlaceholder

? null

: flexRender(header.column.columnDef.header, header.getContext())}

);

})}

))}

{table.getRowModel().rows?.length ? (

table.getRowModel().rows.map((row) => (

{row.getVisibleCells().map((cell) => (

{flexRender(cell.column.columnDef.cell, cell.getContext())}

))}

))

) : (

No results.

)}

);

}

Job Tags

Similar Jobs

Epic Mortgage

Mortgage Broker Loan Officer Job at Epic Mortgage

 ...Job Description Job Description Job Title: Mortgage Broker Loan Officer Epic Mortgage Inc. Location: Remote | Status: Full-Time | Commission-Based Are you the type of person who doesnt wait for opportunity you create it? Do people naturally trust you,... 

Tenhulzen Residential

Interior Designer Job at Tenhulzen Residential

 ...Company Description Tenhulzen Remodeling offers a unique Design | Build approach, centered around developing each project like...  ...Role Description This is a full-time on-site position for an Interior Designer at our Woodinville, WA location. The Interior Designer... 

Jobot

Electrical Estimator Job at Jobot

Career Advancement Opportunities - Work Life Balance - Excellent Customer Service Required This Jobot Consulting Job is hosted by: Daniel Gonzalez Are you a fit? Easy Apply now by clicking the "Apply" button and sending us your resume. Salary: $18 - $22 per...

Thrive Recruiting Partners

Technical Project Manager Job at Thrive Recruiting Partners

 ...Job Description Technical Project Manager, Partner Operations We are looking for a motivated operations and project management professional to join a fast-growing team focused on scaling physical infrastructure through a global network of partners. The ideal candidate... 

Unifi Aviation, LLC

Airport Ramp Agent-Non Driving (American) - LIH PT Job at Unifi Aviation, LLC

 ...Education: High School diploma or GED. Experience: One+ year of relevant experience. Benefits ~ Flight Benefits - exclusive travel privileges for yourself and your family ~ Competitive pay with daily access to earned wages ~ Paid...