Microsoft hat heute (still und heimlich und ohne großes Event) die neuen Deutschen Rechenzentren für Azure freigeschalten. Man kann sie auch im Portal schon sehen/auswählen:
Allerdings ist diese Region bisher nur für ausgewählte Kunden nutzbar. Beim Versuch, eine Ressource dorthin bereit zu stellen, kommt derzeit noch ein Fehler:
Einem Beitrag von Microsoft selbst sind auch weitere Details zu entnehmen, auch, wann und wie es weitergeht:
In meinen Workshops und anderen Kundenterminen kommt immer wieder die Frage, wie man Virtuelle Maschinen in Azure nach Zeit gesteuert hoch- und wieder runterfahren kann. Das ist eigentlich ganz einfach – man benötigt dazu nur folgendes:
Einen Azure Automation Account
Ein PowerShell Runbook mit entsprechendem Skript
VMs mit den entsprechenden Tags
Ich habe mich dazu zu folgenden Tags entschieden:
AutoShutdown – Entscheidet, ob die VM automatisch heruntergefahren werden soll; kennt die Werte “Yes” and “No”
AutoShutdownTime – enthält die entsprechende Zeit für den Shutdown im Format HH:mm:ss nach UTC
AutoStartup – Entscheidet, ob die VM automatisch gestartet werden soll; kennt die Werte “Yes” and “No”
AutoStartupTime – enthält die entsprechende Zeit für den Start im Format HH:mm:ss nach UTC
Das PowerShell-Skript findet ihr in meinem GitHub Repo:
Das Skript ist etwas komplexer als die beiden anderen im Repo, berücksichtigt dabei aber auch, dass eine VM ggf. morgens heruntergefahren und abends gestartet werden soll.
Auf Youtube habe ich ein Video veröffentlicht, dass das Vorgehen mit anderen Skripten zeigt:
Für alle Interessierten gibt es hier die Slides und das Recording meiner gestrigen Session zu „DevOps mit OpenSource Tools“ auf dem Global Azure Bootcamp 2019:
Wer kommenden Samstag den 27. April 2019 noch nichts vor hat, dem sei das Global Azure Bootcamp, welches weltweit gleichzeitig an wahnsinnig vielen Orten stattfindet, nahegelegt.
Ich selbst werde in Jena sein, um beim dortigen Bootcamp über Opensource DevOps zu sprechen.
Die folgende Agenda mit spannenden Vorträgen erwartet euch dort:
10:00-10:15 Uhr – Begrüßung 10:15-11:15 Uhr – „Azure Governance – Das Regelwerk für Azure“ – Eric Berg 11:15-11:30 Uhr – Kaffeepause 11:30-12:30 Uhr – „Azure Kubernetes Services (AKS) und Azure DevOps“ – Mark Blume 12:30-13:00 Uhr – Mittag 13:00-14:00 Uhr – “Azure DevOps – aber in OpenSource” – Haiko Hertes 14:00-14:15 Uhr – Kaffeepause 14:15-15:15 Uhr – „Machine Learning in der Cloud mit Azure Machine Learning Service“ – Stefan Hellfritzsch
Wer mehr über das Global Azure Bootcamp und die anderen Locations erfahren möchte, der kann dies hier tun: https://global.azurebootcamp.net/
Ich würde mich freuen, das eine oder andere bekannte Gesicht in Jena zu sehen.
Azure und insbesondere Azure SQL ist klasse – es nimmt einem viele Dinge der täglichen Verwaltung ab, einiges davon sogar automatisch. Klar, das hat seinen Preis, immerhin ist Azure SQL nicht ganz billig, aber wenn man es schon bezahlt, dann kann man auch seine Fähigkeiten nutzen. Eine davon ist, automatisch anhand der Nutzung einer Datenbank Empfehlungen für die Leistungsoptimierung zu geben. Diese kann man sich im UI bzw. dem Azure Portal anschauen. Dazu öffnet man entweder links im Blade den Punkt „Recommondations“ unterhalb von „Intelligent Performance“ oder den Punkt „Performance“ auf der Main-Page bei den Notifications:
Dort sieht man dann einige Empfehlungen aufgeführt (vorausgesetzt, Azure hat etwas gefunden, was wiederum eine regelmäßige Nutzung der Datenbank voraussetzt):
Diese Daten kann man sich auch automatisch abrufen und auf Wunsch dann z.B. an die Entwickler verteilen. Dazu bediene ich mich einfach der PowerShell:
Dieses Script wiederum kann man dann z.B. per Jenkins regelmäßig auslösen. Oder alternativ ein Azure Automation Runbook dafür anlegen… Viel Spaß beim Ausprobieren!
Wie ihr ggf. dem ein- oder anderen Blog-Artikel hier entnehmen könnt, beschäftige ich mich seit einigen Monaten sowohl berufsbedingt als auch aus eigenem Interesse mit Microsoft Azure. Als logische Konsequenz daraus habe ich jetzt bereits einige erste YouTube Videos aus diesem Umfeld aufgezeichnet und veröffentlicht. Ihr findet diese hier:
Konkret geht es in den ersten Videos um ARM Templates und Azure CDN – weitere werden folgen! Schaut mal rein – ich freue mich auf Kommentare, Fragen und Likes!
Jüngst wollte ich mir den Überblick über alle App Settings der vielen Web Apps, die wir einsetzen, und deren Werten verschaffen und dabei auch schauen, ob die Settings in allen Entwicklungs-Stages gleich bzw. analog passend sind. Dazu habe ich ein PowerShell Skript geschrieben, was alle Web Apps in allen aufgeführten Ressource Groups prüft und deren App Settings in ein gemeinsames CSV File exportiert:
# Adjust theese as needed# Change this to the subscription you want to query$SubscriptionId="1234567-890123-132312312"# Name the RG's here, that you want to check[string[]]$ResourceGroups="RG-A","RG-B","RG-C"### no changes needed below ###
Connect-AzureRmAccount -Subscription $SubscriptionId
Set-AzureRmContext -SubscriptionId $SubscriptionId$AllSettings=@()[string[]]$AllURLs=$null# Iterate over all RGsForeach($RGin$ResourceGroups){Write-Host"$RG..."# Get all WebApps in this RG$AllWebAppsInRG= Get-AzureRmWebApp -ResourceGroupName $RGForeach($WebAppin($AllWebAppsInRG)){Write-Host"$($WebApp.SiteName)..."$webAppObject= Get-AzureRmWebApp -ResourceGroupName $RG-Name $($WebApp.SiteName)$AppSettings=$webAppObject.SiteConfig.AppSettings
$AllURLs+=$WebApp.DefaultHostName
ForEach($Settingin$AppSettings){Write-Host"$($Setting.Name)"$SettingObject=New-Object PSCustomObject
$SettingObject|Add-Member-Type NoteProperty -Name"Ressource Group"-Value$RG$SettingObject|Add-Member-Type NoteProperty -Name"WebApp Name"-Value $($WebApp.SiteName)$SettingObject|Add-Member-Type NoteProperty -Name"WebApp URL"-Value $($WebApp.DefaultHostName)$SettingObject|Add-Member-Type NoteProperty -Name"Setting Name"-Value $($Setting.Name)$SettingObject|Add-Member-Type NoteProperty -Name"Setting Value"-Value $($Setting.Value)$AllSettings+=$SettingObject}}}$AllSettings| ConvertTo-Csv -Delimiter";"-NoTypeInformation|Out-File"AllAppSettings.csv"
# Adjust theese as needed
# Change this to the subscription you want to query
$SubscriptionId = "1234567-890123-132312312"
# Name the RG's here, that you want to check
[string[]]$ResourceGroups = "RG-A","RG-B","RG-C"
### no changes needed below ###
Connect-AzureRmAccount -Subscription $SubscriptionId
Set-AzureRmContext -SubscriptionId $SubscriptionId
$AllSettings = @()
[string[]]$AllURLs = $null
# Iterate over all RGs
Foreach($RG in $ResourceGroups)
{
Write-Host "$RG..."
# Get all WebApps in this RG
$AllWebAppsInRG = Get-AzureRmWebApp -ResourceGroupName $RG
Foreach($WebApp in ($AllWebAppsInRG))
{
Write-Host "$($WebApp.SiteName)..."
$webAppObject = Get-AzureRmWebApp -ResourceGroupName $RG -Name $($WebApp.SiteName)
$AppSettings = $webAppObject.SiteConfig.AppSettings
$AllURLs += $WebApp.DefaultHostName
ForEach($Setting in $AppSettings)
{
Write-Host "$($Setting.Name)"
$SettingObject = New-Object PSCustomObject
$SettingObject | Add-Member -Type NoteProperty -Name "Ressource Group" -Value $RG
$SettingObject | Add-Member -Type NoteProperty -Name "WebApp Name" -Value $($WebApp.SiteName)
$SettingObject | Add-Member -Type NoteProperty -Name "WebApp URL" -Value $($WebApp.DefaultHostName)
$SettingObject | Add-Member -Type NoteProperty -Name "Setting Name" -Value $($Setting.Name)
$SettingObject | Add-Member -Type NoteProperty -Name "Setting Value" -Value $($Setting.Value)
$AllSettings += $SettingObject
}
}
}
$AllSettings | ConvertTo-Csv -Delimiter ";" -NoTypeInformation | Out-File "AllAppSettings.csv"
Danach sind die Settings alle in der Datei AllAppSettings im aktuellen Verzeichnis, und zwar so, dass man die Datei direkt in Excel öffnen kann. Viel Spaß beim Ausprobieren!
In Azure stellt jeder App Service Plan ab B1 (d.h., alle außer F1 “Free” und D1 “Shared”) SSL entweder mit einem von Azure generierten oder einem eigenen Zertifikat zur Verfügung:
Allerdings lassen die App Services auch weiterhin HTTP ohne SSL zu, es sei denn, man aktiviert die Option “HTTPS Only”:
Diese Option kann man natürlich auch per PowerShell und damit ganz bequem gleich für eine größere Menge App Services setzen. Dazu habe ich dieses Skript geschrieben:
# Adjust theese as needed$SubscriptionId="9feacb87-1fe6-447e-a0f4-4ae1ba2496e3"[string[]]$ResourceGroups="RG-A","RG-B","RG-C"### no changes needed below ###
Connect-AzureRmAccount -Subscription $SubscriptionId
Set-AzureRmContext -SubscriptionId $SubscriptionId# Iterate over all RGsForeach($RGin$ResourceGroups){Write-Host"$RG..."# Get all WebApps in this RG$AllWebAppsInRG= Get-AzureRmWebApp -ResourceGroupName $RGForeach($WebAppin$AllWebAppsInRG){Write-Host"$($WebApp.Name)..."# State before setting it:(Get-AzureRmWebApp -ResourceGroupName $RG-Name $($WebApp.Name)).HttpsOnly
# Enabling HttpsOnly
Set-AzureRmWebApp -ResourceGroupName $RG-Name $($WebApp.Name)-HttpsOnly $true}}
# Adjust theese as needed
$SubscriptionId = "9feacb87-1fe6-447e-a0f4-4ae1ba2496e3"
[string[]]$ResourceGroups = "RG-A","RG-B","RG-C"
### no changes needed below ###
Connect-AzureRmAccount -Subscription $SubscriptionId
Set-AzureRmContext -SubscriptionId $SubscriptionId
# Iterate over all RGs
Foreach($RG in $ResourceGroups)
{
Write-Host "$RG..."
# Get all WebApps in this RG
$AllWebAppsInRG = Get-AzureRmWebApp -ResourceGroupName $RG
Foreach($WebApp in $AllWebAppsInRG)
{
Write-Host "$($WebApp.Name)..."
# State before setting it:
(Get-AzureRmWebApp -ResourceGroupName $RG -Name $($WebApp.Name)).HttpsOnly
# Enabling HttpsOnly
Set-AzureRmWebApp -ResourceGroupName $RG -Name $($WebApp.Name) -HttpsOnly $true
}
}
Bis gestern kannte das Azure Portal nur die Möglichkeit, Berechtigungen zu gewähren (ALLOW). Seit heute kann man nun (neben der neuen Möglichkeit, sich die effektiven Berechtigungen eines Users anzeigen zu lassen, die sich aus Vererbung und co. ergeben) auch Berechtigungen explizit entziehen (DENY). Dadurch wird es jetzt viel einfacher möglich, einem Account z.B. Rechte auf „alles“ außer einem bestimmten Bereich zu geben. Bisher war es nicht möglich, jemandem z.B. zum Contributor auf einer Subscription zu machen, aber zu verhindern, dass er in eine bestimmte Ressource Group schauen kann. Dies ist nun möglich:
Immer wieder schön, wenn man über Nacht neue Features bekommt und diese dann entdeckt 🙂 Viel Spaß beim Ausprobieren…
Um dir ein optimales Erlebnis zu bieten, verwenden wir Technologien wie Cookies, um Geräteinformationen zu speichern und/oder darauf zuzugreifen. Wenn du diesen Technologien zustimmst, können wir Daten wie das Surfverhalten oder eindeutige IDs auf dieser Website verarbeiten. Wenn du deine Zustimmung nicht erteilst oder zurückziehst, können bestimmte Merkmale und Funktionen beeinträchtigt werden.
Funktional
Immer aktiv
Die technische Speicherung oder der Zugang ist unbedingt erforderlich für den rechtmäßigen Zweck, die Nutzung eines bestimmten Dienstes zu ermöglichen, der vom Teilnehmer oder Nutzer ausdrücklich gewünscht wird, oder für den alleinigen Zweck, die Übertragung einer Nachricht über ein elektronisches Kommunikationsnetz durchzuführen.
Vorlieben
Die technische Speicherung oder der Zugriff ist für den rechtmäßigen Zweck der Speicherung von Präferenzen erforderlich, die nicht vom Abonnenten oder Benutzer angefordert wurden.
Statistiken
Die technische Speicherung oder der Zugriff, der ausschließlich zu statistischen Zwecken erfolgt.Die technische Speicherung oder der Zugriff, der ausschließlich zu anonymen statistischen Zwecken verwendet wird. Ohne eine Vorladung, die freiwillige Zustimmung deines Internetdienstanbieters oder zusätzliche Aufzeichnungen von Dritten können die zu diesem Zweck gespeicherten oder abgerufenen Informationen allein in der Regel nicht dazu verwendet werden, dich zu identifizieren.
Marketing
Die technische Speicherung oder der Zugriff ist erforderlich, um Nutzerprofile zu erstellen, um Werbung zu versenden oder um den Nutzer auf einer Website oder über mehrere Websites hinweg zu ähnlichen Marketingzwecken zu verfolgen.