Tworzenie skryptu wdrażania w aplikacji Bicep

Ten artykuł zawiera przykłady pokazujące, jak opracować skrypt wdrożenia w aplikacji Bicep.

Zasoby skryptu wdrożenia mogą mieć określony czas wdrażania. Aby efektywnie opracowywać i testować te skrypty, rozważ utworzenie dedykowanego środowiska deweloperskiego, takiego jak wystąpienie kontenera platformy Azure (ACI) lub wystąpienie platformy Docker. Aby uzyskać więcej informacji, zobacz Tworzenie środowiska projektowego.

Składnia

Poniższy plik Bicep jest przykładem zasobu skryptu wdrożenia. Aby uzyskać więcej informacji, zobacz najnowszy schemat skryptu wdrażania.

resource <symbolic-name> 'Microsoft.Resources/deploymentScripts@2023-08-01' = {
  name: '<resource-name>'
  location: resourceGroup().location
  tags: {}
  identity: {
    type: 'UserAssigned'
    userAssignedIdentities: {
      '<user-assigned-identity-id>': {}
    }
  }
  kind: 'AzureCLI'
  properties: {
    storageAccountSettings: {
      storageAccountName: '<storage-account-name>'
      storageAccountKey: '<storage-account-key>'
    }
    containerSettings: {
      containerGroupName: '<container-group-name>'
      subnetIds: [
        {
          id: '<subnet-id>'
        }
      ]
    }
    environmentVariables: []
    azCliVersion: '2.52.0'
    arguments: '<script-arguments>'
    scriptContent: '''<azure-cli-or-azure-powershell-script>''' // or primaryScriptUri: 'https://raw.githubusercontent.com/Azure/azure-docs-bicep-samples/main/samples/deployment-script/inlineScript.ps1'
    supportingScriptUris: []
    timeout: 'P1D'
    cleanupPreference: 'OnSuccess'
    retentionInterval: 'P1D'
    forceUpdateTag: '1'
  }
}

