All skills
microsoft avatar

/azure-prepare

@b8a1c66
by microsoftmicrosoft/skills3.1k stars
351

Prepare azd-based Azure projects for deployment: generates azure.yaml, infrastructure (Bicep/Terraform), and Dockerfiles for the Azure Developer CLI (azd) workflow. USE ONLY when the user explicitly wants to use azd as the deployment tool, or the project already has an azure.yaml file. DO NOT USE FOR: non-azd deployments, Python App Service code-only deploys (use python-appservice-deploy), or cross-cloud migration (use azure-cloud-migrate). WHEN: prepare app for azd, create azure.yaml, set up azd infrastructure, modernize app for Azure with azd, deploy with azd, function app, timer trigger, service bus trigger, event-driven function, managed identity, generate Bicep, generate Terraform, create and deploy to Azure.

Use this Skill: https://skilld.dev/gh/microsoft/skills/azure-prepare

This session only. Nothing lands on disk.

referencesservicesapp-servicetemplatesweb-app.md

≈1.3k tokens on demand. Your agent reads this file only when SKILL.md points to it.

Full-Stack Web App Template — REFERENCE ONLY

Template for server-side rendered web applications on Azure App Service. Use for MVC, Razor Pages, Next.js SSR, Django, or React+API patterns.

Templates by Pattern

Pattern AZD Template Framework
React + C# API azd init -t todo-csharp React SPA + ASP.NET Core API
React + Node.js API azd init -t todo-nodejs-mongo React SPA + Express API
React + Python API azd init -t todo-python-mongo React SPA + FastAPI
React + Java API azd init -t todo-java-mongo React SPA + Spring Boot

Browse all: Awesome AZD

💡 Tip: For static frontends with API backends, consider Azure Static Web Apps instead. Use App Service when you need full server-side rendering.

Architecture Patterns

Pattern A: Single App Service (API + static files)

App Service (Linux)
├── /api/*    → Backend routes
└── /*        → Static files (React/Vue build output)

Best for: Simple apps, MVPs, Razor Pages, Django with templates.

Pattern B: Separate frontend + backend

App Service (frontend) ← React/Next.js SSR
      │
      └──► App Service (backend) ← REST API

Best for: Independent scaling, team separation, microservices.

Project Structure (Single App)

project-root/
├── azure.yaml
├── infra/
│   ├── main.bicep
│   └── app/
│       └── web.bicep
└── src/
    ├── api/              # Backend
    │   ├── Program.cs    # or app.py / index.js
    │   └── ...
    └── web/              # Frontend (built output served as static)
        ├── package.json
        └── src/

azure.yaml (multi-service)

name: my-web-app
services:
  web:
    project: ./src/web
    host: appservice
    language: js
    dist: build
  api:
    project: ./src/api
    host: appservice
    language: csharp

Server-Side Rendering Examples

ASP.NET Core MVC / Razor Pages

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
var app = builder.Build();
app.UseStaticFiles();
app.MapControllerRoute(name: "default", pattern: "{controller=Home}/{action=Index}/{id?}");
app.MapGet("/health", () => Results.Ok(new { status = "healthy" }));
app.Run();

Next.js (SSR on App Service)

// next.config.js
module.exports = {
  output: 'standalone',  // Required for App Service deployment
};

Startup command in App Service:

node server.js

Django

# settings.py
ALLOWED_HOSTS = ['.azurewebsites.net', 'localhost']
STATIC_ROOT = BASE_DIR / 'staticfiles'
CSRF_TRUSTED_ORIGINS = ['https://*.azurewebsites.net']

Express + React (served from build)

const express = require('express');
const path = require('path');
const app = express();

app.use(express.json());
app.use('/api', apiRouter);
app.use(express.static(path.join(__dirname, '../web/build')));
app.get('/health', (req, res) => res.json({ status: 'healthy' }));
app.get('*', (req, res) => {
  res.sendFile(path.join(__dirname, '../web/build/index.html'));
});

app.listen(process.env.PORT || 3000);

App Service Configuration

resource webApp 'Microsoft.Web/sites@2023-12-01' = {
  properties: {
    siteConfig: {
      linuxFxVersion: 'NODE|24-lts'  // or DOTNETCORE|10.0, PYTHON|3.14
      healthCheckPath: '/health'
      appCommandLine: ''              // Custom startup command if needed
      appSettings: [
        { name: 'SCM_DO_BUILD_DURING_DEPLOYMENT', value: 'true' }
        { name: 'WEBSITE_NODE_DEFAULT_VERSION', value: '~24' }
      ]
    }
  }
  tags: {
    'azd-service-name': 'web'
  }
}

Startup Commands by Runtime

Runtime Startup Command Notes
ASP.NET Core (auto-detected) No command needed
Node.js node server.js or npm start Set via appCommandLine
Python (Django) gunicorn myapp.wsgi Use gunicorn for production
Python (FastAPI) uvicorn main:app --host 0.0.0.0 Use uvicorn for ASGI
Next.js SSR node server.js Use output: 'standalone'

Deployment

ENV_NAME="$(basename "$PWD" | tr '[:upper:]' '[:lower:]' | tr ' _' '-')-dev"
azd init -t <template> -e "$ENV_NAME" --no-prompt
azd env set AZURE_LOCATION eastus2
azd up --no-prompt

PowerShell:

$ENV_NAME = "$(Split-Path -Leaf (Get-Location) | ForEach-Object { $_.ToLower() -replace '[ _]','-' })-dev"
azd init -t <template> -e $ENV_NAME --no-prompt
azd env set AZURE_LOCATION eastus2
azd up --no-prompt

References

Source: SKILL.md on GitHub

2 warnings3d4 checks · Risk SAFE
  • Gen Agent Trust Hub3d

    This skill includes security considerations related to the processing of untrusted project files and the retrieval of external development templates. While these operations are essential for modernizing and preparing Azure applications, they represent a surface area for indirect prompt injection and depend on the integrity of external template repositories.

  • Socket3d

    5 alerts: gptAnomaly, gptSecurity

  • Snyk3d

    Risk: LOW · No issues

  • Runlayer7mo

    86/87 files flagged

Signed by skilld at b8a1c66. This ties the file your Agent reads to that commit on GitHub. It does not review the instructions.

Last checked against GitHub 20 hours ago.

Activeupdated last week
metadata
{
  "author": "Microsoft",
  "version": "1.3.4"
}

README badge

README badge for microsoft/skills/azure-prepare