content_sources: - type: mslearn-adapted url: https://learn.microsoft.com/azure/azure-functions/functions-networking-options - type: mslearn-adapted url: https://learn.microsoft.com/azure/azure-functions/create-first-function-cli-python diagrams: - id: public-only-architecture type: flowchart source: self-generated justification: "Standard public deployment pattern from MSLearn quickstarts" based_on: - https://learn.microsoft.com/azure/azure-functions/create-first-function-cli-python content_validation: status: verified last_reviewed: 2026-04-12 reviewer: agent core_claims: - claim: "Classic Consumption is the default serverless public deployment option and does not provide VNet integration" source: https://learn.microsoft.com/azure/azure-functions/functions-networking-options verified: true - claim: "Flex Consumption, Premium, and Dedicated plans can be deployed without VNet integration" source: https://learn.microsoft.com/azure/azure-functions/functions-networking-options verified: true - claim: "A basic Azure Functions deployment can be created publicly with Azure CLI without extra networking resources" source: https://learn.microsoft.com/azure/azure-functions/create-first-function-cli-python verified: true
Scenario 1: Public Only¶
The simplest deployment pattern with no VNet integration. All traffic flows over the public internet.
When to Use¶
- Development and testing environments
- Public-facing APIs without backend dependencies
- Prototypes and demos
- Workloads without compliance requirements for network isolation
Architecture¶
flowchart TD
INET[Internet] -->|HTTPS| FA[Function App]
FA -->|Public endpoint| ST[Storage Account]
FA -->|Public endpoint| AI[Application Insights]
FA -->|Public endpoint| OTHER[Other Azure Services]
style FA fill:#0078d4,color:#fff
style ST fill:#FFF3E0 Supported Plans¶
| Plan | Supported | Notes |
|---|---|---|
| Consumption (Y1) | Default and only option | |
| Flex Consumption (FC1) | VNet integration is optional | |
| Premium (EP) | VNet integration is optional | |
| Dedicated (B1) | Public only in this guide; VNet scenarios use S1+ | |
| Dedicated (S1+) | VNet integration is optional |
Prerequisites¶
This scenario requires no additional networking setup beyond the base deployment. Follow your language tutorial's 02-first-deploy.md:
Plan-Specific Configuration¶
Consumption (Y1)¶
No special configuration needed. Public access is the only option.
az functionapp create \
--name "$APP_NAME" \
--resource-group "$RG" \
--storage-account "$STORAGE_NAME" \
--consumption-plan-location "$LOCATION" \
--functions-version 4 \
--runtime python \
--runtime-version 3.11 \
--os-type Linux
| Command/Parameter | Purpose |
|---|---|
--consumption-plan-location "$LOCATION" | Creates a serverless Consumption plan in the specified region |
Flex Consumption (FC1) — Public Mode¶
Skip VNet integration parameters for public deployment.
az functionapp create \
--name "$APP_NAME" \
--resource-group "$RG" \
--storage-account "$STORAGE_NAME" \
--flexconsumption-location "$LOCATION" \
--runtime python \
--runtime-version 3.11 \
--functions-version 4
| Command/Parameter | Purpose |
|---|---|
--flexconsumption-location "$LOCATION" | Creates a Flex Consumption plan without VNet integration |
Storage Authentication
FC1 public deployments can use either connection string or identity-based storage authentication. Identity-based is recommended for security.
Premium (EP) — Public Mode¶
Create without VNet integration.
az functionapp plan create \
--name "$PLAN_NAME" \
--resource-group "$RG" \
--location "$LOCATION" \
--sku EP1 \
--is-linux
az functionapp create \
--name "$APP_NAME" \
--resource-group "$RG" \
--plan "$PLAN_NAME" \
--storage-account "$STORAGE_NAME" \
--runtime python \
--runtime-version 3.11 \
--functions-version 4 \
--os-type Linux
| Command/Parameter | Purpose |
|---|---|
--sku EP1 | Creates an Elastic Premium plan (smallest tier) |
--is-linux | Configures the plan for Linux hosting |
Dedicated (B1) — Public Only¶
This guide uses B1 for public-only scenarios. For VNet integration, see Private Egress with Standard (S1+) tier.
az appservice plan create \
--name "$PLAN_NAME" \
--resource-group "$RG" \
--location "$LOCATION" \
--sku B1 \
--is-linux
az functionapp create \
--name "$APP_NAME" \
--resource-group "$RG" \
--plan "$PLAN_NAME" \
--storage-account "$STORAGE_NAME" \
--runtime python \
--runtime-version 3.11 \
--functions-version 4 \
--os-type Linux
| Command/Parameter | Purpose |
|---|---|
--sku B1 | Creates a Basic tier App Service plan (public-only in this guide) |
Verification¶
Test public endpoint access:
| Command/Parameter | Purpose |
|---|---|
curl --request GET | Tests the public HTTP endpoint |
Expected response:
Security Considerations¶
Public Exposure
Without VNet integration, your function app and its dependencies are accessible over the public internet. Consider:
- Function-level authorization keys for HTTP triggers
- IP access restrictions to limit source networks
- App Service Authentication for user/workload identity
- Storage firewall rules if not using private endpoints
Add IP Access Restrictions¶
Limit access to known IP ranges:
az functionapp config access-restriction add \
--name "$APP_NAME" \
--resource-group "$RG" \
--rule-name "AllowCorporate" \
--priority 100 \
--action Allow \
--ip-address "203.0.113.0/24"
| Command/Parameter | Purpose |
|---|---|
--rule-name "AllowCorporate" | Descriptive name for the access rule |
--priority 100 | Lower numbers are evaluated first |
--ip-address "203.0.113.0/24" | CIDR range to allow |
Migrating to Private Networking¶
To add VNet integration later, see:
- Scenario 2: Private Egress — Add VNet integration for private backend access
- Scenario 3: Private Ingress — Add site private endpoint for private inbound