W skrypcie wdrażania określ następujące wartości tych właściwości:

  • tags: Określ tagi skryptu wdrożenia. Jeśli usługa skryptów wdrożeniowych tworzy dwa zasoby pomocnicze (konto magazynu danych i instancję kontenera), tagi są przekazywane obu zasobom. Możesz użyć tagów, aby zidentyfikować zasoby. Innym sposobem identyfikacji tych zasobów pomocniczych jest ich sufiksy, które zawierają azscripts. Aby uzyskać więcej informacji, zobacz Monitorowanie i rozwiązywanie problemów ze skryptami wdrażania.

  • identity: W przypadku wersji 2020-10-01 interfejsu API skryptu wdrażania lub nowszej tożsamość zarządzana przypisana przez użytkownika jest opcjonalna, chyba że musisz wykonać jakiekolwiek akcje specyficzne dla platformy Azure w skrycie lub uruchamiasz skrypt wdrażania w sieci prywatnej. Wersja 2019-10-01-preview interfejsu API wymaga tożsamości zarządzanej, ponieważ usługa skryptu wdrażania używa jej do uruchamiania skryptów.

    Po określeniu właściwości identity usługa skryptów wywołuje Connect-AzAccount -Identity przed wywołaniem skryptu użytkownika. Obecnie obsługiwana jest tylko tożsamość zarządzana przypisana przez użytkownika. Aby zalogować się przy użyciu innej tożsamości w skrypcie wdrażania, możesz wywołać metodę Connect-AzAccount. Aby uzyskać więcej informacji, zobacz Konfigurowanie minimalnych uprawnień.

  • kind: Określ typ skryptu: AzurePowerShell albo AzureCLI. Oprócz kind należy określić właściwość azPowerShellVersion lub azCliVersion.

  • storageAccountSettings: Określ ustawienia potrzebne do użycia istniejącego konta magazynu. Jeśli nie określono storageAccountName, automatycznie zostanie utworzone konto magazynu. Aby uzyskać więcej informacji, zobacz Użyj istniejącego konta magazynu.

  • containerSettings: Dostosuj nazwę wystąpienia kontenera Azure. Aby uzyskać informacje na temat konfigurowania nazwy grupy kontenerów, zobacz Konfigurowanie wystąpienia kontenera w dalszej części tego artykułu. Aby uzyskać informacje o konfigurowaniu subnetIds uruchamiania skryptu wdrażania w sieci prywatnej, zobacz Uzyskiwanie dostępu do prywatnej sieci wirtualnej.

  • environmentVariables: Określ zmienne środowiskowe, które mają być przekazywane do skryptu.

  • azPowerShellVersion / azCliVersion: określ wersję modułu do użycia.

    Zobacz listę obsługiwanych wersji interfejsu wiersza polecenia platformy Azure.

    Ważne

    Skrypt wdrożeniowy korzysta z dostępnych obrazów CLI z usługi Microsoft Artifact Registry. Zwykle certyfikacja obrazu CLI na potrzeby skryptu wdrożeniowego trwa około miesiąca. Nie używaj wersji CLI opublikowanych w ciągu ostatnich 30 dni. Aby znaleźć daty wydania obrazów, zobacz Informacje o wersji interfejsu wiersza polecenia platformy Azure. Jeśli używasz nieobsługiwanej wersji, komunikat o błędzie zawiera listę obsługiwanych wersji.

  • arguments: Określ wartości parametrów. Wartości są oddzielone spacjami.

    Skrypt wdrażania dzieli argumenty na tablicę łańcuchów znaków, wywołując wywołanie systemowe CommandLineToArgvW. Ten krok jest niezbędny, ponieważ argumenty są przekazywane jako właściwość command w usłudze Azure Container Instances, a właściwość command jest tablicą ciągów.

    Jeśli argumenty zawierają znaki ucieczki, zastosuj podwójne znaki ucieczki dla tych znaków. Na przykład w poprzednim przykładzie składni języka Bicep argumentem jest -name \"John Dole\". Ciąg ucieczki to -name \\"John Dole\\".

    Aby przekazać parametr Bicep typu object jako argument, przekonwertuj obiekt na ciąg znaków przy użyciu funkcji string(), a następnie użyj funkcji replace(), aby zastąpić wszelkie cudzysłowy (") cudzysłowami z podwójnym znakiem ucieczki (\\"). Na przykład:

    replace(string(parameters('tables')), '"', '\\"')
    

    Aby uzyskać więcej informacji, zobacz przykładowy plik Bicep.

  • scriptContent: określ zawartość skryptu. Może to być wbudowany skrypt lub plik skryptu zewnętrznego zaimportowany przy użyciu funkcji loadTextContent . Aby uzyskać więcej informacji, zobacz Inline vs. external file w dalszej części tego artykułu. Aby uruchomić skrypt zewnętrzny, zamiast tego użyj polecenia primaryScriptUri .

  • primaryScriptUri: określ publicznie dostępny adres URL podstawowego skryptu wdrażania z obsługiwanymi rozszerzeniami plików. Aby uzyskać więcej informacji, zobacz Używanie skryptów zewnętrznych w dalszej części tego artykułu.

  • supportingScriptUris: określ tablicę publicznie dostępnych adresów URL do plików pomocniczych, które są wywoływane w elemecie scriptContent lub primaryScriptUri. Aby uzyskać więcej informacji, zobacz Inline vs. external file w dalszej części tego artykułu.

  • timeout: określ maksymalny dozwolony czas wykonywania skryptu w formacie ISO 8601. Domyślna wartość to P1D.

  • forceUpdateTag: zmiana tej wartości między wdrożeniami plików Bicep wymusza ponowne uruchomienie skryptu wdrożenia. Jeśli używasz funkcji newGuid() lub utcNow(), możesz użyć jej tylko jako wartości domyślnej parametru. Aby dowiedzieć się więcej, zobacz Uruchamianie skryptu więcej niż raz w dalszej części tego artykułu.

  • cleanupPreference. Określ, czy dwa pomocnicze zasoby używane do wdrożenia (konto magazynu i wystąpienie kontenera) mają zostać wyczyszczone, gdy wykonywanie skryptu osiągnie stan końcowy. Ustawieniem domyślnym jest Always, który wywołuje usunięcie zasobów pomocniczych niezależnie od stanu terminalu (Succeeded, Failedlub Canceled). Aby dowiedzieć się więcej, zobacz Czyszczenie zasobów skryptów wdrażania w dalszej części tego artykułu.

  • retentionInterval: określ interwał, dla którego usługa zachowuje zasób skryptu wdrożenia po osiągnięciu stanu terminalu przez wykonanie skryptu wdrożenia. Zasób skryptu wdrażania jest usuwany po wygaśnięciu tego czasu trwania. Czas trwania jest oparty na wzorcu ISO 8601. Interwał przechowywania wynosi od 1 godziny (PT1H) do 26 godzin (PT26H). Ta właściwość jest używana, gdy cleanupPreference jest ustawiona na OnExpiration. Aby dowiedzieć się więcej, zobacz Czyszczenie zasobów skryptów wdrażania w dalszej części tego artykułu.

