Search code examples
azureazure-sql-databaseconnection-stringapplication-settingsstaging

Azure connection string best practices


I have an application that I am just migrating to Azure. Currently I use web.config transformation to manage changing the database connecting string dev/staging/prod environments. How is it best to manage these multiple connection strings in Azure?


Solution

  • In cases where it doesn't matter if the developer can see production credentials, you can use the built-in Visual Studio 10 config transformations. If this is what you're looking for, follow these steps:

    1.Navigate to your Azure project folder in file explorer
    2. Make a copy of ServiceConfiguration.cscfg
    3. Rename copy to ServiceConfiguration.Base.cscfg
    4. For each build configuration (e.g. Dev, Staging, Production), create a ServiceConfiguration.<build config name>.cscfg file. In these files, you can use the normal config transformation syntax
    5. Open your .ccproj file in a text editor
    6. Find the following node,

    <ItemGroup>
        <ServiceDefinition Include="ServiceDefinition.csdef" />
        <ServiceConfiguration Include="ServiceConfiguration.cscfg" />
    </ItemGroup>
    

    and replace it with this (you will have to edit this block to match your build configs):

    <ItemGroup>
        <ServiceDefinition Include="ServiceDefinition.csdef" />
        <ServiceConfiguration Include="ServiceConfiguration.cscfg" />
        <None Include="ServiceConfiguration.Base.cscfg">
            <DependentUpon>ServiceConfiguration.cscfg</DependentUpon>
        </None>
        <None Include="ServiceConfiguration.Dev.cscfg">
            <DependentUpon>ServiceConfiguration.cscfg</DependentUpon>
        </None>
        <None Include="ServiceConfiguration.Staging.cscfg">
            <DependentUpon>ServiceConfiguration.cscfg</DependentUpon>
        </None>
        <None Include="ServiceConfiguration.Production.cscfg">
            <DependentUpon>ServiceConfiguration.cscfg</DependentUpon>
        </None>
    </ItemGroup>
    

    7.Add the following at the end of the .ccproj file, just above </Project>:

    <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets" />
    <Target Name="BeforeBuild">
        <TransformXml Source="ServiceConfiguration.Base.cscfg" Transform="ServiceConfiguration.$(Configuration).cscfg" Destination="ServiceConfiguration.cscfg" />
    </Target>
    

    8.If you're using a CI server that doesn't have Visual Studio 10 installed, you'll probably have to copy the C:\Program Files\MSBuild\Microsoft\VisualStudio\v10.0\Web folder and its contents from a development machine to the server.

    Update: As @SolarSteve noted, you might have to add a namespace to your ServiceConfiguration.*.cscfg files. Here's an example of ServiceConfiguration.Base.cscfg:

    <sc:ServiceConfiguration serviceName="MyServiceName" osFamily="1" osVersion="*" xmlns:sc="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
      <sc:Role name="MyRoleName">
        <sc:Instances count="1" />
        <sc:ConfigurationSettings>
          <sc:Setting name="DataConnectionString" value="xxx" />
        </sc:ConfigurationSettings>
      </sc:Role>
    </sc:ServiceConfiguration>