Bawię się z wywołanymi przez HTTP funkcjami platformy Azure w kontenerze platformy Docker. Do tej pory wszystkie samouczki i przewodniki, które znalazłem na temat konfigurowania tego, konfigurują funkcję Azure z authLevel" ustawionym na anonymous.

Po uważnym przeczytaniu tego bloga wydaje się możliwe (choć trudne) skonfigurować inne poziomy uwierzytelniania. Niestety obiecany wpis na blogu nie został (jeszcze) napisany.

Czy ktoś może mi pomóc wyjaśnić, jak mam to zrobić i skonfigurować?

5
Maurits van Beusekom 3 listopad 2018, 01:36
Wydaje się, że mają element zaległości i otwarty problem na Github github .com/Azure/azure-functions-core-tools/issues/29
 – 
Sebastian Achatz
4 listopad 2018, 13:45
Dziękuję za twoją opinię, chociaż to nie jest ta sama sytuacja. Podczas uruchamiania w kontenerze Docker działa część autoryzacji. Kiedy konfiguruję wyzwalacz HTTP z authLevel ustawionym na function i wywołuję funkcję, otrzymuję błąd 401. Oznacza to, że muszę dostarczyć właściwy klucz, ale pytanie, jak uzyskać dostęp do klucza, jest pytanie. To samo dotyczy interfejsu Admin API. Jest, ale nie mogę się do niego dostać, ponieważ nie wiem, jak zdobyć token OAuth.
 – 
Maurits van Beusekom
4 listopad 2018, 13:55
Przepraszam, że przegapiłem punkt w twoich pytaniach. Więc chcesz ustawić/uzyskać właściwy klawisz funkcyjny?
 – 
Sebastian Achatz
4 listopad 2018, 20:42
Sekrety powinny znajdować się w pliku json w systemie plików obok funkcji w kontenerze. Jest post dotyczący tajnego tematu rotacji, w którym znajdują się szczegóły. fabriccontroller.net/…
 – 
Sebastian Achatz
4 listopad 2018, 20:52
@SebastianAchatz, jeszcze raz dziękuję za odpowiedź. Po opublikowaniu na platformie Azure rzeczywiście widzę wspomniane pliki json. Zawierają jednak tylko znacznik czasu (najprawdopodobniej kiedy zostały utworzone). W moim kontenerze dockera brakuje tych plików json i prawdopodobnie mógłbym je dodać, gdybym tylko wiedział, co dokładnie w nich umieścić (zgaduję, że tylko znacznik czasu go nie wytnie, nawet jeśli tak, klucz będzie zaszyfrowany reprezentacja znacznika czasu i nie wiem, jaka technika szyfrowania jest używana). Więc to zdecydowanie dało mi dodatkowy wgląd, ale jeszcze nie rozwiązuje mojego problemu.
 – 
Maurits van Beusekom
5 listopad 2018, 12:39

2 odpowiedzi

Najlepsza odpowiedź

Aby kontrolować klucz główny, którego host Function używa podczas uruchamiania - zamiast generowania losowych kluczy - przygotuj własny plik host_secrets.json, taki jak

{
    "masterKey": {
        "name": "master",
        "value": "asGmO6TCW/t42krL9CljNod3uG9aji4mJsQ7==",
        "encrypted": false
    },
    "functionKeys": [{
        "name": "default",
        "value": "asGmO6TCW/t42krL9CljNod3uG9aji4mJsQ7==",
        "encrypted": false
    }]
}

A następnie przekaż ten plik do wyznaczonego folderu tajnych hosta funkcji (Dockerfile):

dla funkcji V1 (przy założeniu, że katalog główny środowiska wykonawczego to C:\WebHost):

...
ADD host_secrets.json C:\\WebHost\\SiteExtensions\\Functions\\App_Data\\Secrets\\host.json
...

dla funkcji V2 (zakładając, że katalog główny środowiska uruchomieniowego to C:\runtime):

...
ADD host_secret.json C:\\runtime\\Secrets\\host.json

USER ContainerAdministrator
RUN icacls "c:\runtime\secrets" /t /grant Users:M
USER ContainerUser

ENV AzureWebJobsSecretStorageType=files
...

Klawisze funkcyjne mogą być używane do wywoływania funkcji chronionych, takich jak .../api/myfunction?code=asGmO6TCW/t42krL9CljNod3uG9aji4mJsQ7==.