Więcej przykładów

  • Przykład 1. Tworzenie magazynu kluczy i używanie skryptu wdrażania w celu przypisania certyfikatu do magazynu kluczy.
  • Przykład 2. Tworzenie grupy zasobów na poziomie subskrypcji, tworzenie magazynu kluczy w grupie zasobów, a następnie przypisywanie certyfikatu do magazynu kluczy za pomocą skryptu wdrażania.
  • Przykład 3. Tworzenie tożsamości zarządzanej przypisanej przez użytkownika, przypisywanie roli współautora do tożsamości na poziomie grupy zasobów, tworzenie magazynu kluczy, a następnie przypisywanie certyfikatu do magazynu kluczy za pomocą skryptu wdrażania.
  • Przykład 4: Ręcznie utwórz tożsamość zarządzaną przypisaną przez użytkownika i przypisz jej uprawnienie do tworzenia aplikacji Microsoft Entra przy użyciu interfejsu API programu Microsoft Graph. W pliku programu Bicep użyj skryptu wdrożenia, aby utworzyć aplikację Microsoft Entra i nazwę główną usługi oraz wyprowadzić identyfikatory obiektów i identyfikator klienta.

Plik wbudowany a plik zewnętrzny

Skrypt wdrożenia może znajdować się w pliku Bicep lub przechowywać go zewnętrznie jako oddzielny plik.

Korzystanie ze skryptu wbudowanego

Poniższy plik Bicep pokazuje, jak używać skryptu wbudowanego.

param name string = 'John Dole'
param location string = resourceGroup().location

resource deploymentScript 'Microsoft.Resources/deploymentScripts@2023-08-01' = {
  name: 'inlineCLI'
  location: location
  kind: 'AzureCLI'
  properties: {
    azCliVersion: '2.52.0'
    arguments: name
    scriptContent: 'set -e; output="Hello $1"; echo $output'
    retentionInterval: 'P1D'
  }
}

Dołącz set -e do skryptu, aby włączyć natychmiastowe zakończenie, jeśli polecenie zwraca stan niezerowy. Ta praktyka usprawnia procesy debugowania błędów.

Ładowanie pliku skryptu

Użyj funkcji loadTextContent, aby pobrać plik skryptu jako ciąg. Ta funkcja umożliwia obsługę skryptu w pliku zewnętrznym i uzyskiwanie do niego dostępu jako skryptu wdrażania. Ścieżka określona dla pliku skryptu jest względna względem pliku Bicep.

Możesz wyodrębnić skrypt wbudowany z poprzedniego pliku Bicep do pliku hello.sh , a następnie umieścić plik w podfolderze nazywanym skryptami.

output="Hello $1"
echo $output

Następnie możesz skorygować powyższy plik Bicep, tak jak w poniższym przykładzie:

param name string = 'John Dole'
param location string = resourceGroup().location

resource deploymentScript 'Microsoft.Resources/deploymentScripts@2023-08-01' = {
  name: 'loadTextContentCLI'
  location: location
  kind: 'AzureCLI'
  properties: {
    azCliVersion: '2.52.0'
    arguments: name
    scriptContent: loadTextContent('./scripts/hello.sh')
    retentionInterval: 'P1D'
  }
}

Używanie skryptów zewnętrznych

Zamiast wbudowanych skryptów można używać zewnętrznych plików skryptów. Obsługiwane są tylko główne skrypty programu PowerShell z rozszerzeniem .ps1. W przypadku skryptów CLI główne skrypty mogą mieć dowolne prawidłowe rozszerzenie skryptu Bash lub nie mieć żadnego rozszerzenia. Aby stosować pliki skryptów zewnętrznych, zamień plik scriptContent na primaryScriptUri.

param name string = 'John Dole'
param location string = resourceGroup().location

resource deploymentScript 'Microsoft.Resources/deploymentScripts@2023-08-01' = {
  name: 'externalScriptCLI'
  location: location
  kind: 'AzureCLI'
  properties: {
    azCliVersion: '2.52.0'
    primaryScriptUri: 'https://raw.githubusercontent.com/Azure/azure-docs-bicep-samples/main/samples/deployment-script/hello.sh'
    arguments: '-name ${name}'
    retentionInterval: 'P1D'
  }
}

