Update – October 2020 – This post will take you through the whole process of getting an Azure IoT Hub setup and linking Azure SQL Edge running from a Raspberry Pi to it.
If you want to just run Azure SQL Edge without the IoT Hub, you can follow the MS Docs here: –
https://docs.microsoft.com/en-us/azure/azure-sql-edge/disconnected-deployment
One of the coolest new projects out there is Azure SQL Database Edge: –
https://azure.microsoft.com/en-us/services/sql-database-edge/
This allows SQL to run on ARM devices, just think how many devices are out there that run ARM.
That includes my favourite device, the Raspberry Pi.
So, let’s run through how to get SQL running on a Raspberry Pi!
First, Azure SQL Database Edge is in public preview so we’ll need to sign up here.
Once in the preview we need to set up our Raspberry Pi. We’ll need to use a 64-bit OS (Raspbian is 32-bit) so for this setup we’re going to use Ubuntu 18.04 which can be downloaded here.
Once downloaded, plug the SD card into a laptop and use Rufus to flash the card: –
Enable ssh by dropping a file called ssh onto the boot partition of the SD card (see Section 3 here).
Then plug the SD card into the Pi, and connect the Pi to a router (this avoids having to attach a monitor and keyboard in order to setup a wifi connection).
Power on the Pi and give it a minute to spin up. To find the Pi’s IP address we can use nmap to scan the local network: –
nmap -sP 192.168.1.0/24
Then ssh to the Pi via (default username and password is ubuntu): –
ssh ubuntu@<THE PI IP ADDRESS>
N.B – We’ll be prompted to change our password when we first log in.
Ok, that’s our Pi ready to go. Now, in order to get Azure SQL Database Edge running on it we need to create an IoT Hub in Azure and connect our Pi to it. This will then allow us to create a deployment in Azure that’ll push SQL Edge down to our Pi and run it in a Docker container.
To set the Iot Hub up, we’re going to use the azure-cli.
In order to use the IoT commands we need to make sure that we’ve got at least v2.0.70 of the azure-cli installed:-
az version
N.B. – We can grab the .msi to update azure-cli here.
Now add the azure-iot extension: –
az extension add –-name azure-iot
Log in to azure: –
az login
Create a resource group to hold all the objects that we are going to create: –
az group create --name edge1 --location eastus
Now we can create an IoT Hub: –
az iot hub create --name ApIotHub1 --resource-group edge1
Register a device with the hub: –
az iot hub device-identity create --device-id raspberry-pi-k8s-1 --hub-name ApIotHub1 --edge-enabled
Retrieve the connection string for the device: –
az iot hub device-identity show-connection-string --device-id raspberry-pi-k8s-1 --hub-name ApIotHub1
Once we have the connection string, we can install the IoT Edge runtime on the Raspberry Pi.
SSH into the Pi: –
ssh ubuntu@<THE PI IP ADDRESS>
Get the repository information: –
curl https://packages.microsoft.com/config/ubuntu/18.04/multiarch/prod.list > ./microsoft-prod.list
Copy the repository to the sources list: –
sudo cp ./microsoft-prod.list /etc/apt/sources.list.d/
Install the MS GPG public key: –
curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg sudo cp ./microsoft.gpg /etc/apt/trusted.gpg.d/
Now we can install the container runtime. Note that we’re not installing Docker, we’re installing the tools from the Moby project (which is the project that docker is built from, so the commands we’re familiar with, docker run, docker images etc. are available): –
sudo apt-get update && sudo apt-get install –y moby-engine moby-cli
Install the IoT Edge security daemon: –
sudo apt-get install –y iotedge
Now we need to add our connection string to the security daemon config: –
sudo nano /etc/iotedge/config.yaml
Find the section below and add the connection string obtained earlier (remove “connectionString”: from it): –
'provisioning: source: "manual" device_connection_string: "CONNECTION STRING' \
Save the changes, exit, and restart the security daemon: –
sudo systemctl restart iotedge
And then confirm that the daemon is running: –
sudo systemctl status iotedge sudo iotedge check sudo iotedge list
N.B. – We may have to ctrl+c out of the check command.
We can also check that the agent image is there: –
docker image ls
Ok, everything is setup! Now we can install SQL Edge on the Raspberry Pi!
Go back to the portal and search for Azure SQL Edge: –
Select Azure SQL Database Edge Developer and hit Create: –
On the next page, hit Find Device. The Raspberry Pi should be there: –
Select the device and on the next page hit Create: –
This will take us to a page to configure the deployment: –
Click AzureSQLDatabaseEdge and on the Environment Variables page, enter a SA Password: –
Hit Update and then Review + Create: –
Review the JSON, it should all be OK, and hit Create.
This will take us back to the hub page: –
The IoT Edge Module Count should be 3. Click on the device: –
Now we’re waiting for the modules to be deployed to the Raspberry Pi.
After a few minutes we should see (don’t worry if there’s a 500 error, it’ll clear once the images are pulled to the device): –
And on the Pi itself: –
docker image ls
docker container ls
If the container is up and running, we can connect remotely using our Pi’s IP address in SSMS (or ADS): –
And that’s Azure SQL Database Edge running on a Raspberry Pi! How cool is that?!
Thanks for reading!
i am following your steps for installing Azue Sqk Database Edge on a RaspPi.
it was going great until this step:
ubuntu@ubuntu:~$ sudo apt-get install -y iotedge
Reading package lists… Done
Building dependency tree
Reading state information… Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:
The following packages have unmet dependencies:
iotedge : Depends: libssl1.0.0 (>= 1.0.2~beta3) but it is not installable
Depends: libiothsm-std (= 1.0.9.1-1) but it is not going to be installed
E: Unable to correct problems, you have held broken packages.
I am not an ubuntu user so i do not have any idea what this means or how to correct it. do you have any ideas?
(Could it be that I have v.2.6 of AZ-CLI? I could not find v.2.7)
Thanks for your help
You’ll need the most recent version of azure-cli. You might also need to remove an old package, have a look at the solution here: –
https://github.com/Azure/azure-iot-cli-extension/issues/165
Thank you for this! Question: what is the default username? Troubleshooting issues with SSMS and ADS not connecting using sa as username. I’ve double checked the password in IOT Hub and port binding. Thanks!
Thank you for this great guide. I can’t seem to connect to the installed DB. The container is running, ports bound… all very much like your tutorial. However, using ADS or SSMS I’m getting an error about the connection string not being correct. I’ve tried default usernames of sa and SA. My raspi can otherwise be connected to. Thank you!
sa is the default username, and the password should be set in the Azure Portal. Server name is the IP Address of the PI on your network.
If SA_PASSWORD isn’t working, try MSSQL_SA_PASSWORD as the environment variable name.
i used that raspi image but can’t install moby because libseccomp2 is 2.3.3-4 but needs to be greater than 2.4.0:
moby-containerd : Depends: libseccomp2 (>= 2.4.0) but 2.3.3-4 is to be installed
I used Ubuntu 18.04 for this setup, the error you’re getting looks to be an issue with Raspbian
i can’t install moby because it depends on libseccomp2 > 2.4.0 but the only one i can install is 2.3.3-4. using the raspberry pi os you mentioned. I built 2.4.4 from source but I can’t link it so that my package manager recognizes it. This was the error message:
moby-containerd : Depends: libseccomp2 (>= 2.4.0) but 2.3.3-4 is to be installed
sorry for all the comments, but this post really helped me resolve my issues: https://internetofthing.io/post/how-to-setup-raspberry-pi-as-an-azure-devops-agent
One final question, when connecting from ADS can I just use Azure Active Directory authentication? Getting:
A connection was successfully established with the server, but then an error occurred during the pre-login handshake. (provider: HTTP Provider, error: 0 – )
Azure Active Directory isn’t something I have too much experience with I’m afraid.
that’s fine, scrolled up and saw your comment so i can just use SQL login/password.
would it be as simple as opening a port forward to have the database accessible from my public ip or would that be insecure?
I wouldn’t open it up publicly as you’re right, it’ll be insecure.
ok feel free to delete all my comments, just saw the other one that says “sa” is the username, now I can access it! this is sick, thanks