⚡ Microsoft Graph & CI/CD

Mantenere Attivo il Tenant M365 E5 Developer: Script Rinnovo [2026]

⚡ La Regola dei 90 Giorni di Microsoft

L'abbonamento Microsoft 365 E5 Developer include 25 licenze enterprise complete (del valore di circa 1.300€/anno). Microsoft lo offre gratuitamente agli sviluppatori, ma con una condizione perentoria: l'ambiente deve mostrare attività continuativa di sviluppo. Se il tenant rimane inattivo, alla scadenza dei 90 giorni viene revocato ed eliminato.

🚀 Template Repository Ufficiale: Per velocizzare il setup senza dover creare i file a mano, puoi fare "Use this template" o clonare direttamente il repository pronto all'uso su GitHub: AlexMaina05/m365-developer-keepalive ↗.

1. Architettura dell'Automazione

Per garantire che la telemetria di Microsoft registri l'attività senza richiedere il tuo intervento manuale quotidiano, allestiamo un'architettura completamente serverless:


2. Configurazione dell'App Registration in Entra ID

  1. Accedi a entra.microsoft.com con l'account amministratore del tenant E5.
  2. Vai su Applicazioni → Registrazioni app → Nuova registrazione.
  3. Assegna il nome M365-KeepAlive-Automation e lascia selezionato Solo account in questa directory aziendale.
  4. Copia il Tenant ID e l'Application (client) ID.
  5. Vai nella scheda Certificati e segreti → Nuovo segreto client, crea un segreto con scadenza a 24 mesi e copia immediatamente il valore.
  6. Vai su Autorizzazioni API → Aggiungi un'autorizzazione → Microsoft Graph → Autorizzazioni applicazione e seleziona:
    • User.Read.All (Lettura profili utente)
    • Calendars.ReadWrite (Creazione eventi calendario)
    • Directory.Read.All (Lettura configurazione directory)
  7. Clicca su Concedi consenso amministratore per [Tuo Tenant].

3. Lo Script di Attività Microsoft Graph (Python)

Crea un file denominato keepalive.py nel tuo repository privato:

import os
import requests
from datetime import datetime, timedelta

TENANT_ID = os.environ["M365_TENANT_ID"]
CLIENT_ID = os.environ["M365_CLIENT_ID"]
CLIENT_SECRET = os.environ["M365_CLIENT_SECRET"]

# 1. Acquisizione del token OAuth2 tramite Client Credentials Flow
token_url = f"https://login.microsoftonline.com/{TENANT_ID}/oauth2/v2.0/token"
token_data = {
    "grant_type": "client_credentials",
    "client_id": CLIENT_ID,
    "client_secret": CLIENT_SECRET,
    "scope": "https://graph.microsoft.com/.default"
}

res = requests.post(token_url, data=token_data)
res.raise_for_status()
access_token = res.json()["access_token"]
headers = {"Authorization": f"Bearer {access_token}", "Content-Type": "application/json"}

print("✅ Token Graph acquisito con successo.")

# 2. Query di telemetria: Lista utenti del tenant
users_res = requests.get("https://graph.microsoft.com/v1.0/users?$top=5", headers=headers)
users = users_res.json().get("value", [])
print(f"📡 Rilevati {len(users)} utenti nel tenant.")

# 3. Creazione di un evento di test nel calendario del primo utente
if users:
    target_user_id = users[0]["id"]
    now = datetime.utcnow()
    event_payload = {
        "subject": f"Dev Sprint Sync - {now.strftime('%Y-%m-%d %H:%M')}",
        "body": {"contentType": "HTML", "content": "Attività di sviluppo automatica Graph API."},
        "start": {"dateTime": (now + timedelta(hours=1)).isoformat(), "timeZone": "UTC"},
        "end": {"dateTime": (now + timedelta(hours=2)).isoformat(), "timeZone": "UTC"}
    }
    
    event_res = requests.post(
        f"https://graph.microsoft.com/v1.0/users/{target_user_id}/events",
        headers=headers,
        json=event_payload
    )
    if event_res.status_code == 201:
        print("📅 Evento di telemetria registrato correttamente nel calendario utente.")

4. Schedulazione del Cron Job su GitHub Actions

Nel tuo repository GitHub, crea il file .github/workflows/keepalive.yml:

name: M365 E5 KeepAlive Automation

on:
  schedule:
    # Esegue ogni lunedì, mercoledì e venerdì alle 08:30 UTC
    - cron: '30 8 * * 1,3,5'
  workflow_dispatch: # Consente l'avvio manuale con un clic

jobs:
  telemetry:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout codice
        uses: actions/checkout@v4

      - name: Configurazione Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.12'

      - name: Installazione dipendenze
        run: pip install requests

      - name: Esecuzione Telemetria Graph
        env:
          M365_TENANT_ID: ${{ secrets.M365_TENANT_ID }}
          M365_CLIENT_ID: ${{ secrets.M365_CLIENT_ID }}
          M365_CLIENT_SECRET: ${{ secrets.M365_CLIENT_SECRET }}
        run: python keepalive.py

💡 Verifica Periodica: Controlla periodicamente la dashboard del portale developer.microsoft.com: noterai che alla scadenza del ciclo dei 90 giorni la data limite viene posticipata automaticamente senza alcuna interruzione.

❓ Domande Frequenti (FAQ Tecniche)

Risposte sintetiche ai dubbi architetturali e agli errori operativi più frequenti su questo scenario.

Come decide Microsoft se rinnovare o revocare un tenant Developer E5?

Un algoritmo di telemetria proprietario analizza l'attività dell'ambiente negli ultimi 90 giorni. Se rileva chiamate autenticate a Microsoft Graph, deployment di app, modifiche di utenti o flussi Power Platform, estende la scadenza di ulteriori 90 giorni in modo indefinito.

È sicuro archiviare le credenziali dell'app su GitHub Actions?

Sì, a patto di utilizzare esclusivamente i GitHub Repository Secrets cifrati (TENANT_ID, CLIENT_ID, CLIENT_SECRET) e non committare mai credenziali in chiaro nel codice o nei log di esecuzione.

Cosa succede se il tenant scade?

Microsoft concede un periodo di grazia (Grace Period) di circa 30 giorni in cui il tenant entra in sola lettura prima di procedere alla distruzione permanente dei dati, delle cassette postali e delle configurazioni cloud.