Pliki skryptów zewnętrznych muszą być dostępne. Aby ułatwić zabezpieczanie plików skryptów przechowywanych na kontach usługi Azure Storage, wygeneruj token sygnatury dostępu współdzielonego (SAS) i dołącz go do identyfikatora URI szablonu. Ustaw wygaśnięcie, aby umożliwić wystarczającą ilość czasu na ukończenie wdrożenia. Aby uzyskać więcej informacji, zobacz Deploy a private ARM template with a SAS token (Wdrażanie prywatnego szablonu usługi ARM przy użyciu tokenu SAS).

Odpowiadasz za zapewnienie integralności skryptu, do którego odwołuje się skrypt wdrożenia ( primaryScriptUri lub supportingScriptUris). Odwołuj się tylko do skryptów, którym ufasz.

Korzystanie ze skryptów pomocniczych

Skomplikowane logiki można oddzielić od jednego lub większej liczby plików skryptów pomocniczych. Użyj właściwości supportingScriptUris, aby w razie potrzeby określić tablicę identyfikatorów URI pomocniczych plików skryptów.

param name string = 'John Dole'
param location string = resourceGroup().location

resource deploymentScript 'Microsoft.Resources/deploymentScripts@2023-08-01' = {
  name: 'supportingScriptCLI'
  location: location
  kind: 'AzureCLI'
  properties: {
    azCliVersion: '2.52.0'
    arguments: name
    scriptContent: 'output="Hello $1"; echo $output; ./hello.sh "$1"'
    supportingScriptUris: [
      'https://raw.githubusercontent.com/Azure/azure-docs-bicep-samples/master/samples/deployment-script/hello.sh'
    ]
    retentionInterval: 'P1D'
  }
}

Pliki skryptów pomocniczych można wywoływać zarówno z wbudowanych skryptów, jak i plików skryptów podstawowych. Pliki skryptów pomocniczych nie mają ograniczeń dotyczących rozszerzenia pliku.

Pliki pomocnicze są kopiowane do azscripts/azscriptinput w czasie działania. Użyj ścieżki względnej, aby odwoływać się do plików pomocniczych w skryptach wbudowanych i głównych plikach skryptowych.

Uzyskiwanie dostępu do zasobów platformy Azure

Aby uzyskać dostęp do zasobów platformy Azure, należy skonfigurować element identity. Poniższy plik Bicep pokazuje, jak pobrać listę magazynów kluczy platformy Azure. Konieczne jest również przyznanie tożsamości zarządzania przypisaniem użytkownika w celu uzyskania dostępu do magazynu kluczy.

param identity string
param location string = resourceGroup().location

resource deploymentScript 'Microsoft.Resources/deploymentScripts@2023-08-01' = {
  name: 'listKvCLI'
  location: location
  kind: 'AzureCLI'
  identity: {
    type: 'UserAssigned'
    userAssignedIdentities: {
      '${identity}': {}
    }
  }
  properties: {
    azCliVersion: '2.52.0'
    scriptContent: 'result=$(az keyvault list); echo $result | jq -c \'{Result: map({id: .id})}\' > $AZ_SCRIPTS_OUTPUT_PATH'
    retentionInterval: 'P1D'
  }
}

output result object = deploymentScript.properties.outputs

Uwaga

Logika ponawiania prób logowania się do platformy Azure jest teraz wbudowana w skrypt opakowujący. Jeśli przyznasz uprawnienia w tym samym pliku Bicep co skrypty wdrażania, usługa skryptu wdrażania ponawia próbę logowania przez 10 minut (z 10-sekundowymi interwałami), dopóki przypisanie roli tożsamości zarządzanej nie zostanie zreplikowane.

Praca z danymi wyjściowymi

Podejście do obsługi danych wyjściowych różni się w zależności od typu skryptu, którego używasz— interfejsu wiersza polecenia platformy Azure lub programu Azure PowerShell.

Ważne

Dzienniki skryptów wdrożeń mogą zawierać treści napisane do Write-Host, echo, stdout, oraz stderr. Możesz pobrać te informacje za pośrednictwem punktu końcowego /deploymentScripts/logs lub powiązanych interfejsów API. Nie zapisuj wrażliwych informacji na wyjściu skryptu, w tym tokenów dostępu, tokenów nośników, tokenów SAS, łańcuchów połączeń, danych uwierzytelniających czy innych sekretów. Autorzy skryptów są odpowiedzialni za zapewnienie, że dzienniki skryptów wdrożeń nie ujawniają wrażliwych informacji.

