Build your APIs with DAB using containers. - Azure SQL Devs’ Corner
Build your APIs with DAB using containers. - Azure SQL Devs’ Corner
Theme Sign in
Dev Blogs Technology
Azure SQL Devs’ Corner Build your APIs with DAB using Containers – Part 1
Languages
December 12th, 2023
.NET
Build your APIs with DAB using Containers – Part 1
Platform Development
Carlos Robles
Senior Product Manager
Data Development
Table of contents
Container
DAB’s workflow
Library demo
Prerequisites
Conclusion
Show Less
Feedback
Read next
Jerry Nixon
February 6, 2024
Muazma Zahid
Are you tired of spending countless hours building APIs from scratch? With Data API Builder
(DAB), you can create your API in just minutes! All you need to do is create a JSON configuration
file to describe your database entities (tables, views, stored procedures, or collections) from your
Azure SQL Database, SQL Server, Cosmos DB, PostgreSQL, or MySQL database. In this blog series,
I will share a few examples of how to build your APIs with DAB using containers!
Using containers to build your APIs with DAB provides a consistent, isolated, portable, and
lightweight local development experience that makes team collaboration easier.
Once the local development is completed, one possible next step is to deploy the same solution
consistently to Azure services such as Azure Container Apps and Azure SQL Database.
Container
DAB’s workflow
The traditional DAB workflow requires to install it first. Once installed, you need to initialize DAB’s
engine with a JSON configuration file, add your entities, and finally start DAB’s engine to get up
and running. It’s a simple process that can be completed with just a few commands:
Copy
As mentioned before, the DAB workflow is simple enough. However, containers further simplify
this process by eliminating the need for tool installations (except for the container runtime) and
going through each individual step. This not only reduces errors but also enhances reproducibility
in the workflow.
This portability facilitates seamless deployment on various platforms, fostering collaboration and
accelerating development processes. Overall, containerization aligns with modern DevOps
practices, providing efficiency and scalability in software delivery.
Let’s have a look at the first example of using DAB with containers.
Feedback
Library demo
The following diagram represents the container architecture for this demo. The SQL-Library
container manages data securely with Microsoft SQL Server 2022, while the DAB-Library container,
powered by Data API Builder, offers REST and GraphQL endpoints that will make requests to our
database.
Solution architecture
This agile setup ensures efficiency and scalability for modern applications.
Prerequisites
These are the some required and option prerequisites to run DAB and SQL Server on containers:
Docker / Podman
GitHub (optional)
I will start this container exercise by creating Docker network. This virtual network will help the
SQL Server container and DAB container talk to each other using the container hostname. It will
also provide isolation and a private channel for our containers in this example.
Feedback
Copy
# Create docker network
docker network create library-network
This step is not needed when using Docker Compose, we will see some examples further in
these blog series.
Many documentation articles and examples exist for creating a SQL Server container using
Docker. You can check the latest version of SQLCmd (Go), which allows you to create a SQL Server
container with a single command following this Quickstart article. Or, if you are not familiar with
SQL Server containers check this other Quickstart article that provides greater details.
The following docker run command will create an SQL Server container. It takes “SQL-Library” as
the container name and the hostname.
It configures the container with essential environment variables, including the SQL Server System
Administrator (SA) password set to P@ssw0rd! for security. For connectivity purposes, it maps
the host port 1401 to container port 1433 for external access while connecting it to the previously
created network library-network.
Finally, it runs the container in the background using Microsoft SQL Server 2022 latest container
image available for Ubuntu 20.04.
Copy
# SQL Container
docker run \
--name SQL-Library \
--hostname SQL-Library \
--env 'ACCEPT_EULA=Y' \
--env 'MSSQL_SA_PASSWORD=P@ssw0rd!' \
--publish 1401:1433 \
--network library-network \
--detach mcr.microsoft.com/mssql/server:2022-latest
Feedback
When running Docker on an ARM chip-based machine, ensure to include the –platform
linux/amd64 option in your docker run command.
You can use your preferred tool to execute the SQL script to create the sample database. However,
I recommend using Azure Data Studio. If you are unfamiliar with Azure Data Studio, you can learn
more you can learn more in Azure Data Studio here: aka.ms/azuredatastudio
Connect to your SQL Server container using localhost as server name, 1401 as port, and SA user
and password. Then, execute the library.azure-sql.sql script included in the demo repository, to
create the library database and all its objects.
This script initializes a library database with tables for books, authors, and their associations. It
establishes a sequence for unique identifiers and includes sample data. Additionally, it creates a
view (vw_books_details) for book details with aggregated author information. Finally, a stored
procedure (stp_get_all_cowritten_books_by_author) fetches books co-authored by a specified
author, supporting both partial and exact searches.
Feedback
ADS – Library database
Now that our Library database is ready, it is time to start working on the API side using DAB. The
DAB container image requires only one parameter the JSON configuration file where you need to
define the connection string and the database entities.
Because we are working in this containerized environment, you don’t need to go through the
usual DAB workflow (dab init, dab add, dab start). Once the container is started through the
docker run command, the DAB engine will be listening on the defined port.
This repository uses the following folder structure to store DAB’s configuration files:
Copy
Feedback
├── DAB-Config
├── .env
└── dab-config.json
With the flexibility that Docker provides in leveraging environment variables, I will be utilizing the
.env file included on the demo repository to securely store sensitive information such as my
database connection string. By defining the necessary variables in the .env file, like the example
below:
Copy
CONN_STRING=Server=SQL-Library;Database=library;User ID=SA;Password=P@ssw0rd!;
The data source section of the JSON configuration file is where you define the database type and
connection string. Notice how this configuration file dynamically incorporates the securely stored
connection string by referencing the CONN_STRING environment variable using the @env( )
syntax:
Copy
"$schema": "https://github.com/Azure/data-api-builder/releases/download/v0.9
"data-source": {
"database-type": "mssql",
"connection-string": "@env('CONN_STRING')"
},
"mssql": {
"set-session-context": true
}
This last section enables seamless integration and exposure to your data entities via Data API
Builder, aligning with your application requirements.
Feedback
You can check the complete JSON file in the demo respository.
Setting Up DAB-Library Container
The following docker run command establishes a container named DAB-Library using the latest
version of Microsoft’s Data API Builder:
Copy
# DAB Container
docker run \
--name DAB-Library \
--volume "./DAB-Config:/App/configs" \
--publish 5001:5000 \
--env-file "./DAB-Config/.env" \
--network library-network \
--detach mcr.microsoft.com/azure-databases/data-api-builder:latest \
--ConfigFileName /App/configs/dab-config.json
When running Docker on an ARM chip-based machine, ensure to include the –platform
linux/amd64 option in your docker run command.
This container leverages Docker’s functionality to mount the local folder ./DAB-Config as a
volume inside the container at /App/configs. This is the default path used by DAB’s engine to
read the configuration file, that will be pass to this container in runtime. The host port 5001 is
mapped to container port 5000 for external access while connecting it to the previously created
network library-network.
The environment file flag points to the environment file at ./DAB-Config/.env, managing sensitive
information in this case SQL Server’s connection string. Networking is handled by –network
library-network, connecting the container to the specified network.
Finally, it runs the container in the background using Data API Builder’s latest container image
while setting the configuration file.
To ensure the smooth functionality of your Data API Builder (DAB) container, a series of tests can
be conducted once the container is up and running on your localhost. You can initiate a health
check using the following command:
Copy
curl -v http://localhost:5001
This curl command will return a verbose response, confirming the health status of your DAB
container listening on port 5001.
For testing the DAB runtime REST endpoints, consider using the following commands to retrieve
information about Book and Author entities:
Copy
curl -s http://localhost:5001/api/Book | jq
curl -s http://localhost:5001/api/Author | jq
Additionally, you can leverage the power of jq to filter and display specific data. For example:
Copy
The first curl command retrieves the first two records from the Book entity using the $first=2
query parameter, then uses jq to format and display specific fields, id and title.
The second curl command fetches data from the Author entity and utilizes jq to extract and
present specific fields, focusing on the second record’s id, first_name, and last_name.
When working with GraphQL, you can use tools like curl or browser based GraphQL playgrounds.
For example, using curl:
Copy
Feedback
curl -X POST \
-H "Content-Type: application/json" \
-d '{"query": "{ books(first: 2, orderBy: {id: ASC}) { items { id title } } }"
http://localhost:5001/graphql | jq
And this is how you can build your APIs with DAB using containers.
Conclusion
This first instance of blog series showcased the seamless integration of Data API Builder (DAB)
with containerization for rapid API development. By encapsulating SQL Server and DAB in Docker
containers, developers benefit from a consistent, isolated, and lightweight local environment.
Future topics will delve into advanced container options as Docker compose, also deployment
strategies on Azure, offering insights for both seasoned developers and those new to
containerized workflows. Stay tuned for more practical guidance on how to build your APIs with
DAB using containers.
2 0
Category
Topics
Author
Carlos Robles
Senior Product Manager
With 12+ years navigating the tech landscape, I've evolved from a Software Developer to a Data specialist and
later to a Solutions Architect, and now I work as a Product Manager at Microsoft. I've been honored with
prestigious awards, including Microsoft MVP, and recognition in the Redgate 100 for DevOps excellence.
Currently, I specialize in empowering developers to embrace Azure SQL. As an international speaker, author, and
mentor, I thrive on catalyzing the adoption of Azure SQL among ...
0 comments
Discussion are closed.
Stay informed
Get notified when new posts are published.
Returns
Microsoft Copilot Microsoft 365 Platform Microsoft Tech Investors
Order tracking Education Community
AI in Windows Microsoft Teams Diversity and
How to buy for inclusion
your school
Explore Microsoft Certified Microsoft 365 Azure Accessibility
products Refurbished Copilot Marketplace
Educator training
Sustainability
and development
Windows 11 apps Microsoft Store Small Business AppSource
Promise
Deals for
Visual Studio
students and
Flexible Payments
parents
Azure for
students
Feedback