Wednesday, 1 February 2017

Microsoft Certification 70-473 : Designing and Implementing Cloud Data Platform Solutions

I recently passed the Microsoft exam 70-473 "Designing and Implementing Cloud Data Platform Solutions", here's my insight into the certification for anyone else thinking of studying and sitting this exam. I've also included a selection of my most useful links I found whilst looking for relevant online content.

Generally, if you have experience with SQL Server (2008+) then focus your study on hybrid scenarios, HA/DR, auditing, monitoring, security and the differences between SQL Server (on-prem Vs Azure) and Azure SQL Database.
Having some Azure certs already will also give you a small head-start. Also, knowing the different MS tools available and when to use them was key.

With the absence of any MS Exam References and Certification videos my preparation material was based on MSDN, Azure and Technet articles, so lots and lots of online reading. I did find various online videos that dealt with specific aspects of the exam, but in the end I stuck to the docs and took the Mindhub practice exam I had as part of the (no longer available) Microsoft Exam Booster Pack.

I hope these prove useful (Note: not all objective areas have a link, if you find a good one then let me know)...


·         Design a hybrid SQL Server solution
o    Design Geo/DR topology,
o    design a data storage architecture,
o    design a security architecture,
o    design a data load strategy
·         Implement SQL Server on Azure Virtual Machines (VMs)
o    Provision SQL Server in an Azure VM,
o    configure firewall rules,
o    configure and optimise storage,
o    migrate an on-premises database to Microsoft Azure,
o    configure and optimise VM sizes by workload
·         Design a SQL Database solution
o    Design a solution architecture,
o    design Geo/DR topology,
o    design a security architecture,
o    design a data load strategy,
o    determine the appropriate service tier
·         Implement SQL Database
o    Provision SQL Database,
o    configure firewall rules,
o    configure active geo-replication,
o    migrate an on-premises database to SQL Database,
o    configure for scale and performance
·         Design and implement data warehousing on Azure
o    Design a data warehousing solution on Azure,
o    design a data load strategy and topology,
o    configure SQL Data Warehouse,
o    migrate an on-premises database to SQL Data Warehouse

·         Design and implement SQL Server Database security
o    Configure firewalls;
o    manage logins, users and roles;
o    assign permissions;
o    configure auditing;
o    configure transparent database encryption
·         Implement Azure SQL Database security
o    Configure firewalls;
o    manage logins, users, and roles;
o    assign permissions;
o    configure auditing;
o    configure row-level security;
o    configure data encryption;
o    configure data masking;
o    configure Always Encrypted

·         Design and implement high availability solutions
o    Design a high availability solution topology,
o    implement high availability solutions between on-premises and Azure,
o    design cloud-based backup solutions,
o    implement backup and recovery strategies
·         Design and implement scalable solutions
o    Design a scale-out solution,
o    implement multi-master scenarios with database replication,
o    implement elastic scale for SQL Database
·         Design and implement SQL Database data recovery
o    Design a backup solution for SQL Database,
o    implement self-service restore,
o    copy and export databases

·         Monitor and troubleshoot SQL Server VMs on Azure
o    Monitor database and instance activity,
o    monitor using dynamic management views (DMVs) and dynamic management functions (DMFs),
o    monitor performance and scalability
·         Monitor and troubleshoot SQL Database
o    Monitor and troubleshoot SQL Database,
o    monitor database activity,
o    monitor using DMVs and DMFs,
o    monitor performance and scalability
·         Automate and manage database implementations on Azure
o    Manage SQL Server in Azure VMs with PowerShell,
o    manage Azure SQL Database with PowerShell,
o    configure Automation and Runbooks

Related Videos

Ignite Exam Prep Session - Channel 9
Exam Boot Camp - MAPA
1.1/3.1 SQL Server HA/DR with Azure
1.2 Migrate SQL Server to Azure
1.2 SQL Server in Azure VMs
1.4/4.2 Hybrid Cloud workloads SQL
1.5 Elastic Data Warehouse as-a-service
2.2 Securing data in SQL Database
3.1 Design a scale-out solution
3.2 Elastic Database with Azure SQL Database
3.3 Implementing SQL Database Data Recovery
4.1 Monitor and Troubleshoot SQL Server
4.3 SQL Server and SQL Database Powershell