Skrypt wdrażania interfejsu wiersza polecenia platformy Azure używa zmiennej środowiskowej o nazwie AZ_SCRIPTS_OUTPUT_PATH , aby wskazać lokalizację pliku dla danych wyjściowych skryptu. Podczas uruchamiania skryptu wdrożeniowego w pliku Bicep powłoka Bash automatycznie ustawia tę zmienną środowiskową. Jego wstępnie zdefiniowana wartość jest ustawiana jako /mnt/azscripts/azscriptoutput/scriptoutputs.json.

Dane wyjściowe muszą być zgodne z prawidłową strukturą obiektu ciągu JSON. Zawartość pliku powinna być sformatowana jako para klucz/wartość. Na przykład zapisz tablicę ciągów jako { "MyResult": [ "foo", "bar"] }. Przechowywanie tylko wyników tablicy, takich jak [ "foo", "bar" ], jest nieprawidłowe.

param name string = 'John Dole'
param location string = resourceGroup().location

resource deploymentScript 'Microsoft.Resources/deploymentScripts@2023-08-01' = {
  name: 'outputCLI'
  location: location
  kind: 'AzureCLI'
  properties: {
    azCliVersion: '2.52.0'
    arguments: name
    scriptContent: 'jq -n -c --arg st "Hello ${name}" \'{"text": $st}\' > $AZ_SCRIPTS_OUTPUT_PATH'
    retentionInterval: 'P1D'
  }
}

output text string = deploymentScript.properties.outputs.text

W poprzednim przykładzie użyto języka jq do konstruowania danych wyjściowych. Narzędzie jq jest dostarczane z obrazami kontenerów. Aby uzyskać więcej informacji, zobacz Konfigurowanie środowiska programistycznego.

Używanie zmiennych środowiskowych

Przekazywanie zabezpieczonych ciągów do skryptu wdrożenia

Zmienne środowiskowe (EnvironmentVariable) można ustawić w wystąpieniach kontenera, aby zapewnić dynamiczną konfigurację aplikacji lub skryptu uruchamianego przez kontener. Skrypt wdrażania obsługuje niezabezpieczone i zabezpieczone zmienne środowiskowe w taki sam sposób, jak w przypadku usługi Azure Container Instances. Aby uzyskać więcej informacji, zobacz Ustawianie zmiennych środowiskowych w wystąpieniach kontenera.

Maksymalny dozwolony rozmiar zmiennych środowiskowych to 64 KB.

param location string = resourceGroup().location

resource deploymentScript 'Microsoft.Resources/deploymentScripts@2023-08-01' = {
  name: 'passEnvVariablesCLI'
  location: location
  kind: 'AzureCLI'
  properties: {
    azCliVersion: '2.52.0'
    environmentVariables: [
      {
        name: 'UserName'
        value: 'jdole'
      }
      {
        name: 'Password'
        secureValue: 'jDolePassword'
      }
    ]
    scriptContent: 'echo "Username is :$Username"; echo "Password is: $Password"'
    retentionInterval: 'P1D'
  }
}

Zmienne środowiskowe zdefiniowane przez system

W poniższej tabeli wymieniono zmienne środowiskowe zdefiniowane przez system:

Zmienna środowiskowa Wartość domyślna (CLI) Wartość domyślna (PowerShell) Zarezerwowane dla systemu
AZ_SCRIPTS_AZURE_ENVIRONMENT AzureCloud AzureCloud Nie
AZ_SCRIPTS_CLEANUP_PREFERENCE Always Always Nie
AZ_SCRIPTS_OUTPUT_PATH /mnt/azscripts/azscriptoutput/scriptoutputs.json Nie dotyczy Tak
AZ_SCRIPTS_PATH_INPUT_DIRECTORY /mnt/azscripts/azscriptinput|/mnt/azscripts/azscriptinput Nie dotyczy Tak
AZ_SCRIPTS_PATH_OUTPUT_DIRECTORY /mnt/azscripts/azscriptoutput|/mnt/azscripts/azscriptoutput Nie dotyczy Tak
AZ_SCRIPTS_PATH_USER_SCRIPT_FILE_NAME userscript.sh userscript.ps1 Tak
AZ_SCRIPTS_PATH_PRIMARY_SCRIPT_URI_FILE_NAME primaryscripturi.config primaryscripturi.config Tak
AZ_SCRIPTS_PATH_SUPPORTING_SCRIPT_URI_FILE_NAME supportingscripturi.config supportingscripturi.config Tak
AZ_SCRIPTS_PATH_SCRIPT_OUTPUT_FILE_NAME scriptoutputs.json scriptoutputs.json Tak
AZ_SCRIPTS_PATH_EXECUTION_RESULTS_FILE_NAME executionresult.json executionresult.json Tak
AZ_SCRIPTS_USER_ASSIGNED_IDENTITY Nie dotyczy Nie dotyczy Nie

