BuildApplications/CreateJob.ps1 (97 lines of code) (raw):

param ( [Parameter(Mandatory)] [string] $job, [Parameter(Mandatory)] [string] $subscriptionId, [string] $eventsPerMinute = $(Read-Host -prompt "eventsPerMinute (default: 60)") ) $app = $job.Split("-")[0] if (-not (Test-Path -Path $PSScriptRoot\$app)) { $allApps = (Get-ChildItem $PSScriptRoot -Directory | ForEach-Object { $_.BaseName }) -join ', ' "Application $app not found, you can pick one: $allApps." return } if (-not (Test-Path -Path $PSScriptRoot\$app\$job)) { $allJobs = (Get-ChildItem $PSScriptRoot\$app -Directory | ForEach-Object { $_.BaseName } | Where-Object { -not $_.Contains("DataGenerator") }) -join ', ' "Job $job not found, you can pick one: $allJobs." return } if ('' -eq $eventsPerMinute) { $eventsPerMinute = 60 } if (-not ($eventsPerMinute -match '^[0-9]+$')) { "Invalid eventsPerMinute $eventsPerMinute, it must be number." return } $eventsPerMinute = [int] $eventsPerMinute if ($eventsPerMinute -lt 1) { "Invalid eventsPerMinute $eventsPerMinute, it must greater than 0." return } $isInstallAz = [bool](Get-Command -Name Set-AzContext -ErrorAction SilentlyContinue) if (-not $isInstallAz) { Write-Host "Az Powershell is not installed, please follow the guide to install Az Powershell." return } if ($null -eq (Get-AzContext)) { Write-Host "You are not login Azure, please login by 'Connect-AzAccount'." return } "Will create Storage Account, Azure Function, Event Hub at subscription: $subscriptionId, and generate $eventsPerMinute events to Event Hub per minute." $region = "Central US" $uniqPostfix = (New-Guid).ToString().Replace("-", "").Substring(0, 10) $resourceGroupName = "$job-rg-$uniqPostfix" $storageAccountName = "clickstreamsa$uniqPostfix" $azureFunctionName = "clickstreamfunc$uniqPostfix" $eventHubName = "clickstreameh$uniqPostfix" Set-AzContext -Subscription $subscriptionId -ErrorAction Stop | Out-Null Write-Host "Using subscription:" ((Get-AzContext).Subscription.Name) "Id:" (Get-AzContext).Subscription.Id try { Write-Host -NoNewline "(1/5) Creating Resource Group $resourceGroupName..." New-AzResourceGroup -Name $resourceGroupName -Location $region -ErrorAction Stop | Out-Null Write-Host -ForegroundColor Green " Done" Write-Host -NoNewline "(2/5) Creating Event Hub $eventHubName..." New-AzEventHubNamespace -ResourceGroupName $resourceGroupName -Location $region -Name $eventHubName -SkuName Basic -WarningAction Ignore -ErrorAction Stop | Out-Null New-AzEventHub -ResourceGroupName $resourceGroupName -NamespaceName $eventHubName -Name click-stream-events -MessageRetentionInDays 1 -PartitionCount 1 -WarningAction Ignore -ErrorAction Stop | Out-Null Write-Host -ForegroundColor Green " Done" Write-Host -NoNewline "(3/5) Creating Storage Account $storageAccountName..." New-AzStorageAccount -ResourceGroupName $resourceGroupName -Name $storageAccountName -SkuName Standard_LRS -Location $region -ErrorAction Stop | Out-Null Write-Host -ForegroundColor Green " Done" Write-Host -NoNewline "(4/5) Creating Azure Function $azureFunctionName..." $eventHubKey = (Get-AzEventHubKey -ResourceGroupName $resourceGroupName -NamespaceName $eventHubName -AuthorizationRuleName RootManageSharedAccessKey -WarningAction Ignore -ErrorAction Stop) $appSettings = @{ "eventsPerMinute" = $eventsPerMinute "eventHubConnectionString" = $eventHubKey.PrimaryConnectionString } New-AzFunctionApp -Name $azureFunctionName -ResourceGroupName $resourceGroupName -StorageAccount $storageAccountName -Runtime dotnet -OSType Windows -FunctionsVersion 4 -RuntimeVersion 6 -Location $region -AppSetting $appSettings -DisableApplicationInsights | Out-Null Set-AzResource -ResourceId /subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.Web/sites/$azureFunctionName/basicPublishingCredentialsPolicies/ftp -Properties @{"allow" = $true} -Force | Out-Null Set-AzResource -ResourceId /subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/providers/Microsoft.Web/sites/$azureFunctionName/basicPublishingCredentialsPolicies/scm -Properties @{"allow" = $true} -Force | Out-Null Publish-AzWebApp -ResourceGroupName $resourceGroupName -Name $azureFunctionName -ArchivePath (Get-Item $PSScriptRoot\$app\ClickStreamDataGenerator\CodePackage.zip).FullName -Force -ErrorAction Stop | Out-Null Write-Host -ForegroundColor Green " Done" Write-Host -NoNewline "(5/5) Creating Azure Stream Analytics job '$job'..." $storageAccountKey = (Get-AzStorageAccountKey -ResourceGroupName $resourceGroupName -Name $storageAccountName -ErrorAction Stop).Value[0] $ctx = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $storageAccountKey -ErrorAction Stop New-AzStorageContainer -Name job-output -Context $ctx -ErrorAction Stop | Out-Null if (Test-Path $PSScriptRoot/$app/$job/user-info.csv) { New-AzStorageContainer -Name reference-data -Context $ctx -ErrorAction Stop | Out-Null Set-AzStorageBlobContent -Container reference-data -File $PSScriptRoot/$app/$job/user-info.csv -ClientTimeoutPerRequest 10 -Context $ctx -Force -ErrorAction Stop | Out-Null } $jobParameters = @{ "InputEventHubName" = $eventHubName "InputEventHubKey" = $eventHubKey.PrimaryKey "OutputAccountName" = $storageAccountName "OutputAccountKey" = $storageAccountKey "Region" = $region } New-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName -TemplateFile $PSScriptRoot\$app\$job\JobARMTemplate.json -TemplateParameterObject $jobParameters -ErrorAction Stop | Out-Null Write-Host -ForegroundColor Green " Done" Write-Host -ForegroundColor Green "All resources were deployed successfully. Opening Azure portal in browser." Start-Process "https://portal.azure.com/#@tenant/resource/subscriptions/$subscriptionId/resourceGroups/$resourceGroupName/overview" } catch { try { Write-Host Write-Host -ForegroundColor Red "Create resources failed, reason:" $_ Write-Host -ForegroundColor Red "Will delete resource group '$resourceGroupName'." Remove-AzResourceGroup -Name $resourceGroupName -ErrorAction Stop | Out-Null } catch { Write-Host -ForegroundColor Red "Resource group '$resourceGroupName' delete failed, reason:" $_ } }