Overview of Command Line Deployment and Management with the Windows Azure SDK for PHP
June 7, 2012 update: The Microsoft Windows Azure team has released a new Windows Azure SDK for PHP. This release is part of an effort to keep PHP client libraries up to date with new Windows Azure features and to make PHP a first-class citizen in Windows Azure. The latest client libraries are on GitHub: https://github.com/WindowsAzure/azure-sdk-for-php. While the SDK hosted on CodePlex will continue to work for the foreseeable future, it is strongly recommended that new PHP/Windows Azure application use the SDK hosted on GitHub.
The work done by Maarten Balliauw and other contributors in building the SDK hosted on CodePlex was critical in unifying the PHP developer experience for Windows Azure. The Windows Azure team is grateful to these contributors for their pioneering work and looks forward to their continued support (and yours!) in adding to the new SDK on GitHub.
Thanks,
The Windows Azure Team
I’ve been exploring the Windows Azure SDK for PHP command line tools that allow you to create, deploy, and manage new hosted services and web roles. In this post, I’ll walk you through a the basics of using the tools, but first I want to point out a couple of the benefits that come to mind when using these tools:
- The tools are platform-independent (with the exception of the package tool). The service, certificate, and deployment tools essentially wrap the REST-based Windows Azure management API. (If you look at the files in the SDK, you’ll notice that there are .bat and .sh files for these tools.) So, you can manage your Windows Azure services and deployments from the platform of your choice. (Note that because the management API is REST-based, you can use it via the language of your choice, not just PHP. In fact, tools based on languages other than PHP already exist - See this Ruby example on github.)
- The tools allow you to programmatically manage your Windows Azure services and deployments.This series of articles, Building Scalable Applications for Windows Azure, demonstrates how to programmatically scale an application using the PHP classes in the SDK. The same type of management is possible with the command line tools.
In the rest of this post, I’ll assume that you have set up the Windows Azure SDK for PHP and that you have a ready to deploy application (see Packaging Applications).
Overview of service, certificate, and deployment tools
The operations exposed by the service, certificate and deployment tools should give you a good idea of what you can do with them. The following tables list the operations that are available. For more information (such as short operation names and parameter information), type the tool name at the command line.
service
Operation |
Description |
list | Lists the hosted services for a specified subscription ID. |
getproperties | Gets properties (ServiceName, Label, AffinityGroup, Location) for specified hosted service. |
getproperty | Get a single hosted service property (ServiceName, Label, AffinityGroup, Location) |
create | Creates a hosted service. |
update | Updates a hosted service. |
delete | Deletes a hosted service. |
Note: The list operation returns two properties: ServiceName and Url. The value of the Url property is the management API endpoint, not the service URL. If you want the service URL, you can create it from the ServiceName property: https://ServiceName.cloudapp.net.
certificate
Operation |
Description |
listcertificates | Lists properties (Thumbprint, CertificateUrl, ThumbprintAlgorithm) for each certificate associated with the specifed hosted service. |
addcertificate | Adds a certificate to the specified hosted service. |
getcertificate | Gets properties (Thumbprint, CertificateUrl, ThumbprintAlgorithm) for a specified certificate. |
getcertificateproperty | Gets a single certificate property (Thumbprint, CertificateUrl, ThumbprintAlgorithm). |
deletecertificate | Deletes a certificate. |
deployment
Operation |
Description |
createfromstorage | Creates a deployment from a remote package file (.cspkg) and service configuration file (.cscfg). |
createfromlocal | Creates a deployment from a local package file (.cspkg) and service configuration file (.cscfg). |
getproperties | Gets properties (Name, DeploymentSlot, Label, Url, Status) for a specified deployment. |
getproperty | Gets a single property (Name, DeploymentSlot, Label, Url, Status) for a specified deployment. |
swap | Swaps deployment slots (production to staging and staging to production) |
delete | Deletes a deployment. |
updateconfiguration | Updates the configuration for a specified deployment. |
updatestatus | Updates the status (Running or Suspended) of a deployment. |
editinstancenumber | Updates the number of instances of a deployment. |
rebootinstance | Reboots a role instance. |
reimageinstance | Reimages a role instance. |
upgradefromstorage | Upgrades a deployment from a remote package file (.cspkg) and service configuration file (.cscfg). |
upgradefromlocal | Upgrades a deployment from a local package file (.cspkg) and service configuration file (.cscfg). |
walkupgradedomains | Walks upgrade domains for a specified deployment. |
Note: The getproperties operation returns 5 properties: Name, DeploymentSlot, Label, Url, and Status. The value of the Name property is the deployment ID.
Using the service, certificate, and deployment tools
Creating and uploading a service management API certificate
Before you can use the command line management tools, you need to create certificates for both the server (a .cer file)and the client (a .pem file). Both files can be created using OpenSSL, which you can download for Windows and run in a console.
To create the .pem certificate, execute this:
openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout mycert.pem -out mycert.pem
To create the .cer certificate, execute this:
openssl x509 -inform pem -in mycert.pem -outform der -out mycert.cer
(For a complete description of OpenSSL parameters, see the documentation at https://www.openssl.org/docs/apps/openssl.html.)
Next, you’ll need to upload the .cer certificate to your Windows Azure account. To do this, go to the Windows Azure portal, select Hosted Services, Storage Accounts & CDN, choose Management Certificates, and click Add Certificate.
Now you are ready to use the service, certificate, and deployment tools.
Create a configuration file
The command line tools in the the Windows Azure SDK for PHP support using a configuration file for commonly used parameters. Here’s what I put into my config.ini file:
-sid="my_subscription_id" -cert="path\to\my\certificate.pem"
This makes it possible to use the –F option on any operation to include my SID and certificate.
List hosted services
The following command will list all hosted services:
service list -F="C:\config.ini"
This operation will return two properties ServiceName and Url. As mentioned above, the Url property is the management URL, not the service URL. You can create the service URL from the value of the ServiceName property: https://ServiceName.cloudapp.net.
Create a new hosted service
The following command will create a new hosted service:
service create -F="C:\config.ini" --Name="unique_dns_prefix" --Location="North Central US" --Label="your_service_label"
Note that the value of the Name parameter must be your unique DNS prefix. This is the value that will prefix cloudapp.net to create your service URL (e.g. https://your_dns_prefix.cloudapp.net). When this operation completes successfully, it will return your unique DNS prefix.
Add a certificate
The command below will add a certificate to a hosted service. Note that this isn’t a management certificate, but one that might be used to enable RDP, for example.
certificate addcertificate -F="C:\config.ini" --ServiceName="dns_prefix" --CertificateLocation="path\to\your\certificate.cer" --CertificatePassword=your_certificate_password
Note that the ServiceName parameter takes the DNS prefix of your service. When this operation completes successfully, it returns the DNS prefix of the targeted service.
Create a staging deployment from a local package
Next, to create a new deployment from a local package (.cspkg file) and service configuration file (.cscfg)…
deployment createfromlocal -F="C:\config.ini" --Name="dns_prefix" --DeploymentName="deployment_name" --Label="deployment_label" --Staging --PackageLocation="path\to\your.cspkg" --ServiceConfigLocation="path\to\ServiceConfiguration.cscfg" --StorageAccount="your_storage_account_name"
Again, the Name parameter is the DNS prefix of your hosted service. When this operation completes successfully, it returns the request ID of the request. (Look for future posts on using this request ID with the getasynchronousoperation tool in the SDK.)
Get deployment properties
Once a deployment has been created, you can get its properties:
deployment getproperties -F="C:\config.ini" --Name="dns_prefix" --BySlot=Staging
Note that you get get deployment properties BySlot (staging or production) or ByName (the name of the deployment).
Move staging deployment to production
To move a deployment from staging to production…
deployment swap -F="C:\config.ini" --Name="dns_endpoint"
When this operation completes successfully, it returns the request ID of the request.
Add an instance
And lastly, to change the number of instances for a deployment…
deployment editinstancenumber -F="C:\config.ini" --Name="dns_prefix" --BySlot=production --RoleName="role_name" --NewInstanceNumber=2
Wrap Up
Hopefully, those examples are enough to give you the idea. In future posts, I’ll take a look at how to create scripts using these commands to make deployment and management quick and easy. In the meantime, we would love to hear your thoughts on these command line tools. How usable are they for you? What’s missing? Etc.
Thanks.
-Brian