Aby zapoznać się z przykładem użycia programu AZ_SCRIPTS_OUTPUT_PATH, zobacz Praca z danymi wyjściowymi we wcześniejszej części tego artykułu.

Aby uzyskać dostęp do zmiennych środowiskowych, użyj następującego kodu.

param location string = resourceGroup().location

resource deploymentScript 'Microsoft.Resources/deploymentScripts@2023-08-01' = {
  name: 'listEnvVariablesCLI'
  location: location
  kind: 'AzureCLI'
  properties: {
    azCliVersion: '2.52.0'
    scriptContent: 'echo "AZ_SCRIPTS_AZURE_ENVIRONMENT is : $AZ_SCRIPTS_AZURE_ENVIRONMENT",echo "AZ_SCRIPTS_CLEANUP_PREFERENCE	is : $AZ_SCRIPTS_CLEANUP_PREFERENCE",echo "AZ_SCRIPTS_OUTPUT_PATH	is : $AZ_SCRIPTS_OUTPUT_PATH",echo "AZ_SCRIPTS_PATH_INPUT_DIRECTORY is : $AZ_SCRIPTS_PATH_INPUT_DIRECTORY",echo "AZ_SCRIPTS_PATH_OUTPUT_DIRECTORY is : $AZ_SCRIPTS_PATH_OUTPUT_DIRECTORY",echo "AZ_SCRIPTS_PATH_USER_SCRIPT_FILE_NAME is : $AZ_SCRIPTS_PATH_USER_SCRIPT_FILE_NAME",echo "AZ_SCRIPTS_PATH_PRIMARY_SCRIPT_URI_FILE_NAME	is : $AZ_SCRIPTS_PATH_PRIMARY_SCRIPT_URI_FILE_NAME",echo "AZ_SCRIPTS_PATH_SUPPORTING_SCRIPT_URI_FILE_NAME	is : $AZ_SCRIPTS_PATH_SUPPORTING_SCRIPT_URI_FILE_NAME",echo "AZ_SCRIPTS_PATH_SCRIPT_OUTPUT_FILE_NAME	is : $AZ_SCRIPTS_PATH_SCRIPT_OUTPUT_FILE_NAME",echo "AZ_SCRIPTS_PATH_EXECUTION_RESULTS_FILE_NAME	is : $AZ_SCRIPTS_PATH_EXECUTION_RESULTS_FILE_NAME",echo "AZ_SCRIPTS_USER_ASSIGNED_IDENTITY	is : $AZ_SCRIPTS_USER_ASSIGNED_IDENTITY"'
    retentionInterval: 'P1D'
  }
}

Użyj istniejącego konta magazynu

Aby uruchomić skrypt i umożliwić rozwiązywanie problemów, potrzebne są konto magazynu danych i instancja kontenera. Możesz albo wskazać istniejące konto magazynu, albo zezwolić usłudze skryptów na automatyczne utworzenie zarówno konta magazynu, jak i instancji kontenera.

Poniżej przedstawiono wymagania dotyczące korzystania z istniejącego konta magazynu:

  • W poniższej tabeli wymieniono obsługiwane typy kont. Kolumna dla warstw odnosi się do wartości parametru -SkuName lub --sku . Kolumna obsługiwanych typów odwołuje się do parametru -Kind or --kind .

    Warstwa Obsługiwany typ
    Premium_LRS FileStorage
    Premium_ZRS FileStorage
    Standard_GRS Storage, StorageV2
    Standard_GZRS StorageV2
    Standard_LRS Storage, StorageV2
    Standard_RAGRS Storage, StorageV2
    Standard_RAGZRS StorageV2
    Standard_ZRS StorageV2

    Te kombinacje obsługują udziały plikowe. Aby uzyskać więcej informacji, zobacz Tworzenie udziału plików platformy Azure i Typy kont magazynu.

  • Reguły zapory dla kont magazynowych nie są jeszcze obsługiwane. Aby uzyskać więcej informacji, zobacz Konfigurowanie zapór i sieci wirtualnych usługi Azure Storage.

  • Podmiot wdrożeniowy musi mieć uprawnienia do zarządzania kontem magazynu, w tym uprawnienia do odczytywania, tworzenia i usuwania udziałów plikowych. Aby uzyskać więcej informacji, zobacz Konfigurowanie minimalnych uprawnień.

  • Właściwość allowSharedKeyAccess konta magazynu musi mieć wartość true. Jedynym sposobem instalacji konta magazynu w usłudze Azure Container Instance (ACI) jest użycie klucza dostępu.

