Zmniejszamy koszt dostępu do Azure Key Vault

Azure Key Vault jest usługą dostępną w chmurze i umożliwiającą bezpieczne przechowywanie haseł, kluczy, certyfikatów oraz innych informacji, do których dostęp z poziomu aplikacji powinien być ściśle regulowany. Jakiś czas temu dotarły do mnie jednak informacje, że potrafi być on również usługą, generującą niemałe koszty. O tym, z czego wynikała ta sytuacja i jak jej zaradzić przeczytacie poniżej.

W aplikacjach, z którymi pracowałem w przeszłości, najczęściej spotykaną metodą dostępu do Key Vaulta było wykorzystanie obiektu SecretClient pochodzącego z pakietu Microsoft.Azure.Security.KeyVault.Secrets. Przykładowy kod pobierający dane z „sejfu” mógłby wyglądać w następujący sposób:

private const string KeyVaultUriFormat = "https://{0}.vault.azure.net";
public virtual KeyVaultSecret GetKeyVaultSecret(string keyVaultName, string secretKey)
{
   var client = GetSecretClient(keyVaultName);
   return client.GetSecret(secretKey);
}

public SecretClient GetSecretClient(string keyVaultName)
{
   var keyVaultUri = string.Format(KeyVaultUriFormat, keyVaultName);
   return new SecretClient(new Uri(keyVaultUri), new DefaultAzureCredential());
}

Przedstawione powyżej podejście wiąże się z kilkoma ryzykami. Zgodnie z aktualnym cennikiem (https://azure.microsoft.com/en-us/pricing/details/key-vault/) każdorazowy dostęp do Key Vaulta generuje określony koszt dla użytkownika. W przypadku aplikacji obsługujących miliony requestów na dobę – wspomniany koszt może stać się zauważalną pozycją w naszym budżecie. Niestety, często spotykanym błędem początkujących twórców aplikacji jest każdorazowe odpytywanie „sejfu” za pomocą ww. kodu w momencie konieczności obsługi nowego żądania przychodzącego do naszego serwera aplikacyjnego.

W jaki sposób zminimalizować koszt użycia Key Vaulta. Naturalną odpowiedzią wydaje się jakiś rodzaj cache’u. Niestety komercyjne rozwiązania tego typu (np. Redis) nie są również dostępne za darmo. W związku z tym użycie tego typu narzędzia niekoniecznie musi zmniejszyć całkowity koszt działania naszego systemu. Dużo prostszym i -co więcej- darmowym rozwiązaniem wydaje się być natomiast umieszczenie referencji do danych z Key Vaulta bezpośrednio w konfiguracji naszej aplikacji. Wpis tego typu może wyglądać w następujący sposób:

@Microsoft.KeyVault(VaultName=myKeyVaultName;SecretName=requiredSecretName)

Gdzie:

  • myKeyVaultName – nazwa naszego internetowego sejfu
  • requiredSecretName – nazwa poufnego wpisu, którego wartość chcemy odczytać

Konfiguracja aplikacji pobierana jest w momencie jej pierwszego uruchomienia. Tak więc dopóki nasza aplikacja działa, dopóty Key Vault odpytywany jest tylko raz w momencie jej startu, co może znacząco zmniejszyć koszt wykorzystywania tej usługi. Stosując ww. metodę w przypadku funkcji serverless wykorzystującej „Consumption Plan” udało mi się zmniejszyć koszt używania Azure Key Vaulta około ośmio-dziewięciokrotnie w porównaniu z podejściem prezentowanym na początku artykułu.

Total Views: 166 ,