How to build a SOC-2 compliant Voice AI platform on AWS: A 2026 Guide

Dave Horton

In the unfolding age of AI-powered cybersecurity threats, hardening your IT infrastructure is more important than ever, and Voice AI orchestration platforms present specific challenges. By their nature, these systems are heavily connected to the outside world:

Furthermore, Voice AI platforms house significant amounts of private customer data that attract cyber criminals: phone numbers, personally-identifiable information, private credentials, transcripts, audio recordings, and more.

At jambonz, we’ve spent a lot of time, energy, and resources over the past year to harden and protect our cloud systems as part of an effort to achieve SOC-2 attestation. We’ve learned a lot, factored that learning into the suite of self-hosted deployment tools that we provide our customers, and this blog post describes how to build your own self-hosted jambonz cluster on AWS that is also ready for a SOC-2 audit.

Key Takeaways

What Is SOC 2?

SOC 2 is a security framework that specifies how organizations should protect customer data from unauthorized access, security incidents, and other vulnerabilities. The American Institute of Certified Public Accountants (AICPA) developed SOC 2 around five Trust Services Criteria: security, availability, processing integrity, confidentiality, and privacy. Once your system has been appropriately hardened and ready, an independent auditor examines your security controls and writes a report saying whether those controls exist and whether they work. The report is organized around five Trust Services Criteria:

There are two kinds of report. A Type I report looks at whether your controls are designed properly at a single point in time. A Type II report looks at whether they actually operated in accordance with your policies over a period of time, usually three months or so.

Why has SOC 2 gone from “nice to have” to “no report, no contract”? Because attacks have become routine, and the costliest ones increasingly come through vendors. A bank can harden its own systems and still be exposed through the contact-center software that records its customers’ calls. Vendor-risk teams have learned this the hard way. A SOC 2 report is how they decide whether you are a risk they can take on.

Voice AI raises the stakes. A conversational agent doesn’t just route calls. It also listens, transcribes, sends what it hears to speech and language models, and often looks up the caller’s records during a call. That is a lot of sensitive data moving through a lot of systems, and it all has to be thoughtfully secured end-to-end. That is what SOC-2 is designed to report on.

Where Does Your Customers’ Data Live?

For many teams a hosted platform is the right call. It’s the fastest way to get a voice agent into production, and that’s why we run jambonz.cloud.

But many organizations need ultimate control over their customer and call data, whether for data sovereignty or for strict privacy and security requirements: banks, health systems, public-sector agencies, and companies bound to keep data in a specific country. For them, self-hosting is the answer.

Our jambonz self-hosted runs in your own AWS account, in the region you choose, inside a VPC you own, behind your security groups, under your IAM policies, and logging to your CloudWatch. Recordings, transcripts and call records never leave the boundary you control and audit. Because it runs in your account, the security tooling you already use covers it too: GuardDuty threat detection, CloudTrail auditing, Security Hub and AWS Config apply to jambonz like any other workload, with no extra integration.

Self-hosting by itself isn’t enough, though. Developer frameworks such as LiveKit can be self-hosted, but they give you building blocks and leave the hardening to you: secrets handling, IAM roles, database encryption, log retention, network rules. That work is where audits are won or lost. With jambonz 11.1.6 on AWS, that hardening ships as part of the product.

16 Takeaways From Our SOC 2 Journey

We run jambonz ourselves as a hosted service, jambonz.cloud. Going through SOC 2 readiness on our own infrastructure taught us a lot that we have now factored into our self-hosted deployment scripts.

We were in decent shape to start with because we have always focused on security and privacy: our customers span the globe and often choose to self-host for security and data residency requirements as well as latency.

For example, we designed our call recording feature such that we never store the call audio on any of our systems; instead we stream it to the customer’s own cloud storage, specifically for privacy reasons. Additionally, we’ve always encrypted private credentials such as access tokens or api keys with the latest crypto techniques - and then stored the encrypted hashes in a database that itself is encrypted. And so on.

