Dostęp do ustawień aplikacji w Azure Functions
W dzisiejszym szybko rozwijającym się środowisku chmurowym, zarządzanie ustawieniami aplikacji w sposób bezpieczny i elastyczny jest kluczowe — zwłaszcza dla deweloperów budujących przy użyciu Azure Functions. Bez względu na to, czy wdrażasz aplikacje funkcji za pośrednictwem portalu Azure, zarządzasz ustawieniami konfiguracyjnymi przy użyciu Azure Functions Core Tools, czy podłączasz tajemnice za pomocą Key Vault, ważne jest, aby od samego początku poprawnie skonstruować konfigurację aplikacji.
W sesji praktycznej zatytułowanej "Dostęp do AppSettings w aplikacjach konsolowych, włączając Secrets.json", Tim Corey przedstawia najlepsze praktyki z wykorzystaniem ekosystemu .NET. Chociaż skupiamy się na aplikacjach konsolowych, jego koncepcje bezpośrednio odnoszą się do rozwijania i zarządzania ustawieniami aplikacji funkcji w Azure Functions — zwłaszcza podczas pracy lokalnej, ustawiania pliku projektu lub wdrażania do App Service.
W tym artykułe zanalizujemy wszystko korzystając z poglądu Tima i odwzorujemy jego lekcje na nowoczesny rozwój Azure Functions.
Dłączego ustawienia aplikacji są ważne dla Azure Functions
Tim zaczyna od wyjaśnienia, jak kluczowe są ustawienia aplikacji przy budowie czegoś więcej niż najbardziej podstawowe aplikacje .NET. Konieczność dostępu do ustawień aplikacji w środowiskach Azure Function jest jeszcze bardziej wyraźna — biorąc pod uwagę, że runtime Azure Functions oczekuje, że wartości konfiguracyjne zostaną pobrane z zarządzanych magazynów, takich jak zmienne środowiskowe, JSON-owy lokal.settings.json, czy Azure App Configuration.
"Jedna z powszechnych cech, które deweloperzy chcą uzyskać, jest dostęp do pliku ustawień," wyjaśnia Tim w 0:17.
Bez względu na to, czy chodzi o klucz API, ciąg połączeniowy, czy flagę funkcjonalności, elastyczność i bezpieczeństwo konfiguracji są kluczowe — zwłaszcza podczas wdrażania na platformy chmurowe, takie jak Microsoft Azure.
Utwórz fundament dzięki Visual Studio
W 1:24, Tim zakłada projekt konsolowy używając Visual Studio, nazywając go SettingsDemoApp. Chociaż deweloperzy Azure zwykle inicjalizują projekt Functions używając Azure Functions Core Tools, metoda Tima polegająca na szkieletowaniu i organizacji kodu przekłada się bezproblemowo. Ustawienie pliku projektu i struktura kodu są kluczowymi fundamentami — bez względu na to, czy jesteś w środowisku konsolowym, czy budujesz izolowaną aplikację Azure Functions z modelem izolowanego pracownika.
Zainstaluj wymagańe pakiety NuGet
Od 2:33, Tim przeprowadza instalację czterech istotnych pakietów NuGet:
-
Microsoft.Extensions.Configuration
-
Microsoft.Extensions.Configuration.Json
-
Microsoft.Extensions.Configuration.Binder
- Microsoft.Extensions.Configuration.UserSecrets
To odzwierciedla system konfiguracji aplikacji używany przez Azure Functions, który korzysta z tych samych pakietów zakulisowo. Tim podkreśla wartość modularności:
"To właściwie przeciwieństwo rozdmuchania," zauważa, ponieważ .NET Core unika niepotrzebnych ładunków pozwalając deweloperom wybierać opcje za pomocą NuGet.
W typowej aplikacji funkcji te pakiety są albo wstępnie referencjonowane, albo łatwo dodawane w celu wsparcia logiki konfiguracyjnej, wstrzykiwania zależności lub zaawansowanych przypadków użycia, takich jak wsparcie dla Key Vault i Azure App Configuration.
Dodaj i skonfiguruj plik ustawień JSON
W 6:12, Tim tworzy nowy plik o nazwie appsettings.json, naśladując strukturę, jaką widać w local.settings.json dla rozwoju Azure Functions. Wypełnia go parami klucz-wartość jak:
{
"User": {
"FirstName": "Tim",
"LastName": "Corey"
},
"StarterCountValue": 5
}
W funkcjach lokalnie, deweloperzy używają local.settings.json w prawie tej samej formie, aby wczytywać wartości do logiki aplikacji przez wstrzykiwany IConfiguration. Tim również zaznacza kluczowy krok: ustawienie kopiowania pliku do katalogu wyjściowego na "Copy if newer" — kluczowe, aby zapewnić dostępność konfiguracji w czasie wykonania.
Ręcznie zbuduj potok konfiguracji
Tim przystępuje do pisania kodu, który ręcznie ustawia potok konfiguracji używając:
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
Chociaż runtime Azure Functions zajmuje się tym potokiem automatycznie, analiza Tima wyjaśnia, jak projekty funkcji czerpią wartości z różnych źródeł. Jego wykorzystanie .AddJsonFile() odzwierciedla jak deweloperzy konfigurują local.settings.json w swojej aplikacji Azure, a reloadOnChange wprowadza koncepcję dynamicznego odświeżania ustawień konfiguracyjnych w trakcie rozwoju.
Odczytaj wartości z bezpieczeństwem typów
Tim pokazuje jak odczytać ustawienia za pomocą metody GetValue() w 11:00:
int count = config.GetValue<int>("StarterCountValue");
I dla zagnieżdżonych ustawień, używa:
string firstName = config.GetValue<string>("User:FirstName");
Podczas pracy z Azure Functions te same wzorce składniowe się stosują. Użycie przez Tima kluczy z delimitacją dwukropkiem ("User:FirstName") ma bezpośrednie odwzorowanie w zmiennych środowiskowych za pomocą podwójnego podkreślenia (__):
User__FirstName=Tim
To jest szczególnie przydatne podczas wdrażania do Azure App Service lub konfigurowania za pośrednictwem portalu Azure, gdzie można nadpisywać ustawienia w czasie wykonania używając ustawień aplikacji lub nadpisywań opartych na środowisku.
Zajmij się tajemnicami bezpiecznie z UserSecrets
W 15:00, Tim wprowadza wzorzec secrets.json za pomocą User Secrets, używany do przechowywania danych wrażliwych, takich jak klucze API czy ciągi połączeniowe, bez ich eksponowania w kontroli wersji. Pokazuje jak dołączyć User Secrets store do projektu używając tej linii:
builder.AddUserSecrets<Program>();
Podkreśla, że kolejność ma znaczenie — User Secrets przykrywa źródła konfiguracyjne wcześniejsze, wzmacniając zasadę ostatniego wygrywa. Chociaż Azure Functions nie używa bezpośrednio secrets.json, w produkcyjnym środowisku chmurowym używa się Azure Key Vault, opcjonalnie z uwierzytelnianiem zarządzonym identyfikatora, aby osiągnąć te same bezpieczne nadpisywania.
Tim zauważa, że tajemnice w lokalnym rozwoju są zamiennikiem dla dowolnego bezpiecznego systemu używanego w produkcji:
"Ten secrets.json jest zamiennikiem dla dowolnego bezpiecznego systemu, który używasz do przechowywania prawdziwych wartości — czy to jest Key Vault czy ustawienia środowiskowe."
Uruchom i waliduj konfigurację
Po skonfigurowaniu zarówno appsettings.json, jak i secrets.json, Tim uruchamia przykład i weryfikuje, że tajemnice przykrywają wartości podstawowe. To bezpośrednio odzwierciedla, jak Azure Functions radzą sobie z przykryciami z różnych źródeł: local.settings.json, Azure App Configuration, zmiennych środowiskowych, czy Key Vault.
Bez względu na to, czy używasz Azure Functions Core Tools z wiersza polecenia, czy wdrażasz poprzez Visual Studio, kolejność ładowania i warstwy konfiguracji aplikacji działają dokładnie tak, jak opisuje to Tim.
Najlepsze praktyki zarządzania konfiguracją
Tim kończy zalecając zachowanie wartości konfiguracyjnych, które nie zmieniają się często — jak flagi funkcji, ustawienia częstotliwości, czy konfiguracje CORS — w pliku JSON, a umieszczanie danych wrażliwych, takich jak ciągi połączeniowe i tajemnice, w bezpiecznym magazynie.
To zgodne z nowoczesnymi najlepszymi praktykami dla Azure Functions, gdzie:
-
Deweloperzy używają local.settings.json dla funkcji lokalnie
-
Zespoły korzystają z portalu Azure do ustawień aplikacji
-
Tajemnice trafiają do Key Vault
- Wartość z Azure App Configuration store pomaga oddzielić ustawienia od kodu
Te źródła integrowane są z czasem pracy przez wstrzykiwanie zależności, bez dotykania binariów aplikacji.
Podsumowanie
Chociaż film Tima jest o aplikacjach konsolowych, każda technika, którą pokazuje, płynnie przechodzi na aplikacje Azure Functions — od tworzenia plików konfiguracyjnych, odczytu kluczy, użycia zarządzanych identyfikatorów po ładowanie konfiguracji przez wstrzykiwanie zależności. Bez względu na to, czy wdrażasz z Visual Studio, zarządzasz kontem azure, czy chcesz znaleźć pełne przykłady kodu, jego wglądy odwzorowują się bezpośrednio na praktyki chmurowe w rzeczywistości.
