Od kiedy zainteresowałem się chmurą Microsoft Azure początkowe kroki skierowałem do Portalu.
Postawiłem kilka maszyn wirtualnych, strony www, proste funkcje. Następnie spróbowałem przygotować to samo bez jednego kliknięcia myszą. Do wyboru miałem Powershell i moduł az CLI 2.0 napisany w Pythonie. Wybrałem az.
Pierwsza linia kodu skryptu powołującego chmurową infrastrukturę wyglądała tak.
az login
Pojawia się wtedy komunikat
To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code CCJULN8F8 to authenticate.
Za pomocą podanej strony i kodu autoryzacyjnego muszę wskazać użytkownika , a potem wpisać hasło.
Co zrobić, jeśli chciałbym uniknąć podawania za każdym razem hasła administratora subskrypcji i stworzyć techniczny byt, który pozwoli na wielokrotne uruchamianie np. skryptu wdrożeniowego, oczywiście bez interakcji z wyskakującymi oknami.
Poniżej przedstawiam prosty sposób na skorzystanie z service principala
Składnia
az login --service-principal --username APP_ID --password KEY --tenant TENANT_ID
Jak widać potrzebne nam będą trzy identyfikatory.
Zacznijmy od TENAND_ID.
Wybieramy menu Azure Active Directory i zakładkę Properties
To, co widzimy w miejscu Directory ID to nasz TENAND_ID. Kopiujemy i zapisujemy sobie na boku.
Pozostałe dwa identyfikatory wymagają stworzenia aplikacji.
Zmieniamy zakładkę Properties na App registrations.
Tworzymy nową aplikację typu Web app/API. Swoją nazwałem deployer. Adres url nie ma znaczenia w naszym zastosowaniu, wpisujemy dowolną wartość.
Po utworzeniu aplikacji mamy dostęp do identyfikatora APP_ID
Kopiujemy Application ID i zachowujemy w tym samym miejscu co TENANT_ID.
Czas na ostatni identyfikator, czyli KEY. Wchodzimy na zakładkę Keys.
Tworzymy nowy klucz o nazwie np. KeyOne i terminie wygaśnięcia za jeden rok, pole Value zostanie wypełnione po zapisaniu klucza
W tym momencie powinniśmy skopiować wartość klucza. Jest to operacja jednorazowa. Portal o tym uczciwie przypomina. Klucz oczywiście można skasować i wygenerować kolejny.
Mamy już trzy identyfikatory. Co dalej ?
Spróbujmy połączyć się do subskrypcji z poziomu linii komend.
az login --service-principal
--username 478f8c58-7f6b-4c5c-8d24-df65611eceb7
--password jucwH20DjZrF6G1qE/r6siusJCx88V3VT0caywAsiFs=+JhghFCDdTECO8XCuzA=
--tenant 3acd9081-d979-40d1-a2ad-aaaaaaaa
Po zalogowaniu się pojawi się zwrotny komunikat w postaci JSON
[
{
"cloudName": "AzureCloud",
"id": "a12fd30b-a8f0-4c46-9489-ffd9848c4564",
"isDefault": true,
"name": "AzureWarsztaty",
"state": "Enabled",
"tenantId": "3acd9081-d979-40d1-a2ad-aaaaaaaa",
"user": {
"name": "478f8c58-7f6b-4c5c-8d24-df65611eceb7",
"type": "servicePrincipal"
}
}
]
Podanie błędnych danych kończy się małą katastrofą z kodem 401.
Get Token request returned http error: 401 and server response:
{"error":"invalid_client","error_description":"AADSTS70002: Error validating credentials.
AADSTS50012: Invalid client secret is provided.\r\n
Trace ID: b83728c1-ab59-40c6-8b31-f2a9641a4300\r\n
Correlation ID: d7dfa0f0-424d-49ed-ab0a-a28696ea83e6\r\n
Timestamp: 2018-05-09 19:45:47Z","error_codes":[70002,50012],"timestamp":"2018-05-09 19:45:47Z","trace_id":"b83728c1-ab59-40c6-8b31-f2a9641a4300","correlation_id":"d7dfa0f0-424d-49ed-ab0a-a28696ea83e6"}
Spróbujmy stworzyć nową grupę zasobów
az group create -l eastus -n principaltest
Pojawił się komunikat.
The client 'c2fb7600-0f1d-46fd-b75a-efd16c02c67f'
with object id 'c2fb7600-0f1d-46fd-b75a-efd16c02c67f' does not have authorization
to perform action 'Microsoft.Resources/subscriptions/resourcegroups/write'
over scope '/subscriptions/a12fd30b-a8f0-4c46-9489-xxxxxx/resourcegroups/principaltest'.
Brakuje uprawnień dla naszej aplikacji i słusznie.
Nadajmy uprawnienia dla aplikacji na poziomie subskrypcji.
Dodajemy z poziomu zakładki Access control [IAM] uprawnienia Contributor dla całej subskrypcji.
Uruchamiamy ten sam kod i teraz mamy już komunikat zwrotny
{
"id": "/subscriptions/a12fd30b-a8f0-4c46-9489-xxxxxx/resourceGroups/principaltest",
"location": "eastus",
"managedBy": null,
"name": "principaltest",
"properties": {
"provisioningState": "Succeeded"
},
"tags": null
}
Wchodzimy na zakładkę Activity Log naszej nowej grupy zasobów i widać, kto i kiedy utworzył zasób.
Usuwamy grupę zasobów
az group delete -n principaltest
Are you sure you want to perform this operation? (y/n): y
| Finished ..
To samo można zrobić z poziomu CLI bez korzystania z Portalu, ale o tym innym razem…..
Literatura:
Dodaj komentarz