Nonetheless, we learned a lot during our SOC-2 preparedness, and we’ve factored all of this into jambonz release 11.1.6 and then updated our AWS Cloudformation scripts to make it available to you. Here are some of the important changes that our 11.1.6 deployments on AWS now have:

Walkthrough: Deploying a SOC 2-ready Cluster on AWS

Here’s the whole process, start to finish, for a jambonz large deployment on AWS. In a large deployment every role (SIP, media, feature servers, web, monitoring, recording) runs on its own servers, and the SIP, media, feature server, web and recording tiers each scale in their own Auto Scaling group. It’s the size we recommend for production in regulated environments.

jambonz large on AWS: Auto Scaling groups across two Availability Zones, internet-facing and internal load balancers, Aurora, Multi-AZ Redis, and the built-in SOC 2 controls

Step 1: Generate the Template for Your Region

jambonz images are published as public AMIs. A short script copies them into your own AWS account, encrypts the underlying volumes, and then writes a CloudFormation template with the proper AMI mappings for your region. Clone the jambonz CloudFormation repository and run:

./generate-cf.sh

The script asks for three things: the deployment size (choose large), the CPU architecture (we support both amd64 and arm64 (Graviton processors), and your AWS region. It then copies the AMIs, which takes 5 to 15 minutes, and finally generates a Cloudformation file such as jambonz-large-eu-west-3-arm64-v11.1.6.yaml.

Step 2: Upload the Template

In the AWS console, go to CloudFormation → Create stack. Choose Upload a template file, and pick the file the script wrote.

Uploading the generated template in the CloudFormation console

Step 3: The Required Parameters

Give the stack a name, then fill in the three values the template requires.

The stack name and the three required parameters

SOC 2: the SSH CIDR is your logical access control at the network level (criteria CC6.1 and CC6.6). An auditor will look for administrative access limited to known sources. If you enter 0.0.0.0/0 here, you open SSH to the whole internet, and you’ll have to explain why.

Step 4: The Web Tier

Choosing the load-balanced web tier

Set Web tier deployment to autoscaling-alb. This runs one to four web servers in an Auto Scaling group behind an Application Load Balancer that terminates TLS.

If your domain is in Route 53, enter its hosted zone ID. The stack then issues the TLS certificate through AWS Certificate Manager, validates it, and creates the DNS records for the portal and the API. If your DNS lives elsewhere, leave the zone blank and supply an ACM certificate ARN instead.

The third-party API keys below are optional. Leave a key blank if you don’t use the service. Any key you do enter is hidden in the console and stored in Parameter Store, not on the servers’ disks.

SOC 2: the load balancer enforces TLS 1.2 or higher, with a certificate AWS renews automatically. That covers encryption in transit for the portal and the API (CC6.7), and it removes an expired certificate as a cause of an outage or a finding.

Step 5: Compute

Choosing the CPU architecture and instance types

Choose amd64 or arm64 (AWS Graviton, lower cost per vCPU) to match the AMIs you copied. Leave the instance types blank to get defaults suited to your architecture and region. There’s nothing audit-specific here; size for your call volume.

Step 6: Database, Cache and Networking

Database, cache and VPC settings

The defaults suit most deployments. Aurora Serverless v2 scales between the minimum and maximum capacity you set here. Notice what you don’t enter: a database password. The stack generates one and stores it in Secrets Manager, so no person ever has to see it.

The VPC and subnet ranges only matter if this VPC must connect to your existing networks without overlapping.

SOC 2: the database is encrypted at rest, keeps 30 days of backups, can’t be deleted by accident, and logs every connection attempt. Those settings are fixed in the template, not offered as parameters, so nobody can turn them off by mistake. They support confidentiality (C1.1), your backup and recovery evidence (A1.2), and monitoring (CC7.2).

Step 7: Features, Logging, Monitoring and Encryption

Features, logging and OpenTelemetry settings

This group holds the settings an auditor will care about most:

SOC 2: retained, centralized logs are the evidence an auditor samples to confirm you monitor your systems (CC7.2). Encrypted disks cover data at rest (CC6.1). Keep in mind that the application logs no longer contain caller transcripts at the default log level. Leave the log level at info in production, and turn on debug logging for an account only for as long as a support case needs it.

Step 8: Tags and Permissions

Adding tags to the stack

Add tags such as Application=jambonz and Environment=production. CloudFormation applies them to the resources it creates. This is an optional step, but it gives you an asset inventory you can filter on, which is another thing auditors ask for.

Acknowledging that the stack creates IAM roles

At the bottom of the page, acknowledge that the stack creates IAM resources. These are the least-privilege roles for each server tier. Each grants only the API calls that tier’s software makes, such as reading its own parameters from Parameter Store or completing an Auto Scaling lifecycle action. Review them in IAM after the stack is up. An auditor may ask you to show that no server holds broader access than it needs (CC6.3).

Then click Next, review, and Submit. You can follow progress on the stack’s Events tab.

Step 9: Outputs and First Sign-in

The stack outputs, including the portal URL and initial password

When the stack finishes, the Outputs tab lists the portal URL, the SBC addresses to give your carriers, and the portal’s initial password. That password is the stack’s unique ID, so it differs for every deployment. You must change it the first time you sign in.

After The Stack Is Up

A few steps finish the job:

  1. Sign in and change the admin password. The portal requires it.
  2. Activate your jambonz license (licensing.jambonz.org).
  3. Turn on SIP over TLS, if your carriers or SIP clients support it. Store your certificate in Parameter Store as TLS_PRIVKEY, TLS_CERT and TLS_CHAIN under /jambonz/<stack>/sbc. Each SBC enables TLS on port 5061 and WSS on port 8443 when it boots.
  4. Narrow the SIP and RTP source ranges to your carriers’ addresses if you know them. The template’s AllowedSipCidr, AllowedRtpCidr and AllowedHttpCidr parameters default to open, because most deployments take calls from many sources.
  5. Restrict who can read /jambonz/<stack>/ in Parameter Store. The servers can read their own secrets; your people should need a reason to.

What You Still Need to Do for SOC 2 Compliance

A CloudFormation template can harden a deployment. It can’t run your security program. These controls sit at the AWS account or company level, and an auditor will ask about them too:

That list is shorter than it would be if you were also building the voice platform’s controls yourself. That’s the point.

Get Started with a SOC 2-Ready Self-Hosted Voice AI Platform on AWS

jambonz 11.1.6 is available now as public AMIs in 30 AWS regions, for both amd64 and arm64, and as Debian packages. Start with the AWS self-hosting guide, or contact us about running jambonz in your environment. If you’re preparing for an audit of your own, we’re happy to compare notes.

SOC 2 Criteria Referenced in This Guide

SOC 2 reports test controls against the AICPA’s Trust Services Criteria. Every SOC 2 report covers the Security category, also called the common criteria (the “CC” codes). Availability and Confidentiality are optional categories that you choose to include. The summaries below are our own wording. The official text is in the AICPA’s 2017 Trust Services Criteria (With Revised Points of Focus – 2022), a free download that requires an AICPA account.

Frequently asked questions

Can self-hosted Voice AI be SOC 2 compliant?

Self-hosted Voice AI can be SOC 2 compliant, but not by default. A SOC 2 audit tests controls such as encryption, least-privilege access, secrets handling and log retention, and most self-hosted voice frameworks leave all of that for you to build. jambonz 11.1.6 includes those controls in its AWS deployment, so your own SOC 2 work can focus on your policies and your people.

Does deploying jambonz with these templates make my company SOC 2 compliant?

No, software can do that on its own. SOC 2 is a report on your organization's controls. The 11.1.6 templates take care of the infrastructure controls an auditor will test on your voice platform, such as encryption, least-privilege access, secrets handling and log retention. Your policies, your people's access and your account-wide logging are still yours to put in place.

Where does call data live when I self-host jambonz?

In your own AWS account, inside a VPC you control. Call records, recordings, logs and secrets stay under your IAM policies and your audit logs, not in a third party's network.

Does jambonz write caller transcripts to its logs?

Not at the default log level. Starting with 11.1.6, caller transcripts and DTMF digits are logged only at debug level, and credentials for listen websockets are never written to the logs.