JustCloud.pl Blog - Azure, DevOps & Cloud Engineering

Przejdź do głównej zawartości

Automatyzacja Azure Policy z EPAC jak zacząć?

· 4 min aby przeczytać
Piotr Rogala
MVP Azure & owner JustCloud.pl

Zarządzasz większą liczbą Azure Policy i przypisań na poziomie Management Groups? Portal Azure szybko robi się niewygodny, a trzymanie wszystkiego w dużych plikach Terraform też nie zawsze kończy się czytelną strukturą. EPAC rozwiązuje ten problem podejściem Policy as Code.

Poniżej pokażę Ci, czym jest Enterprise Policy as Code, jak zrobić eksport obecnego środowiska i jak używać najważniejszych komend do lokalnych testów oraz wdrożeń.

Co to jest EPAC

Enterprise Policy as Code (EPAC) to moduł PowerShell do zarządzania:

  • definicjami polityk
  • inicjatywami Policy Set
  • przypisaniami polityk
  • wykluczeniami i dokumentacją
  • wymaganymi rolami RBAC dla polityk typu DeployIfNotExists

Najważniejsze jest to, że EPAC działa w modelu desired state. Repozytorium staje się źródłem prawdy, a narzędzie potrafi porównać konfigurację z rzeczywistym stanem środowiska i przygotować plan zmian.

Ważna uwaga: przed pierwszym wdrożeniem zrób eksport istniejących polityk. To najprostsza droga, jeśli Twoje środowisko było dotąd konfigurowane ręcznie w portalu.

Azure DevOps MCP Server w VS Code instalacja i automatyzacja w 5 krokach

· 3 min aby przeczytać
Piotr Rogala
MVP Azure & owner JustCloud.pl

Chcesz bezpiecznie podłączyć Azure DevOps do Copilota przez MCP? Poniżej masz krótką, konkretną instrukcję i listę możliwości serwera.

Ważna uwaga: używaj wyłącznie zaufanych serwerów MCP. To bezpośredni dostęp do Twoich zasobów, więc nie podawaj danych logowania, jeśli nie masz pewności co do źródła.

Serwery MCP znajdziesz na: https://mcpservers.org

Visual Studio Code ma natywną obsługę serwerów MCP – możesz je wyszukiwać i instalować bezpośrednio z wbudowanego Marketplace rozszerzeń, filtrując wyniki po słowie kluczowym "MCP". Filtr MCP w VS Code

Czytelne podsumowanie wdrożenia Terraform w GitHub Actions - Terraform Summary

· 3 min aby przeczytać
Piotr Rogala
MVP Azure & owner JustCloud.pl

Jeśli korzystasz z GitHub Actions i Terraform, ta wtyczka z pewnością Ci się spodoba. W rozbudowanych środowiskach, gdzie zarządzamy wieloma repozytoriami i pipeline'ami, a wdrożenia Terraform są obszerne i często modyfikowane, kluczowa jest szybka identyfikacja zmian oraz potencjalnych błędów. Przeglądanie surowych logów z terraform plan bywa męczące.

Z pomocą przychodzi wtyczka: Terraform summary action.

Pozwala ona na przetworzenie wyniku polecenia terraform plan i wyświetlenie go w formie czytelnego podsumowania bezpośrednio w widoku "Summary" uruchomionego workflow.

Oto jak dodać ją do swojego pipeline'u:

      - name: Terraform Plan
working-directory: ${{ env.WORKING_DIR }}
env:
ARM_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
ARM_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
ARM_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
ARM_USE_OIDC: true
# Dla wywołania terraform plan należy dodać: "| tee terraform_plan_output.txt"
run: terraform plan -var-file="production.tfvars" | tee terraform_plan_output.txt

# Po terraform plan należy dodać uruchomienie terraform summary
- name: Terraform Plan Summary
uses: sgametrio/terraform-summary-action@main
with:
log-file: ${{ env.WORKING_DIR }}/terraform_plan_output.txt
title: 'Terraform Plan Summary'