Other Links

General Introduction
SQL Server on Azure VMs Learning Path
SQL Database Intro
TechNet SQL Server Reference
MSDN SQL Server Reference
SQL Server (2008) Data Loading White Paper
SQL Server Customer Advisory Team (SQLCAT)
SQL Server Solution Design
Hybrid SQL Server Scenarios
Migrate On-prem to Azure VMs
Training Course

Wednesday, 25 January 2017

Use tags to drill into Azure Enterprise Billing with Power BI

Whilst Power BI's Azure Enterprise Content Pack gives you pre-built dashboards to expose your Azure Enterprise costs, it may not provide the level of detail required to really drill-down into the finer detail of resource costs for your Azure subscriptions.

What if you wanted to tag resources to identify those that belong to your enterprises products or services and report on costs for each. For example, perhaps you'd like to be able to find out how much was spent on Azure Compute resources (Virtual Machines) and storage during the first month of an online service that you've just launched. Your VMs might be spread across Resource Groups, with their storage being held in storage accounts in multiple regions. In order to easily differentiate those resources that are dedicated to the new service from existing resources you could tag those resources as follows:

"service" : "ournewservice"

Using Microsoft's Power BI you can then connect to your Azure Enterprise billing data via the Azure Enterprise (Beta) Data Connection, see here.


The Power BI approach then enables reports and dashboards to be built that display Azure Resource costs per service, by grouping and filtering on resource tags. If you have multiple tag names, then Power BI gives you the ability to split these out into dedicated columns from which tag-specific reports can be built.

Thursday, 19 January 2017

PowerShell Pea - Check Disk Usage on Remote Windows Servers using PowerShell

Found this useful script today that (given a list of Windows server names) will check the disk usage on each Windows Server (whose name is supplied in a file) and can also report results back via email.

It demonstrates an alternative to PowerShell remoting, if you want to build reports across a number of servers using a script and need to avoid labour-intensive checks of each server via RDP, for example.

Wednesday, 11 January 2017

Deploying Azure Virtual Networks with multiple CIDR addresses using ARM templates

I recently had to craft an ARM template in Azure for a Virtual Network that had an address space that wasn't sized as a "to the power of two".

i.e. this would be simple if you're creating a Vnet for an address space of say 256 addresses, such as
10.1.0.0 - 10.1.0.255 = 10.1.0.0/24
You can use a parameter of type "string" in the template, so assuming you arrange your parameters and template into 2 files, the parameters would include:
"vnetAddressPrefix": {
    "value": "10.1.0.0/24",
}
And the template itself would include the parameters and resource definitions for the Vnet as follows:
"vnetAddressPrefix": {
    "type": "string"
}
...
"resources": [ {
    "type": "Microsoft.Network/virtualNetworks",
    "name": "my256Vnet",
    "apiVersion": "2016-03-30",
    "location": "[resourceGroup().location]",
    "properties": {
        "addressSpace": {
            "addressPrefixes": [
                "[parameters('vnetAddressPrefix')]"
            ]
        },
        "subnets": [ {
            "name": "default",
            "properties": {
                "addressPrefix": "10.1.0.0/28"
            }
        }
        ]
    }
}
]

But, lets say you need a Vnet with 384 addresses, such as
10.1.0.0 - 10.1.1.127
Because you can't specify this range in a single CIDR address, you would instead need to create an address space in CIDR notation of
10.1.0.0/24
10.1.1.0/25
The simple "string" parameter used in the first example will not work here, instead you should use a parameter of type "array", modifying the parameter file to include the CIDR ranges as follows:
"vnetAddressPrefixes": {
    "value": [
            "10.1.0.0/24",
            "10.1.1.0/25"
    ]
}
And then changing your template file to include parameters and resource definitions as follows:
"vnetAddressPrefixes": {
    "type": "array"
}
...
"resources": [ {
    "apiVersion": "2016-03-30",
    "type": "Microsoft.Network/virtualNetworks",
    "name": "my384Vnet",
    "location": "[resourceGroup().location]",
    "properties": {
        "addressSpace": {
            "addressPrefixes": 
                "[parameters('vnetAddressPrefixes')]"
        },
        "subnets": [ {
            "name": "default",
            "properties": {
                "addressPrefix": "10.1.0.63/24"
            }
        }
        ]
    }
}
]