Ważne

Jeśli przypiszesz zarządzaną tożsamość z uprawnieniami przekraczającymi wymagania operacyjne skryptu, autor skryptu odpowiada za zapewnienie ochrony konta magazynowego przed niezamierzonym dostępem. Gdzie to możliwe, stosuj zasadę najmniejszych przywilejów.

Aby określić istniejące konto magazynu, dodaj do elementu właściwości Microsoft.Resources/deploymentScripts następujący kod Bicep:

param storageAccountName string = 'myStorageAccount'

resource deploymentScript 'Microsoft.Resources/deploymentScripts@2023-08-01' = {
  ...
  properties: {
    ...
    storageAccountSettings: {
      storageAccountName: storageAccountName
      storageAccountKey: listKeys(resourceId('Microsoft.Storage/storageAccounts', storageAccountName), '2023-01-01').keys[0].value
    }
  }
}

Pełny przykład definicji Microsoft.Resources/deploymentScripts znajduje się w sekcji Składnia we wcześniejszej części tego artykułu.

Gdy używasz istniejącego konta magazynu, usługa skryptu tworzy udział plików o unikatowej nazwie. Aby dowiedzieć się, jak usługa skryptowa czyści zasób udziału plików, zobacz Czyszczenie zasobów skryptu wdrożenia w dalszej części tego artykułu.

Skonfiguruj wystąpienie kontenera

Skrypt wdrażania wymaga nowego wystąpienia kontenera platformy Azure. Nie można określić istniejącego wystąpienia kontenera. Można jednak dostosować nazwę grupy kontenera przy użyciu polecenia containerGroupName. Jeśli nie określisz nazwy grupy, zostanie ona wygenerowana automatycznie. Do utworzenia tej instancji kontenera wymagana jest dodatkowa konfiguracja. Aby uzyskać więcej informacji, zobacz Konfigurowanie minimalnych uprawnień.

Można również określić wartości subnetId do uruchomienia skryptu wdrożeniowego w sieci prywatnej. Aby uzyskać więcej informacji, zobacz Access a private virtual network (Uzyskiwanie dostępu do prywatnej sieci wirtualnej).

param containerGroupName string = 'mycustomaci'
param subnetId string = '/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myResourceGroup/providers/Microsoft.Network/virtualNetworks/myVnet/subnets/mySubnet'

resource deploymentScript 'Microsoft.Resources/deploymentScripts@2023-08-01' = {
  ...
  properties: {
    ...
    containerSettings: {
      containerGroupName: containerGroupName
      subnetIds: [
        {
          id: subnetId
        }
      ]
    }
  }
}

Uruchamianie skryptu więcej niż raz

Wykonanie skryptu wdrażania jest operacją idempotentną. Jeśli nie ma żadnych zmian we właściwościach deploymentScripts zasobu, w tym skryptu wbudowanego, skrypt nie zostanie uruchomiony podczas ponownego wdrażania pliku Bicep.

Usługa skryptu wdrażania porównuje nazwy zasobów w pliku Bicep z istniejącymi zasobami w tej samej grupie zasobów. Istnieją dwie opcje wielokrotnego uruchamiania tego samego skryptu wdrażania:

  • Zmień nazwę deploymentScripts zasobu. Na przykład użyj funkcji utcNow jako nazwy zasobu lub jako części nazwy zasobu. Można używać funkcji utcNow tylko jako wartości domyślnej parametru.

    Zmiana nazwy zasobu powoduje utworzenie nowego deploymentScripts zasobu. Dobrze jest zachować historię wykonywania skryptu.

  • Określ inną wartość we właściwości forceUpdateTag. Na przykład użyj utcNow jako wartości.

Twórz skrypty wdrożeniowe tak, aby zapewnić idempotentność, dzięki czemu przypadkowe ponowne uruchomienia nie spowodują zmian w systemie. Na przykład podczas tworzenia zasobu platformy Azure za pomocą skryptu wdrażania zweryfikuj jego brak przed utworzeniem, aby upewnić się, że skrypt zakończy się powodzeniem lub uniknąć nadmiarowego tworzenia zasobów.

Używanie programu Microsoft Graph w skrycie wdrażania