Podsumowanie zmian Terraform w GitHub Actions

Bezpieczne wdrażanie do Azure z GitHub Actions: Konfiguracja OIDC

· 5 min aby przeczytać
Piotr Rogala
MVP Azure & owner JustCloud.pl

Chcesz skonfigurować bezpieczny dostęp do Microsoft Azure z poziomu GitHub Actions dla wdrożeń infrastruktury i aplikacji? Jeśli tak, to ten przewodnik jest dla Ciebie. Pokażę Ci, jak to zrobić krok po kroku, wykorzystując Azure CLI.

Dlaczego OIDC?

Dlaczego to rozwiązanie jest bezpieczniejsze od tradycyjnego Service Principal z kluczem (secret)? Ponieważ nie tworzymy konta z hasłem, które trzeba rotować i chronić przed wyciekiem.

Mechanizm ten działa na zasadzie Workload Identity Federation. Polega on na powiązaniu obiektu Service Principal w Azure z konkretnym repozytorium GitHub. Dzięki protokołowi OIDC (OpenID Connect), GitHub wymienia swój token tożsamości na krótko żyjący token dostępu do Azure.

Więcej o tym mechanizmie przeczytasz w dokumentacji Microsoft.

Wymagania

Do wykonania poniższych kroków będziesz potrzebować Azure CLI.

Konfiguracja krok po kroku

Po zalogowaniu się do Azure (az login), wykonaj poniższe polecenia w terminalu. Dla wygody możesz też użyć Cloud Shell dostępnego w Azure Portal.

1. Tworzenie aplikacji i Service Principal

Najpierw utworzymy App Registration oraz Service Principal.

# Tworzymy App Registration i pobieramy appId
az ad app create --display-name "gh-action-private" --query "appId" -o tsv

# UWAGA: Skopiuj wyświetlony appId. Będzie on używany w kolejnych komendach jako [appId].

# Tworzymy Service Principal dla aplikacji
az ad sp create --id [appId]

Pierwsza komenda utworzy nowy obiekt App Registration w Microsoft Entra ID.

Wynik polecenia tworzenia App Registration w terminalu

Szybkie wdrożenie Azure OpenAI z Terraform i AVM

· 2 min aby przeczytać
Piotr Rogala
MVP Azure & owner JustCloud.pl

Moduły AVM (Azure Verified Modules) oferują gotowe i sprawdzone rozwiązania do tworzenia zasobów w Azure. Poniżej pokażę, jak błyskawicznie wdrożyć usługę Azure OpenAI Service przy użyciu Terraform. Prezentowana konfiguracja korzysta z publicznego dostępu sieciowego, co jest odpowiednie do testów i nauki (w środowiskach produkcyjnych zaleca się wdrożenie przy użyciu Private Endpoints).

Jak tego użyć?

W pliku main.tf definiujemy grupę zasobów oraz wywołujemy moduł AVM:

resource "azurerm_resource_group" "this" {
name = var.resource_group_name
location = var.location

tags = var.tags
}

module "openai" {
source = "Azure/avm-res-cognitiveservices-account/azurerm"
version = "~> 0.7"

name = var.openai_service_name
resource_group_name = azurerm_resource_group.this.name
location = azurerm_resource_group.this.location
kind = "OpenAI"
sku_name = "S0"

cognitive_deployments = { for d in var.openai_models : d.deployment_name => {
name = d.deployment_name
model = {
format = "OpenAI"
name = d.model_name
version = d.model_version
}
scale = {
type = d.sku_name
capacity = d.sku_capacity
}
} }

public_network_access_enabled = var.public_network_access == "Enabled"
outbound_network_access_restricted = !var.outbound_network_access_enabled

tags = var.tags

depends_on = [azurerm_resource_group.this]
}