That's it! Although it's unlikely that a deploying Vnets in a greenfield environment would require this solution, it still may happen, and is more likely to happen in an environment where address space is already constrained by other Vnets and addressing conventions.

Wednesday, 4 January 2017

AWS Glue: The future of ETL is nigh

AWS will soon be launching a fully managed ETL as-a-service which promises to automate "data discovery, conversion, mapping, and job scheduling tasks" wherever your data lives, this is not just for your data stored in AWS.

AWS Glue, will provide the ETL layer that links AWS data services (S3RDS and Redshift etc) to their and analytics services, such as Quicksight.

I for one am fascinated to see what it can do and discover real-world use-cases that can take advantage of AWS Glue, building it into the architecture of Big Data Cloud solutions.

Wednesday, 28 December 2016

Globally Unique Identifiers - Creating GUIDs in Powershell

Powershell Pea...

New-Guid

I've been working more and more with Powershell, specifically with Azure Automation and scripting and wanted to share a useful Cmdlet for creating GUIDs. This link provides more detail, but ultimately this command will provide you with a unique ID that can be assigned to arbitrary objects that require a unique ID.

Bear in mind that this doesn't protect you from duplicates, but the probability of them occurring is small. So if you need GUIDs for relatively small record/object sets and your application can handle the prospect of duplicates, then this function is a quick way to generate a "unique" ID.

See this link for more details on GUIDs/UUIDs.

Wednesday, 21 December 2016

Azure Premium Storage Blob Snapshot Error - 409 Conflict

I've recently been working in more detail with Azure blob snapshots and (by trial and error) discovered that Premium storage imposes limitations on the number and frequency of snapshots that can be performed on a single blob.

If you create a snapshot of a Premium storage blob and then another in quick succession (within 60 seconds of each other), then you might get a 409/Conflict error message.

This article suggests that there are two possibilities for this error, either

  • SnapshotCountExceeded - You've exceeded the limit of 100 snapshots per blob, or
  • SnaphotOperationRateExceeded - You've exceeded the limit of snapshots within a time window (stated as 10 minutes, but I observed this as closer to 1 minute)
Whilst it's unlikely that these limits would cause a problem in practice, it's something to keep in mind when developing/testing solutions that make use of the blob snapshot facility.

Wednesday, 14 December 2016

Azure Automation Troubles

A recent venture into Azure Automation threw up some unexpected problems.

A simple script, run locally, that called Get-AzureRmVM was working to my subscription, but the same script did not work within an Azure Runbook.

I'd created the AzureRunAsConnection by default with the Azure Automation account and followed the same code as given in the AzureAutomationTutorialScript powershell runbook to login to the subscription and execute Cmdlets.

The problem came when executing the Get-AzureRmVM Cmdlet in the runbook, receiving the error:
Get-AzureRmVM : Run Login-AzureRmAccount to login.
+     $VM = Get-AzureRmVM | ? {$_.Name -eq $VMName}
+           ~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [Get-AzureRmVM], PSInvalidOperationException
    + FullyQualifiedErrorId : InvalidOperation,Microsoft.Azure.Commands.Compute.GetAzureVMCommand

After several googles I found this post...
https://feedback.azure.com/forums/246290-automation/suggestions/16590229-get-azurermvm-failing-in-azure-automation

Therefore, if anyone else sees errors when running basic Cmdlets in a runbook (that work fine from PowerShell), try updating all the modules in the Automation account using a script like this one...
https://www.powershellgallery.com/packages/Update-ModulesInAutomationToLatestVersion/1.03/DisplayScript
(Note that the deploy to Azure button didn't work for me, so I had to import the script and run manually.)

Note also that (depending on when you created your Automation Account) the above may, or may not work, and you may have to create a new Automation Account and update the modules before starting to use the account. Microsoft suggest setting the script to run on a schedule in the automation account to keep the modules up to date.