Klucz główny może służyć do wywoływania funkcji Admin API i Interfejs API do zarządzania kluczami.

W moim blogu opisuję całą podróż do wprowadzenia środowiska uruchomieniowego funkcji V1 i nowszych do kontenerów Docker i hostuj je w sieci szkieletowej usług.

dla funkcji V3 w systemie Windows:

ENV FUNCTIONS_SECRETS_PATH=C:\Secrets
ENV AzureWebJobsSecretStorageType=Files
ADD host_secrets.json C:\\Secrets\\host.json

dla funkcji V3 w systemie Linux:

RUN mkdir /etc/secrets/
ENV FUNCTIONS_SECRETS_PATH=/etc/secrets
ENV AzureWebJobsSecretStorageType=Files
ADD host_secrets.json /etc/secrets/host.json
7
Kai Walter 27 sierpień 2021, 08:08
Czy możesz umieścić informacje w samej odpowiedzi, a nie tylko odnosić się do własnego bloga?
 – 
Kzrystof
8 marzec 2019, 20:20
Dzięki za odpowiedź, dając +1. Czy jest gdzieś jakaś dokumentacja MS związana z host_secret.json?
 – 
OSP
24 czerwiec 2019, 16:18
Chyba nie, ponieważ ten plik jest tylko wewnętrzny dla hosta funkcji
 – 
Kai Walter
25 czerwiec 2019, 08:15
Przepraszam, jak zastosować to do kontenerów Linux?
 – 
Panzercrisis
26 sierpień 2021, 22:40
1
Załączyłem 2 próbki, jak teraz robimy to dla V3 na Windows i Linux
 – 
Kai Walter
27 sierpień 2021, 08:09

Znalazłem dla mnie rozwiązanie, mimo że ten post jest nieaktualny. Moim celem było uruchomienie funkcji Http Trigger Azure Function w kontenerze Docker z function authLevel. W tym celu używam następującego obrazu Docker: Azure Functions Python z Dockera Centrum.

Utworzony kontener został wypchnięty do Azure Container Registry po tym, jak moje repozytorium było tam gotowe. Chciałem uruchomić kontener bez serwera za pośrednictwem funkcji Azure. Śledziłem więc śledząc wpis i utworzyłem nowe Azure Functions w moim Azure Portal.

W ten sposób zawartość kontenera odpowiada obrazowi funkcji platformy Azure, a działanie samego kontenera jest implementowane za pośrednictwem platformy Azure przez funkcję platformy Azure. Ten sposób może nie zawsze być popularny, ale oferuje zalety hostowania tam kontenera. Kontener można łatwo wybrać z Azure Container Registry za pośrednictwem strony Centrum wdrażania.

Aby obraz kontenera był dostępny za pośrednictwem function authLevel, funkcja Azure Function ~3 nie może utworzyć klucza hosta, ponieważ jest on zarządzany w kontenerze. Postępowałem więc w następujący sposób:

  1. Dostosowywanie mojego function.json
  "authLevel": "function",
  "type": "httpTrigger",
  1. Udostępnianie konta magazynu, aby funkcja Azure mogła tam uzyskać konfiguracje. Utwórz tam nowy kontener.

azure-webjobs-sekrety

  1. Utwórz katalog w kontenerze o nazwie funkcji platformy Azure.

nazwa-mojej-funkcji

  1. Plik host.json można teraz przechowywać w katalogu. Zawiera klucz główny.

{"masterKey": { "name": "master", "value": "myprivatekey", "encrypted": false }, "functionKeys": [ ] }

  1. Teraz należy skonfigurować funkcję Azure, aby uzyskać dostęp do konta magazynu. Do konfiguracji należy dodać następujące wartości.

AzureWebJobsStorage = ciąg połączenia konta magazynu

WEBSITE_CONTENTAZUREFILECONNECTIONSTRING = Ciąg połączenia konta magazynu

WEBSITE_CONTENTSHARE = ​​nazwa-mojej-funkcji

Od teraz dostępny jest przechowywany klucz główny funkcji Azure. Interfejs API kontenera jest zatem konfigurowany za pomocą funkcji authLevel i dostępny tylko za pomocą odpowiedniego klucza.

URL: https://nazwa-mojej-funkcji.azurewebsites .net/api/helloworld

NAGŁÓWEK: x-klucz-funkcyjny = mój klucz-prywatny

-1
Brenner's Daniel 15 luty 2021, 21:12