Självstudie: Använda distributionsskript för att skapa ett självsignerat certifikat
Lär dig hur du använder distributionsskript i Azure Resource Manager-mallar (ARM-mallar). Distributionsskript kan användas för att utföra anpassade steg som inte kan utföras av ARM-mallar. Du kan till exempel skapa ett självsignerat certifikat. I den här självstudien skapar du en mall för att distribuera ett Azure-nyckelvalv och använder sedan en Microsoft.Resources/deploymentScripts
resurs i samma mall för att skapa ett certifikat och sedan lägga till certifikatet i nyckelvalvet. Mer information om distributionsskript finns i Använda distributionsskript i ARM-mallar.
Viktigt!
Två distributionsskriptresurser, ett lagringskonto och en containerinstans, skapas i samma resursgrupp för skriptkörning och felsökning. Dessa resurser tas vanligtvis bort av skripttjänsten när skriptkörningen hamnar i ett terminaltillstånd. Du debiteras för resurserna tills resurserna har tagits bort. Mer information finns i Rensa distributionsskriptresurser.
Den här självstudien omfattar följande uppgifter:
- Öppna en snabbstartsmall
- Redigera mallen
- Distribuera mallen
- Felsöka det misslyckade skriptet
- Rensa resurser
En Learn-modul som omfattar distributionsskript finns i Utöka ARM-mallar med hjälp av distributionsskript.
Förutsättningar
För att slutföra den här artikeln behöver du:
Visual Studio Code med Resource Manager Tools-tillägget. Se Snabbstart: Skapa ARM-mallar med Visual Studio Code.
En användartilldelad hanterad identitet. Den här identiteten används för att utföra Azure-specifika åtgärder i skriptet. Information om hur du skapar en finns i Användartilldelad hanterad identitet. Du behöver identitets-ID:t när du distribuerar mallen. Identitetens format är:
/subscriptions/<SubscriptionID>/resourcegroups/<ResourceGroupName>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<IdentityID>
Använd följande CLI-skript för att hämta ID:t genom att ange resursgruppens namn och identitetsnamnet.
echo "Enter the Resource Group name:" && read resourceGroupName && az identity list -g $resourceGroupName
Öppna en snabbstartsmall
I stället för att skapa en mall från början öppnar du en mall från Azure-snabbstartsmallar. Azure Snabbstartsmallar är en lagringsplats för ARM-mallar.
Mallen som används i den här snabbstarten kallas Skapa ett Azure Key Vault och en hemlighet. Mallen skapar ett nyckelvalv och lägger sedan till en hemlighet i nyckelvalvet.
Från Visual Studio Code väljer du Arkiv>Öppna fil.
I Filnamn klistrar du in följande URL:
https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/quickstarts/microsoft.keyvault/key-vault-create/azuredeploy.json
Välj Öppna för att öppna filen.
Välj Arkiv>Spara som för att spara filen som azuredeploy.json till den lokala datorn.
Redigera mallen
Gör följande ändringar i mallen:
Rensa mallen (valfritt)
Den ursprungliga mallen lägger till en hemlighet i nyckelvalvet. För att förenkla självstudien tar du bort följande resurs:
Microsoft.KeyVault/vaults/secrets
Ta bort följande två parameterdefinitioner:
secretName
secretValue
Om du väljer att inte ta bort dessa definitioner måste du ange parametervärdena under distributionen.
Konfigurera åtkomstprinciper för nyckelvalvet
Distributionsskriptet lägger till ett certifikat i nyckelvalvet. Konfigurera åtkomstprinciperna för nyckelvalvet för att ge behörighet till den hanterade identiteten:
Lägg till en parameter för att hämta det hanterade identitets-ID:t:
"identityId": { "type": "string", "metadata": { "description": "Specifies the ID of the user-assigned managed identity." } },
Kommentar
Resource Manager-malltillägget för Visual Studio Code kan inte formatera distributionsskript ännu. Använd inte Skift+Alt+F för att formatera
deploymentScripts
resurserna, till exempel följande.Lägg till en parameter för att konfigurera åtkomstprinciperna för nyckelvalvet så att den hanterade identiteten kan lägga till certifikat i nyckelvalvet:
"certificatesPermissions": { "type": "array", "defaultValue": [ "get", "list", "update", "create" ], "metadata": { "description": "Specifies the permissions to certificates in the vault. Valid values are: all, get, list, update, create, import, delete, recover, backup, restore, manage contacts, manage certificate authorities, get certificate authorities, list certificate authorities, set certificate authorities, delete certificate authorities." } }
Uppdatera de befintliga åtkomstprinciperna för nyckelvalvet till:
"accessPolicies": [ { "objectId": "[parameters('objectId')]", "tenantId": "[parameters('tenantId')]", "permissions": { "keys": "[parameters('keysPermissions')]", "secrets": "[parameters('secretsPermissions')]", "certificates": "[parameters('certificatesPermissions')]" } }, { "objectId": "[reference(parameters('identityId'), '2018-11-30').principalId]", "tenantId": "[parameters('tenantId')]", "permissions": { "keys": "[parameters('keysPermissions')]", "secrets": "[parameters('secretsPermissions')]", "certificates": "[parameters('certificatesPermissions')]" } } ],
Det finns två definierade principer, en för den inloggade användaren och den andra för den hanterade identiteten. Den inloggade användaren behöver bara listbehörigheten för att verifiera distributionen. För att förenkla självstudien tilldelas samma certifikat till både den hanterade identiteten och de inloggade användarna.
Lägg till distributionsskriptet
Lägg till tre parametrar som används av distributionsskriptet:
"certificateName": { "type": "string", "defaultValue": "DeploymentScripts2019" }, "subjectName": { "type": "string", "defaultValue": "CN=contoso.com" }, "utcValue": { "type": "string", "defaultValue": "[utcNow()]" }
Lägg till en
deploymentScripts
resurs:Kommentar
Eftersom de infogade distributionsskripten omges av dubbla citattecken måste strängarna i distributionsskripten omges av enkla citattecken i stället. PowerShell-escape-tecknet är backtick (
`
).{ "type": "Microsoft.Resources/deploymentScripts", "apiVersion": "2020-10-01", "name": "createAddCertificate", "location": "[resourceGroup().location]", "dependsOn": [ "[resourceId('Microsoft.KeyVault/vaults', parameters('keyVaultName'))]" ], "identity": { "type": "UserAssigned", "userAssignedIdentities": { "[parameters('identityId')]": { } } }, "kind": "AzurePowerShell", "properties": { "forceUpdateTag": "[parameters('utcValue')]", "azPowerShellVersion": "3.0", "timeout": "PT30M", "arguments": "[format(' -vaultName {0} -certificateName {1} -subjectName {2}', parameters('keyVaultName'), parameters('certificateName'), parameters('subjectName'))]", // can pass an argument string, double quotes must be escaped "scriptContent": " param( [string] [Parameter(Mandatory=$true)] $vaultName, [string] [Parameter(Mandatory=$true)] $certificateName, [string] [Parameter(Mandatory=$true)] $subjectName ) $ErrorActionPreference = 'Stop' $DeploymentScriptOutputs = @{} $existingCert = Get-AzKeyVaultCertificate -VaultName $vaultName -Name $certificateName if ($existingCert -and $existingCert.Certificate.Subject -eq $subjectName) { Write-Host 'Certificate $certificateName in vault $vaultName is already present.' $DeploymentScriptOutputs['certThumbprint'] = $existingCert.Thumbprint $existingCert | Out-String } else { $policy = New-AzKeyVaultCertificatePolicy -SubjectName $subjectName -IssuerName Self -ValidityInMonths 12 -Verbose # private key is added as a secret that can be retrieved in the Resource Manager template Add-AzKeyVaultCertificate -VaultName $vaultName -Name $certificateName -CertificatePolicy $policy -Verbose # it takes a few seconds for KeyVault to finish $tries = 0 do { Write-Host 'Waiting for certificate creation completion...' Start-Sleep -Seconds 10 $operation = Get-AzKeyVaultCertificateOperation -VaultName $vaultName -Name $certificateName $tries++ if ($operation.Status -eq 'failed') { throw 'Creating certificate $certificateName in vault $vaultName failed with error $($operation.ErrorMessage)' } if ($tries -gt 120) { throw 'Timed out waiting for creation of certificate $certificateName in vault $vaultName' } } while ($operation.Status -ne 'completed') $newCert = Get-AzKeyVaultCertificate -VaultName $vaultName -Name $certificateName $DeploymentScriptOutputs['certThumbprint'] = $newCert.Thumbprint $newCert | Out-String } ", "cleanupPreference": "OnSuccess", "retentionInterval": "P1D" } }
Resursen
deploymentScripts
är beroende av nyckelvalvsresursen och rolltilldelningsresursen. Den har följande egenskaper:identity
: Distributionsskriptet använder en användartilldelad hanterad identitet för att utföra åtgärderna i skriptet.kind
: Ange typ av skript. För närvarande stöds endast PowerShell-skript.forceUpdateTag
: Avgör om distributionsskriptet ska köras även om skriptkällan inte har ändrats. Kan vara aktuell tidsstämpel eller ett GUID. Mer information finns i Kör skript mer än en gång.azPowerShellVersion
: Anger vilken Azure PowerShell-modulversion som ska användas. Distributionsskriptet stöder för närvarande version 2.7.0, 2.8.0 och 3.0.0.timeout
: Ange den maximala tillåtna körningstiden för skriptet som anges i FORMATET ISO 8601. Standardvärdet är P1D.arguments
: Ange parametervärdena. Värdena avgränsas med blanksteg.scriptContent
: Ange skriptinnehållet. Om du vill köra ett externt skript använder duprimaryScriptURI
i stället. Mer information finns i Använda externt skript. Deklarering$DeploymentScriptOutputs
krävs endast när skriptet testas på en lokal dator. Om du deklarerar variabeln kan skriptet köras på en lokal dator och i endeploymentScript
resurs utan att behöva göra ändringar. Värdet som tilldelats$DeploymentScriptOutputs
är tillgängligt som utdata i distributionerna. Mer information finns i Arbeta med utdata från PowerShell-distributionsskript eller Arbeta med utdata från CLI-distributionsskript.cleanupPreference
: Ange inställningen för när distributionsskriptresurserna ska tas bort. Standardvärdet är Always, vilket innebär att distributionsskriptresurserna tas bort trots terminaltillståndet (lyckades, misslyckades, avbröts). I den här självstudien används OnSuccess så att du får en chans att visa resultatet av skriptkörningen.retentionInterval
: Ange det intervall för vilket tjänsten behåller skriptresurserna när den har nått ett terminaltillstånd. Resurser tas bort när den här varaktigheten upphör att gälla. Varaktigheten baseras på ISO 8601-mönster. I den här självstudien används P1D, vilket innebär en dag. Den här egenskapen används närcleanupPreference
är inställd på OnExpiration. Den här egenskapen är inte aktiverad för närvarande.
Distributionsskriptet tar tre parametrar:
keyVaultName
,certificateName
ochsubjectName
. Det skapar ett certifikat och lägger sedan till certifikatet i nyckelvalvet.$DeploymentScriptOutputs
används för att lagra utdatavärdet. Mer information finns i Arbeta med utdata från PowerShell-distributionsskript eller Arbeta med utdata från CLI-distributionsskript.Den färdiga mallen finns här.
Om du vill se felsökningsprocessen placerar du ett fel i koden genom att lägga till följande rad i distributionsskriptet:
Write-Output1 $keyVaultName
Rätt kommando är
Write-Output
i stället förWrite-Output1
.Välj Arkiv>Spara för att spara filen.
Distribuera mallen
Logga in på Azure Cloud Shell
Välj önskad miljö genom att välja Antingen PowerShell eller Bash (för CLI) i det övre vänstra hörnet. Du måste starta om gränssnittet när du byter.
Välj Ladda upp/ned filer och välj sedan Ladda upp. Se föregående skärmbild. Välj den fil som du sparade i föregående avsnitt. När du har laddat upp filen kan du använda
ls
kommandot ochcat
kommandot för att kontrollera att filen har laddats upp.Kör följande Azure CLI- eller Azure PowerShell-skript för att distribuera mallen.
echo "Enter a project name that is used to generate resource names:" && read projectName && echo "Enter the location (i.e. centralus):" && read location && echo "Enter your email address used to sign in to Azure:" && read upn && echo "Enter the user-assigned managed identity ID:" && read identityId && adUserId=$((az ad user show --id ${upn}) | jq -r '.id') && resourceGroupName="${projectName}rg" && keyVaultName="${projectName}kv" && az group create --name $resourceGroupName --location $location && az deployment group create --resource-group $resourceGroupName --template-file "$HOME/azuredeploy.json" --parameters identityId=$identityId keyVaultName=$keyVaultName objectId=$adUserId
Distributionsskripttjänsten måste skapa ytterligare distributionsskriptresurser för skriptkörning. Förberedelsen och rensningsprocessen kan ta upp till en minut att slutföra utöver den faktiska körningstiden för skriptet.
Distributionen misslyckades eftersom det ogiltiga kommandot
Write-Output1
används i skriptet. Du får ett felmeddelande om att:The term 'Write-Output1' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
Körningsresultatet för distributionsskriptet lagras i distributionsskriptresurserna för felsökningssyfte.
Felsöka det misslyckade skriptet
Logga in på Azure-portalen.
Öppna resursgruppen. Det är projektnamnet med rg bifogat. Du ser ytterligare två resurser i resursgruppen. Dessa resurser kallas för distributionsskriptresurser.
Båda filerna har suffixet azscripts . Det ena är ett lagringskonto och det andra är en containerinstans.
Välj Visa dolda typer för att visa resursen
deploymentScripts
.Välj lagringskontot med azscripts-suffixet.
Välj panelen Filresurser . Du ser en azscripts-mapp som innehåller körningsfilerna för distributionsskriptet.
Välj azscripts. Du ser två mappar azscriptinput och azscriptoutput. Indatamappen innehåller en PowerShell-systemskriptfil och skriptfilerna för användardistribution. Utdatamappen innehåller en executionresult.json och skriptets utdatafil. Du kan se felmeddelandet i executionresult.json. Utdatafilen finns inte där eftersom körningen misslyckades.
Write-Output1
Ta bort raden och distribuera om mallen.
När den andra distributionen körs tas distributionsskriptresurserna bort av skripttjänsten, eftersom cleanupPreference
egenskapen är inställd på OnSuccess.
Rensa resurser
När Azure-resurserna inte längre behövs rensar du de resurser som du har distribuerat genom att ta bort resursgruppen.
- Från Azure-portalen väljer du Resursgrupp från den vänstra menyn.
- Ange resursgruppens namn i fältet Filtrera efter namn.
- Välj resursgruppens namn.
- Välj Ta bort resursgrupp från menyn längst upp.
Nästa steg
I den här självstudien har du lärt dig hur du använder ett distributionsskript i ARM-mallar. Information om hur du lär dig att distribuera Azure-resurser baserat på villkor finns i: