Rozwiązywanie typowych problemów podczas korzystania z narzędzia Terraform w Azure

W tym artykule wymieniono typowe problemy i możliwe rozwiązania podczas korzystania z narzędzia Terraform w Azure.

Jeśli wystąpi problem specyficzny dla programu Terraform, użyj jednego z kanałów pomocy technicznej społeczności firmy HashiCorp.

Kanały pomocy technicznej specyficzne dla programu Terraform firmy HashiCorp

Nie można wyświetlić listy stanu rejestracji dostawcy

Komunikat o błędzie:

Błąd: Nie można wyświetlić listy stanu rejestracji dostawcy. Ten błąd może wystąpić z powodu nieprawidłowych poświadczeń lub dlatego, że jednostka usługi nie ma uprawnień do korzystania z interfejsu API Resource Manager. Błąd platformy Azure: resources.ProvidersClient#List: Niepowodzenie podczas odpowiadania na żądanie: StatusCode=403 -- Oryginalny błąd: autorest/azure: Usługa zwróciła błąd. Status=403 Code="AuthorizationFailed" Message="Klient '00000000-0000-0000-0000-000000000000' o identyfikatorze obiektu '00000000-0000-0000-0000-000000000000' nie ma uprawnień do wykonania akcji 'Microsoft.Resources/subscriptions/providers/read' w zakresie '/subscriptions/00000000-0000-0000-0000-000000000000' lub zakres jest nieprawidłowy. Jeśli dostępu udzielono niedawno, odśwież swoje poświadczenia”.

Tło: Jeśli uruchamiasz polecenia narzędzia Terraform w usłudze Cloud Shell i definiujesz określone zmienne środowiskowe Terraform/Azure, mogą wystąpić konflikty. W poniższej tabeli wymieniono zmienne środowiskowe i wartości Azure, które reprezentują:

Zmienna środowiskowa Wartość Azure
ARM_SUBSCRIPTION_ID Identyfikator subskrypcji Azure
ARM_TENANT_ID identyfikator dzierżawy konta Microsoft
ARM_CLIENT_ID identyfikator aplikacji jednostki usługi Azure
ARM_CLIENT_SECRET Hasło nazwy głównej usługi Azure

Przyczyna: W chwili pisania tego tekstu skrypt Terraform uruchamiany w Cloud Shell zastępuje zmienne środowiskowe ARM_SUBSCRIPTION_ID i ARM_TENANT_ID, używając wartości z bieżącej subskrypcji platformy Azure. W związku z tym, jeśli jednostka usługi, do której odwołują się zmienne środowiskowe, nie ma uprawnień do bieżącej subskrypcji platformy Azure, operacje Terraform kończą się niepowodzeniem.

Błąd podczas uzyskiwania blokady stanu

Komunikat o błędzie:

Błąd: Błąd podczas uzyskiwania blokady stanu; Komunikat o błędzie: wystąpiły 2 błędy:
* Stanowy obiekt blob jest już zablokowany
* Metadane obiektu blob "terraformlockid" były puste
Terraform zakłada blokadę stanu, aby zabezpieczyć go przed jednoczesnym zapisem przez wielu użytkowników. Rozwiąż powyższy problem i spróbuj ponownie. W przypadku większości poleceń można wyłączyć blokowanie za pomocą flagi "-lock=false", ale nie jest to zalecane.

Kontekst: Jeśli uruchamiasz polecenia Terraform na pliku stanu Terraform i ten błąd jest jedynym wyświetlanym komunikatem, mogą występować następujące przyczyny. Ten błąd dotyczy plików stanu lokalnego i zdalnego.

Przyczyna: Istnieją dwie potencjalne przyczyny tego błędu. Pierwszą przyczyną jest to, że polecenie Terraform jest już wykonywane na pliku stanu i nałożyło na niego blokadę, dzięki czemu nic nie ulegnie uszkodzeniu. Drugą potencjalną przyczyną jest to, że wystąpiła przerwa w połączeniu między plikiem stanu a interfejsem wiersza polecenia, gdy polecenia były uruchomione. Ta przerwa występuje najczęściej w przypadku korzystania z plików stanu zdalnego.

Rozwiązanie: Najpierw upewnij się, że nie uruchomiono jeszcze żadnych poleceń względem pliku stanu. Jeśli pracujesz z lokalnym plikiem stanu, sprawdź, czy w jakichś terminalach są uruchomione jakieś polecenia. Możesz też sprawdzić potoki wdrażania, aby sprawdzić, czy coś uruchomionego może używać pliku stanu. Jeśli ten warunek nie rozwiąże problemu, możliwe, że druga przyczyna wyzwoliła błąd. W przypadku pliku stanu zdalnego przechowywanego w kontenerze konta Azure Storage można zlokalizować plik i użyć przycisku Przerwij dzierżawę.

Zrzut ekranu przedstawiający przycisk przerwania dzierżawy kontenera Azure Storage.

Jeśli używasz innych backendów do przechowywania pliku stanu, informacje i zalecenia znajdziesz w dokumentacji HashiCorp.

Błędy sieci VPN

Aby uzyskać informacje na temat rozwiązywania problemów z błędami sieci VPN, zobacz artykuł Rozwiązywanie problemów z hybrydowym połączeniem sieci VPN.

Terraform planuje usunięcie i ponowne utworzenie konta magazynu danych

Terraform może planować usunięcie i ponowne utworzenie konta usługi Azure Storage po wprowadzeniu przez Azure zmian w koncie magazynu poza Terraformem. To zachowanie może wystąpić podczas obsługiwanej konwersji nadmiarowości konta usługi Azure Storage, w przypadku której account_replication_type przekracza granicę między zestawem niestrefowym (LRS, GRS, RA-GRS) a zestawem strefowym (ZRS, GZRS, RA-GZRS).

Przed zastosowaniem planu zapoznaj się z proponowanymi zmianami i potwierdź, dlaczego Terraform uznaje zastąpienie konta magazynowego za konieczne. Ponowne utworzenie konta magazynu może spowodować przestój aplikacji lub utratę danych.

Aby ograniczyć to ryzyko:

  • Wyłącz automatyczne zatwierdzanie wdrożeń, które zarządzają kontami magazynowymi, i należy sprawdzać każde terraform plan.
  • Skonfiguruj prevent_destroy = true w bloku lifecycle zasobu konta magazynu.
  • Przed rozpoczęciem konwersji tymczasowo dodaj account_replication_type do ignore_changes.
  • Po konwersji uruchom polecenie terraform apply -refresh-only , aby zaktualizować stan programu Terraform, a następnie zaktualizuj konfigurację programu Terraform w celu dopasowania do wdrożonego konta magazynu.
  • Usuń ignore_changes tylko po uruchomieniu terraform plan i potwierdzeniu, że nie zgłasza żadnych nieoczekiwanych zmian.

Aby uzyskać szczegółowe wskazówki dotyczące konwersji, zobacz Zapobieganie rozjazdowi stanu w Terraform dla zasobów platformy Azure utrzymujących stan.