Skrypt wdrażania może używać programu Microsoft Graph do tworzenia obiektów i pracy z obiektami w identyfikatorze Entra firmy Microsoft.

Polecenia

Korzystając ze skryptów wdrożeniowych Azure CLI, możesz używać poleceń z grupy poleceń az ad, aby pracować z aplikacjami, nazwami głównymi usług, grupami i użytkownikami. Interfejsy API programu Microsoft Graph można również wywoływać bezpośrednio za pomocą az rest polecenia .

Jeśli używasz skryptów wdrażania programu Azure PowerShell, możesz użyć Invoke-RestMethod polecenia cmdlet , aby bezpośrednio wywołać interfejsy API programu Microsoft Graph.

Uprawnienia

Tożsamość używana przez skrypt wdrażania musi być autoryzowana do pracy z interfejsem API programu Microsoft Graph z odpowiednimi uprawnieniami dla wykonywanych operacji. Musisz autoryzować tożsamość spoza pliku Bicep, na przykład przez wstępnie utworzenie tożsamości zarządzanej przypisanej przez użytkownika i przypisanie jej roli aplikacji dla programu Microsoft Graph. Aby uzyskać więcej informacji, zobacz ten przykład z przewodnika Szybki start.

Czyszczenie zasobów skryptu wdrażania

Te dwa automatycznie utworzone zasoby pomocnicze nigdy nie mogą istnieć dłużej niż zasób deploymentScript, chyba że awarie je usuną. Właściwość cleanupPreference steruje cyklem życia zasobów pomocniczych. Właściwość retentionInterval kontroluje cykl deploymentScript życia zasobu. Oto jak używać tych właściwości:

  • cleanupPreference: Określa preferencję usuwania dwóch zasobów pomocniczych, gdy wykonywanie skryptu osiągnie stan terminalny. Obsługiwane wartości to:

    • Always: Usuń dwa zasoby pomocnicze po osiągnięciu przez wykonanie skryptu stanu końcowego. Jeśli używasz istniejącego konta magazynu danych, usługa skryptów usuwa udział plików utworzony przez tę usługę. deploymentScripts Ponieważ zasób może być nadal obecny po wyczyszczeniu zasobów pomocniczych, usługa skryptu utrwala wyniki wykonywania skryptu (na przykład stdout), dane wyjściowe i wartość zwracaną przed usunięciem zasobów.

    • OnSuccess: Usuń dwa zasoby pomocnicze tylko wtedy, gdy wykonanie skryptu zakończy się pomyślnie. Jeśli używasz istniejącego konta magazynu, usługa skryptu usunie udział plików tylko wtedy, gdy wykonanie skryptu zakończy się pomyślnie.

      Jeśli wykonanie skryptu nie powiedzie się, usługa skryptów czeka do wygaśnięcia wartości retentionInterval, po czym usuwa zasoby pomocnicze, a następnie zasób skryptu wdrożenia.

    • OnExpiration: Usuń dwa zasoby pomocnicze tylko wtedy, gdy retentionInterval ustawienie wygasło. Jeśli używasz istniejącego konta magazynu danych, usługa skryptów usuwa udział plikowy, ale zachowuje konto magazynu danych.

    Wystąpienie kontenera i konto magazynowe są usuwane w zależności od wartości cleanupPreference. Jeśli jednak skrypt nie powiedzie się i cleanupPreference nie zostanie ustawiony na Always, proces wdrażania automatycznie pozostawia kontener uruchomiony przez godzinę lub do momentu wyczyszczenia kontenera. Aby rozwiązać problemy ze skryptem, możesz użyć czasu.

    Jeśli chcesz zachować działanie kontenera po pomyślnych wdrożeniach, dodaj krok uśpienia do skryptu. Na przykład dodaj pozycję Start-Sleep na końcu skryptu. Jeśli nie dodasz kroku uśpienia, kontener zostanie ustawiony na stan terminalu i nie będzie można uzyskać do niego dostępu, nawet jeśli jeszcze go nie usunięto.

  • retentionInterval: określ interwał czasu, który zostanie zachowany przed wygaśnięciem i usunięciem deploymentScript zasobu.

Uwaga

Nie zalecamy używania konta magazynu danych i wystąpienia kontenera, które generuje usługa skryptów, do innych celów. Te dwa zasoby mogą zostać usunięte w zależności od cyklu życia skryptu.

Następne kroki

W tym artykule przedstawiono sposób tworzenia zasobów skryptu wdrażania. Dodatkowe informacje: