Migrate from AWS to Azion

A platform migration usually begins long before the first configuration file is changed. It starts when a team notices that its current environment no longer gives the same level of clarity, speed, or control it once did.

For teams using AWS, this moment often comes after years of accumulated complexity: CloudFront distributions with layered cache behaviors, Lambda functions with runtime dependencies, S3 buckets with evolving access policies, DynamoDB tables with provisioned capacity, Route 53 zones with health checks, WAF rules with managed rule groups, and CloudWatch alarms with custom metrics. Each service works, but together they create operational overhead that slows development.

For teams currently using Amazon CloudFront, AWS Lambda, Amazon S3, Amazon DynamoDB, Amazon Route 53, AWS WAF, AWS Shield, Amazon CloudWatch, or other AWS services, Azion provides equivalent capabilities through Applications, Functions, Object Storage, KV Store, Edge DNS, Web Application Firewall, DDoS Protection, Real-Time Metrics, and Real-Time Events.

The strongest reason to migrate is not simply to replace one vendor with another. It is to consolidate compute, storage, database, delivery, security, and observability into a unified platform designed for globally distributed applications.

How AWS to Azion Migration Works

Traditional platform migrations often require rewriting application logic, reconfiguring infrastructure from scratch, and managing multiple disconnected services. This approach creates operational risk, extends timelines, and fragments team knowledge across different configuration patterns.

The Azion migration approach preserves your application logic while transitioning to a unified platform:

  1. Incremental migration path. Start with a single project, validate each layer independently, and expand with confidence. No need to migrate everything at once.

  2. Preserved application logic. Functions, cache policies, origin configurations, and data services map directly to Azion equivalents with minimal code changes—primarily syntax updates for environment access and service imports.

  3. Unified platform model. Instead of managing compute, storage, databases, security, and observability as disconnected layers, Azion brings these capabilities together with consistent APIs and configuration patterns.

Feature Mapping

The following tables provide a comprehensive mapping of AWS products to their Azion equivalents. A dash (-) indicates that Azion does not currently offer a direct equivalent.

AWS ProductDescriptionAzion Equivalent
Amazon CloudFrontAWS CDN for delivering static content, dynamic content, APIs, applications, and video globally.Applications
CloudFront DistributionsMain CloudFront delivery resource for domains, origins, cache behavior, certificates, security, and edge delivery settings.Applications
CloudFront Alternate Domain NamesConfigure custom domains for CloudFront distributions.Workloads
CloudFront Cache BehaviorsPath-based delivery behavior, cache policy, origin request policy, allowed methods, and edge function associations.Rules Engine for Applications
CloudFront Cache PoliciesControl cache keys, TTLs, headers, cookies, query strings, and compression.Cache
CloudFront Origin Request PoliciesControl which request values CloudFront forwards to origin.Rules Engine
CloudFront Response Headers PoliciesAdd or modify response headers such as security headers and CORS headers.Rules Engine for Applications
CloudFront Origin ShieldAdditional centralized caching layer to reduce origin load and improve cache hit ratio.Tiered Cache
CloudFront InvalidationRemove content from CloudFront edge caches before expiration.Real-Time Purge
CloudFront FunctionsLightweight JavaScript execution at the edge for redirects, rewrites, headers, and cache-key normalization.Functions for Applications
Lambda@EdgeNode.js or Python functions triggered by CloudFront events to customize delivery.Functions for Applications
Lambda@Edge for security logicUse CloudFront-triggered functions for request validation, authentication, or blocking logic.Functions for Firewall
CloudFront Device DetectionDetect device type and pass device metadata to the origin.Device Groups
AWS Elemental MediaLiveReal-time live video encoding.Live Ingest
AWS Elemental MediaPackagePackage and originate live video streams for HLS, DASH, and related formats.Live Ingest + Applications
CloudFront for live streamingDeliver live video globally using CloudFront with AWS Media Services.Applications + Live Ingest
AWS LambdaGeneral-purpose serverless compute for event-driven code execution.Functions for Applications
Amazon API GatewayCreate and manage REST, HTTP, and WebSocket APIs with backend integrations.Applications + Functions
API Gateway request validation / throttlingApply API request controls, throttling, and validation rules.Rules Engine + Firewall
AWS Amplify HostingGit-based CI/CD and hosting for static and server-side rendered web apps.Applications + Azion CLI
AWS App RunnerDeploy source code or container images to managed web applications.Applications + Orchestrator
Amazon BedrockFoundation model access and generative AI application development.AI Inference
Amazon Bedrock model inferenceInvoke foundation models for text, image, embedding, and generative AI use cases.AI Inference
Amazon Bedrock Fine-TuningCustomize foundation models with fine-tuning for specific use cases.LoRA Fine-Tune
Amazon Bedrock Custom Model ImportImport customized foundation models into Bedrock.AI Inference + LoRA Fine-Tune
Amazon SageMaker AI Real-Time InferenceDeploy ML models to managed real-time inference endpoints.AI Inference
Amazon S3Object storage for unstructured data, static assets, backups, archives, and websites.Object Storage
Amazon S3 Static Website HostingHost static websites from S3 buckets.Object Storage + Applications
S3 Object LambdaTransform S3 objects with Lambda before returning them to the requester.Object Storage + Functions
S3 Object Lambda for image transformationResize, watermark, redact, or transform content retrieved from S3.Image Processor + Functions
Amazon Aurora DSQLServerless distributed relational SQL database for transactional workloads.SQL Database
Amazon DynamoDBServerless key-value and document database.KV Store
DynamoDB Global TablesMulti-Region replication for globally distributed NoSQL data.KV Store
AWS WAFWeb application firewall for protecting applications and APIs.WAF / Firewall
AWS Managed Rules for AWS WAFManaged rule groups for common vulnerabilities and unwanted traffic.WAF Rule Sets
AWS WAF custom rulesCreate custom match conditions and actions for web requests.Rules Engine for Firewall
AWS WAF Bot ControlManaged bot detection and mitigation.Bot Manager
AWS WAF Rate-Based RulesRate limit requests based on IP, headers, URI, method, or other keys.Rules Engine + Network Shield
AWS WAF IP SetsReusable IP/CIDR lists for allow or block rules.Network Lists
AWS Shield StandardStandard DDoS protection for AWS resources.DDoS Protection
AWS Shield AdvancedAdvanced DDoS protection with additional visibility and mitigation options.DDoS Protection
Shield Advanced automatic DDoS mitigationAutomatically creates or updates WAF protections during application-layer attacks.DDoS Protection + WAF
AWS Network FirewallManaged VPC network firewall.Network Shield
Elastic Load BalancingDistributes traffic across multiple targets and availability zones.Load Balancer
Application Load BalancerLayer 7 HTTP/HTTPS load balancing with application-level routing.Load Balancer
Network Load BalancerLayer 4 TCP/UDP/TLS load balancing.Load Balancer
AWS Global AcceleratorGlobal Anycast IPs and optimized routing over the AWS global network.Applications + Load Balancer
CloudFront Origin Access ControlSecure S3 origins so users access content through CloudFront instead of directly from S3.Connectors + Origin Shield
CloudFront Signed URLs / Signed CookiesRestrict access to private content using signed URLs or cookies.Rules Engine + Functions
CloudFront Geographic RestrictionsAllow or block content access by country.Rules Engine + Network Shield
Amazon Route 53Authoritative DNS, domain registration, routing policies, and health checks.Edge DNS
AWS Certificate ManagerProvision, import, manage, deploy, and renew SSL/TLS certificates.Certificate Manager
AWS Private CACreate and operate private certificate authorities.Certificate Manager
AWS Private CA for client authenticationPrivate PKI patterns for certificate-based client authentication.mTLS
AWS IoT GreengrassRun AWS-managed edge components and local processing on edge devices.Orchestrator
AWS IoT Greengrass deploymentsDeploy components and configurations to edge devices.Orchestrator
Amazon ECS AnywhereRegister and manage on-premises or external servers in ECS clusters.Orchestrator
AWS OutpostsRun AWS infrastructure and services on customer premises.Orchestrator
AWS Systems Manager Hybrid ActivationsManage non-EC2 machines in hybrid and multicloud environments.Orchestrator
Amazon CloudWatch MetricsCollect, query, visualize, and alarm on service and application metrics.Real-Time Metrics
Amazon CloudWatch LogsCollect, monitor, query, and analyze logs.Real-Time Events
CloudWatch Logs InsightsQuery and investigate logs interactively.Real-Time Events
Amazon Data FirehoseDeliver streaming data to destinations such as S3, Redshift, OpenSearch, and HTTP endpoints.Data Stream
CloudWatch RUMReal user monitoring for browser and mobile application performance.Edge Pulse
AWS MarketplaceDiscover, buy, deploy, and manage third-party software, data, and services.Marketplace
AWS Management ConsoleWeb interface for accessing and managing AWS services.Azion Console
AWS APIsProgrammatic interface for AWS service operations.Azion API
Amazon CloudWatch APIs / Metrics APIsQuery metrics, logs, alarms, and observability data programmatically.GraphQL API
AWS CLICommand-line interface for managing AWS services.Azion CLI
AWS SDKsLanguage-specific SDKs for building integrations with AWS services.SDK
AWS SDK for JavaScriptJavaScript libraries for interacting with AWS services.Azion Lib
AWS CloudFormationInfrastructure as Code service for modeling and provisioning AWS resources.Terraform Provider
AWS Cloud Development KitDefine infrastructure using programming languages and synthesize to CloudFormation.Terraform Provider + Azion API
Terraform AWS ProviderTerraform provider for managing AWS resources.Terraform Provider
Lambda runtime environmentRuntime layer used by Lambda functions.Azion Runtime
CloudFront edge runtimeRuntime environment for CloudFront Functions and Lambda@Edge.Azion Runtime

Migration Strategy

The migration is organized around Azion’s four product categories, allowing teams to plan and execute each layer independently:

  • Build: deploy applications, configure builds and environment variables, migrate Lambda functions, CloudFront behaviors, routing, headers, load balancing, cache, image optimization, and AI workloads.
  • Secure: migrate custom domains, Route 53 DNS, SSL/TLS certificates, WAF rules, DDoS protection, bot management, and rate limiting.
  • Store: migrate S3 objects, DynamoDB tables, and Aurora databases to Object Storage, KV Store, and SQL Database.
  • Observe: migrate CloudWatch metrics, logs, and alarms to Azion’s real-time observability stack.

Build

The Build category covers application deployment, compute, routing, and configuration. Start here to bring your application onto Azion and establish the foundation for the rest of the migration.

1. Project Setup on Azion

The first step brings your application into Azion in a way that feels familiar to teams that deploy modern web projects on AWS. If you have used AWS CloudFormation, SAM, or CDK, you already understand the pattern: define infrastructure as code, configure build settings, deploy the output, and validate the generated URL.

Azion follows a similar workflow but with a broader platform context. Your project becomes part of an environment where application delivery, Functions, rules, security, and observability can be managed together.

Key Differences

AspectAWSAzion
Config filetemplate.yaml (SAM) / cdk.json (CDK)azion.config.js (JavaScript)
Framework detectionManual configuration20+ frameworks with auto-detection
Cold startsCommon (regional Lambda)Minimized (distributed nodes)
ComplianceSOC 2, ISO 27001, HIPAAPCI DSS 4.0.1 Level 1, SOC 2 Type II

Connect Your Repository

  1. Open Azion Console.
  2. Click + Create > Import from GitHub.
  3. Authorize the Azion GitHub App.
  4. Select the repository you want to migrate.

Configure Your Build

Azion auto-detects your framework and configures build settings. Override the detected preset in azion.config.js:

import { defineConfig } from 'azion'
export default defineConfig({
name: 'my-project',
preset: 'nextjs', // Override auto-detection if needed
})

Deploy and Verify

Deploy from the Azion Console or CLI. Your temporary Azion URL follows this pattern:

https://xxxxxxxxxx.map.azionedge.net/

Validate the deployment:

Terminal window
curl https://xxxxxxxxxx.map.azionedge.net/

Reference documentation

2. Converting Build Configuration

A migration can appear successful when the build passes but fail later when runtime behavior differs. Review build and deployment configuration carefully instead of treating it as a mechanical command replacement.

CLI Quick Reference

TaskAWS CLIAzion CLI
Installpip install awsclicurl -fsSL https://cli.azion.app/install.sh | bash
Loginaws configureazion login
Local devsam local start-apiazion dev
Deploysam deploy --guided or cdk deployazion deploy
View logsaws logs tail /aws/lambda/my-functionazion logs

Build Configuration Comparison

AspectAWS SAM/CDKAzion
Infrastructure as CodeYAML/TypeScript templatesJavaScript config
Local testingSAM local emulatorBuilt-in dev server
DeploymentCloudFormation stacksDirect deployment
RollbackStack rollbackVersion history

Reference documentation

3. Migrating Environment Variables

Environment variables contain API keys, database credentials, authentication secrets, service endpoints, feature flags, and environment-specific configuration. Migrating them incorrectly causes runtime failures even when deployment succeeds.

Key Differences

AspectAWSAzion
Accessprocess.env.VARIABLEAzion.env.get('VARIABLE')
Secrets managementAWS Secrets Manager / Systems Manager Parameter StoreVariables in Functions Instances
Environment stagesStage name in function ARNEnvironment context in config

Evaluate Your Variables

Before changing code, identify every variable in:

  • AWS Lambda: Environment variables in function configuration
  • AWS Secrets Manager: Secret values and rotation policies
  • Systems Manager Parameter Store: Parameters and paths
  • Elastic Beanstalk: Environment properties
  • CI/CD environment settings (CodePipeline, CodeBuild)
  • Runtime configuration in source code

Create Variables in Azion

  1. Access Azion Console.
  2. Navigate to Build > Variables.
  3. Click Add Variable.
  4. Enter the variable name and value.
  5. Click Save.

Update Your Code

// Before: AWS Lambda / Node.js
const apiKey = process.env.API_KEY;
const dbHost = process.env.DB_HOST;
// Before: AWS with Secrets Manager (async)
const { SecretsManager } = require('@aws-sdk/client-secrets-manager');
const client = new SecretsManager();
const secret = await client.getSecretValue({ SecretId: 'my-secret' });
const secretValue = JSON.parse(secret.SecretString);
// After: Azion
const apiKey = Azion.env.get('API_KEY');
const dbHost = Azion.env.get('DB_HOST');

Reference documentation

4. Migrating CloudFront to Applications

CloudFront distributions deliver content from edge locations with caching and origin configuration. Azion Applications provide similar capabilities with integrated Rules Engine for request/response manipulation.

Key Differences

AspectAWS CloudFrontAzion Applications
Distribution configXML/JSON in CloudFormationJavaScript config or Console
OriginsS3, ALB, Custom originsConnectors (HTTP, Object Storage)
BehaviorsCache behaviors with pathsRules Engine with criteria
SSL certificatesACM (us-east-1 only)Digital Certificates
Lambda@EdgeEdge functions (4 triggers)Functions (request/response phases)

Configuration Steps

  1. Access Azion Console.
  2. Navigate to Build > Applications.
  3. Click Add Application.
  4. Configure your Main Settings:
    • Name your application
    • Set origin type (HTTP, Object Storage)
    • Configure origin address
  5. Set up Cache Settings for TTL configuration.
  6. Configure Rules Engine for path-based routing.
  7. Add Custom Domains when ready.

Distribution Configuration Migration

// CloudFront distribution config (CloudFormation YAML converted to Azion JS)
import { defineConfig } from 'azion'
export default defineConfig({
name: 'my-distribution',
applications: [{
name: 'main-app',
origins: [{
name: 's3-origin',
type: 'object_storage',
addresses: [{
address: 'my-bucket.azionedge.net',
weight: 1
}]
}],
cache: {
ttl: 86400,
staleWhileRevalidate: 300
},
rules: {
request: [{
name: 'API Routes',
criteria: [{
variable: 'uri',
operator: 'starts_with',
argument: '/api/'
}],
behavior: {
bypassCache: true,
runFunction: 'api-handler'
}
}]
}
}]
})

Origin Request vs Viewer Request

In CloudFront, Lambda@Edge functions trigger at different points. Azion maps these to Rules Engine phases:

CloudFront TriggerAzion Equivalent
Viewer RequestRules Engine > Request Phase
Origin RequestRules Engine > Request Phase (after cache check)
Origin ResponseRules Engine > Response Phase
Viewer ResponseRules Engine > Response Phase

Reference documentation

5. Migrating API Gateway to Applications + Functions

API Gateway provides REST and HTTP API management with authorizers, throttling, and stage management. Azion Applications combined with Functions deliver similar capabilities with distributed execution.

Key Differences

AspectAWS API GatewayAzion Applications + Functions
API typesREST API, HTTP APIFunctions with routing
AuthorizersLambda, Cognito, JWTFunctions with custom logic
StagesStage variables and deploymentsEnvironment configuration
ThrottlingUsage plans + rate limitingRate Limit rules
Custom domainsDomain mappingsApplication domains

Configuration Steps

  1. Access Azion Console.
  2. Navigate to Build > Functions.
  3. Create Functions for each API endpoint.
  4. Navigate to Build > Applications.
  5. Create an Application for your API.
  6. Configure Rules Engine to route paths to Functions.
  7. Set up rate limiting rules.
  8. Add authentication via Functions.

API Gateway Authorizer Migration

// Before: AWS Lambda Authorizer
exports.handler = async (event) => {
const token = event.authorizationToken;
try {
const decoded = jwt.verify(token, process.env.JWT_SECRET);
return {
principalId: decoded.sub,
policyDocument: {
Version: '2012-10-17',
Statement: [{
Action: 'execute-api:Invoke',
Effect: 'Allow',
Resource: event.methodArn
}]
}
};
} catch (err) {
throw new Error('Unauthorized');
}
};
// After: Azion Function for Authorization
export default {
async fetch(request) {
const authHeader = request.headers.get('Authorization');
if (!authHeader) {
return new Response('Unauthorized', { status: 401 });
}
const token = authHeader.replace('Bearer ', '');
try {
const secret = Azion.env.get('JWT_SECRET');
const decoded = await verifyJWT(token, secret);
// Store user info in request metadata for downstream functions
request.metadata['user_id'] = decoded.sub;
return request; // Continue to next handler
} catch (err) {
return new Response('Unauthorized', { status: 401 });
}
}
};

Route Migration Example

// API Gateway routes → Azion Rules Engine
// Before: API Gateway resource paths
// GET /users/{id}
// POST /users
// PUT /users/{id}
// DELETE /users/{id}
// After: Azion Rules Engine configuration
import { defineConfig } from 'azion'
export default defineConfig({
applications: [{
name: 'api-app',
rules: {
request: [
{
name: 'GET /users/:id',
criteria: [
{ variable: 'uri', operator: 'matches_regex', argument: '^/users/([0-9]+)$' },
{ variable: 'request_method', operator: 'equals', argument: 'GET' }
],
behavior: { runFunction: 'get-user' }
},
{
name: 'POST /users',
criteria: [
{ variable: 'uri', operator: 'equals', argument: '/users' },
{ variable: 'request_method', operator: 'equals', argument: 'POST' }
],
behavior: { runFunction: 'create-user' }
}
]
}
}]
})

Reference documentation

6. Migrating Lambda to Functions

Functions are the computational engine of modern distributed applications. They often contain the most business-critical logic: authentication, personalization, API orchestration, and integrations with third-party systems.

Key Differences

AspectAWS LambdaAzion Functions
Function signatureexports.handler = async (event) => {}export default { async fetch(request) {} }
RuntimeNode.js, Python, Java, Go, .NET, RubyJavaScript (V8 isolates)
Memory128 MB - 10,240 MB512 MB (default)
Timeout1 sec - 15 minConfigurable per execution
Cold startsCommon (regional, VPC-cold)Minimized (distributed nodes)
Event sourcesSQS, SNS, Kinesis, DynamoDB, API GatewayHTTP requests, scheduled triggers

Update Function Signature

// Before: AWS Lambda
exports.handler = async (event) => {
const body = JSON.parse(event.body);
const pathParams = event.pathParameters;
const queryParams = event.queryStringParameters;
// Process request
return {
statusCode: 200,
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ message: 'Hello', data: body })
};
};
// After: Azion Functions
export default {
async fetch(request) {
const body = await request.json();
const url = new URL(request.url);
const queryParams = Object.fromEntries(url.searchParams);
// Process request
return new Response(JSON.stringify({ message: 'Hello', data: body }), {
status: 200,
headers: { 'Content-Type': 'application/json' }
});
}
};

Event Context Migration

// Before: AWS Lambda event context
exports.handler = async (event, context) => {
const requestId = context.awsRequestId;
const functionName = context.functionName;
const remainingTime = context.getRemainingTimeInMillis();
// Request metadata from API Gateway
const sourceIp = event.requestContext.identity.sourceIp;
const userAgent = event.requestContext.identity.userAgent;
const country = event.headers['CloudFront-Viewer-Country'];
return { statusCode: 200, body: 'OK' };
};
// After: Azion Functions
export default {
async fetch(request, env, ctx) {
// Request metadata
const requestId = request.headers.get('x-request-id');
const userAgent = request.headers.get('user-agent');
const country = request.metadata['geoip_country_code'];
const city = request.metadata['geoip_city'];
// Geo metadata available directly
const region = request.metadata['geoip_region'];
return new Response('OK', { status: 200 });
}
};

Environment Variables Migration

// Before: AWS Lambda
const dbUrl = process.env.DATABASE_URL;
const apiKey = process.env.API_KEY;
// After: Azion Functions
const dbUrl = Azion.env.get('DATABASE_URL');
const apiKey = Azion.env.get('API_KEY');

Cold Start Comparison

AWS Lambda cold starts vary significantly based on runtime, memory allocation, and VPC configuration. Azion Functions minimize cold starts through distributed node placement:

ScenarioAWS Lambda Cold StartAzion Functions Cold Start
Node.js (no VPC)100-300msMinimal
Node.js (with VPC)500ms-2sN/A (no VPC concept)
Java/Spring1-5sN/A
Python100-500msN/A

Reference documentation

7. Migrating Load Balancing (ALB/NLB to Load Balancer)

Load balancing distributes traffic across multiple origins for high availability and performance. Azion Load Balancer provides health checks, steering policies, and origin failover at the distributed infrastructure.

Key Differences

AspectAWS ALB/NLBAzion Load Balancer
Health checksHTTP, HTTPS, TCPHTTP, HTTPS, TCP
Steering policiesRound-robin, Least connections, IP hashRound-robin, Least connections, Geo
FailoverTarget group failoverOrigin-level failover
Session affinityCookie, IP hashCookie, IP hash
TargetsEC2, Lambda, IP addressesConnectors (origins)
ProtocolLayer 4 (NLB), Layer 7 (ALB)Layer 7 (HTTP/HTTPS)

Configuration Steps

  1. Access Azion Console.
  2. Go to Products menu > Connectors.
  3. Create a Connector for each origin server.
  4. Configure health checks for each origin.
  5. In your Application, configure origins with load balancing settings.
  6. Set origin weights for weighted distribution.
  7. Enable session affinity if needed.

Load Balancer Module Configuration

// Load balancer settings within Connector address modules
{
"weight": 3, // Relative weight for weighted distribution
"method": "round_robin", // Options: "round_robin", "least_conn", "ip_hash"
"max_retries": 3, // Maximum retry attempts on failure
"connection_timeout": 10, // Connection timeout in seconds
"read_write_timeout": 30 // Read/write timeout in seconds
}

ALB Target Group Migration

AWS ALB ConfigAzion Equivalent
Target GroupConnector
Health Check PathConnector health check path
Health Check IntervalConnector health check interval
Healthy ThresholdHealth check success threshold
Unhealthy ThresholdHealth check failure threshold

Reference documentation

8. Migrating Cache Configuration

Caching configuration determines how content is stored and served from node locations. Azion Cache provides fine-grained control with Tiered Cache support for improved hit ratios.

Key Differences

AspectAWS CloudFront CacheAzion Cache
Cache levelsRegional edge caches + Edge locationsTiered Cache + Cache + Browser Cache
Cache keyCache policy + origin request policyCustomizable via Rules Engine
PurgeInvalidations (path-based)URL, Cache Key, Wildcard purge
Stale contentOrigin shield, stale-while-revalidateStale-while-revalidate
TTL limitsDefault 24h, max 1 yearPer-rule configuration

CloudFront Cache Policies to Azion Cache Settings

CloudFront Cache PolicyAzion Equivalent
CachingOptimizedDefault Cache Settings with high TTL
CachingDisabledBypass Cache behavior in Rules Engine
Elemental-MediaPackageCustom Cache Settings for streaming
Custom policyCache Settings + Rules Engine

Configuration Steps

  1. Access Azion Console.
  2. Edit your Application.
  3. Navigate to Cache Settings.
  4. Configure default cache TTL.
  5. Enable Tiered Cache for improved hit ratio.
  6. Add custom cache rules via Rules Engine.

Cache Key Customization

In CloudFront, cache keys are defined by cache policies. In Azion, use Advanced Cache Key in Cache Settings:

Example: Vary cache by query strings

// In Cache Settings
{
"name": "api-cache",
"cache_key": {
"query_string": {
"include_all": false,
"include": ["version", "lang"]
}
}
}

CloudFront Invalidation to Azion Purge

Terminal window
# Before: AWS CloudFront invalidation
aws cloudfront create-invalidation --distribution-id E123456789ABCD --paths "/images/*" "/css/*"
# After: Azion cache purge
curl -X POST 'https://api.azion.com/v4/workspace/purge/wildcard' --header 'Authorization: Token YOUR_TOKEN' --header 'Content-Type: application/json' --data '{
"items": [
"https://example.com/images/*",
"https://example.com/css/*"
],
"layer": "cache"
}'

Reference documentation

9. Migrating Image Optimization

Image optimization reduces image file sizes while maintaining visual quality. Azion Image Processor transforms, optimizes, and delivers images from the distributed locations with automatic format selection.

Key Differences

AspectAWS CloudFront + Lambda@EdgeAzion Image Processor
StorageS3 originObject Storage integration
TransformationsCustom Lambda@EdgeBuilt-in transformations
URL formatCustom implementation?ims=<OPTIONS> query parameter
Format supportCustom implementationWebP, AVIF, JPEG, PNG
Signed URLsCloudFront signed URLsSecure Token

URL Format Comparison

# AWS CloudFront (requires Lambda@Edge or custom origin)
# Typically custom URL structure:
https://d12345.cloudfront.net/images/photo.jpg?w=400&q=80
# Azion Image Processor
https://example.com/images/photo.jpg?ims=400x400

Transformation Parameters

Azion Image Processor uses the ims query parameter for transformations:

SyntaxDescriptionExample
?ims=WxHResize to width x height?ims=400x300
?ims=WxResize to width (auto height)?ims=400x
?ims=xHResize to height (auto width)?ims=x300
?ims=WxH:fillCrop to exact dimensions?ims=400x300:fill
?ims=WxH:fitFit within dimensions?ims=400x300:fit

Configuration Steps

  1. Access Azion Console.
  2. Edit your Application.
  3. Navigate to Image Processor settings.
  4. Enable Image Processor.
  5. Configure default quality and format settings.
  6. Set up Object Storage as image source (optional).

Reference documentation

10. Migrating AI Workloads (Bedrock to AI Inference)

AI inference enables low-latency AI-powered features in applications. Azion AI Inference provides GPU-backed inference for text and visual models at the distributed infrastructure.

Key Differences

AspectAWS BedrockAzion AI Inference
Model accessManaged foundation modelsCustom model deployment
Inference APIBedrock Runtime APIREST API + Functions
Model typesClaude, Llama, Titan, Stable DiffusionCustom models, LLMs
GPU supportManaged infrastructureDedicated GPU instances
PricingPer-token / per-imagePer-inference

Configuration Steps

  1. Access Azion Console.
  2. Go to AI Inference (via Marketplace or Functions).
  3. Deploy a model or use pre-built templates.
  4. Configure inference endpoint.
  5. Integrate with your application via Functions.

Bedrock to Azion Migration Example

// Before: AWS Bedrock
import { BedrockRuntime } from '@aws-sdk/client-bedrock-runtime';
const client = new BedrockRuntime({ region: 'us-east-1' });
const response = await client.invokeModel({
modelId: 'anthropic.claude-3-sonnet-20240229-v1:0',
contentType: 'application/json',
accept: 'application/json',
body: JSON.stringify({
anthropic_version: 'bedrock-2023-05-31',
max_tokens: 1024,
messages: [{ role: 'user', content: 'Hello, world!' }]
})
});
// After: Azion AI Inference
export default {
async fetch(request) {
const response = await fetch('https://ai-inference.azion.com/v1/chat/completions', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${Azion.env.get('AI_API_KEY')}`
},
body: JSON.stringify({
model: 'claude-3-sonnet',
messages: [{ role: 'user', content: 'Hello, world!' }],
max_tokens: 1024
})
});
return response;
}
};

Reference documentation

11. Migrating Orchestration (Step Functions, EventBridge)

AWS Step Functions and EventBridge provide workflow orchestration and event routing. Azion achieves similar patterns through Functions chaining and Data Streaming for event-driven architectures.

Key Differences

AspectAWS Step FunctionsAzion Functions Chaining
Workflow definitionASL (Amazon States Language)JavaScript/TypeScript
State managementBuilt-in state machineCustom implementation
Error handlingRetry, catch, fallbackTry/catch in Functions
VisualizationWorkflow StudioCode-based
AspectAWS EventBridgeAzion Data Streaming
Event routingRules and targetsData Streaming + Functions
Event patternsPattern matchingCustom Functions logic
Targets100+ AWS servicesHTTP endpoints, Functions

Step Functions to Functions Chaining

// Before: AWS Step Functions (ASL)
{
"Comment": "Order processing workflow",
"StartAt": "ValidateOrder",
"States": {
"ValidateOrder": {
"Type": "Task",
"Resource": "arn:aws:lambda:us-east-1:123456789:function:validate-order",
"Next": "ProcessPayment"
},
"ProcessPayment": {
"Type": "Task",
"Resource": "arn:aws:lambda:us-east-1:123456789:function:process-payment",
"Catch": [{
"ErrorEquals": ["PaymentFailed"],
"Next": "NotifyFailure"
}],
"Next": "FulfillOrder"
},
"FulfillOrder": {
"Type": "Task",
"Resource": "arn:aws:lambda:us-east-1:123456789:function:fulfill-order",
"End": true
},
"NotifyFailure": {
"Type": "Task",
"Resource": "arn:aws:lambda:us-east-1:123456789:function:notify-failure",
"End": true
}
}
}
// After: Azion Functions (orchestrator pattern)
// orchestrator.js
export default {
async fetch(request) {
const order = await request.json();
try {
// Step 1: Validate
const validated = await validateOrder(order);
// Step 2: Process payment
const payment = await processPayment(validated);
// Step 3: Fulfill order
const fulfillment = await fulfillOrder(payment);
return new Response(JSON.stringify(fulfillment), {
headers: { 'Content-Type': 'application/json' }
});
} catch (error) {
// Error handling
await notifyFailure({ order, error: error.message });
return new Response(JSON.stringify({ error: error.message }), {
status: 500,
headers: { 'Content-Type': 'application/json' }
});
}
}
};
// Individual function modules
async function validateOrder(order) {
// Validation logic
if (!order.items || order.items.length === 0) {
throw new Error('Invalid order: no items');
}
return { ...order, validated: true };
}
async function processPayment(order) {
// Payment processing
const response = await fetch('https://payment-api.example.com/charge', {
method: 'POST',
body: JSON.stringify({ amount: order.total, currency: 'USD' })
});
if (!response.ok) {
throw new Error('PaymentFailed');
}
return { ...order, paid: true };
}
async function fulfillOrder(order) {
// Fulfillment logic
return { ...order, fulfilled: true, fulfilledAt: new Date().toISOString() };
}
async function notifyFailure(context) {
// Send failure notification
await fetch('https://notifications.example.com/failure', {
method: 'POST',
body: JSON.stringify(context)
});
}

EventBridge to Data Streaming

// Before: AWS EventBridge rule
{
"source": ["com.mycompany.orders"],
"detail-type": ["OrderCreated"],
"detail": {
"amount": [{ "numeric": [">", 100] }]
}
}
// Target: Lambda function for processing
// After: Azion Data Streaming + Functions
// Configure Data Streaming to send events to your Function endpoint
// Then process in Function:
export default {
async fetch(request) {
const events = await request.json();
for (const event of events) {
if (event.source === 'com.mycompany.orders' &&
event.type === 'OrderCreated' &&
event.data.amount > 100) {
// Process high-value order
await processHighValueOrder(event.data);
}
}
return new Response('OK');
}
};

Reference documentation

Secure

The Secure category covers domains, DNS, certificates, firewall rules, and protection against malicious traffic. Plan these migrations as controlled cutovers, since they affect how users reach your application and how it is protected in production.

1. Migrating Custom Domains

Custom domain migration is one of the most sensitive parts of any platform transition. It affects users, SEO, brand trust, and production availability. Plan domain migration as a controlled cutover, not a last-minute DNS change.

Migration Strategies

StrategyBest ForDNS Control
CNAMEQuick subdomain migrationKeep Route 53 as DNS provider
NameserverFull DNS control and apex domainsTransfer DNS to Azion

Create the Certificate

Create your SSL/TLS certificate before pointing your domain to Azion. This ensures users can access the application securely over HTTPS when the domain starts resolving to the new infrastructure.

Azion provides free Let’s Encrypt certificates with automatic renewal.

Configure the Domain

Create a workload in Azion Console and associate your custom domain. See Workloads Documentation.

Point the Domain to Azion

Update your Route 53 hosted zone to point the subdomain to Azion:

www CNAME xxxxxxxxxx.map.azionedge.net

This keeps Route 53 as your DNS provider while routing traffic through Azion.

Verify Propagation

Terminal window
dig www.yourdomain.com CNAME +short

Reference documentation

2. Migrating DNS to Edge DNS

DNS configuration is foundational to application delivery. Migrating from Route 53 to Edge DNS requires careful planning to avoid downtime during the nameserver switch.

Key Differences

AspectRoute 53Azion Edge DNS
NameserversAssigned per hosted zonens1.aziondns.net, ns2.aziondns.com, ns3.aziondns.org
Record typesA, AAAA, CNAME, MX, TXT, SRV, NS, SOA, PTR, CAAA, AAAA, CNAME, MX, TXT, SRV, NS, CAA, PTR
Routing policiesSimple, Weighted, Latency, Failover, GeolocationRound-robin, Geo
Health checksRoute 53 health checksConnector health checks
DNSSECSupportedSupported
APIREST APIREST API v4
AnycastGlobal AnycastGlobal Anycast

Migration Steps

  1. Access Azion Console.
  2. Go to Products menu > Edge DNS.
  3. Click + Zone to create a new DNS zone.
  4. Enter your domain name.
  5. Add DNS records matching your Route 53 configuration.
  6. Note the Azion nameservers assigned to your zone.
  7. Update nameservers at your domain registrar (not in Route 53).

Record Type Mapping

Route 53 RecordAzion Edge DNSNotes
AADirect IP mapping
AAAAAAAAIPv6 address
CNAMECNAMEAlias to another domain
MXMXMail exchange (include priority)
TXTTXTText records (SPF, DKIM)
SRVSRVService records
CAACAACertificate Authority Authorization
NSNSNameserver delegation
PTRPTRReverse DNS lookup

Routing Policy Migration

Route 53 PolicyAzion EquivalentImplementation
SimpleStandard recordSingle record with one or more values
WeightedNot directly supportedUse Functions for custom logic
LatencyNot directly supportedApplications handles routing
FailoverNot directly supportedConfigure via Rules Engine
GeolocationGeo routingAvailable in Edge DNS

DNSSEC Configuration

To enable DNSSEC:

  1. Navigate to your zone in Edge DNS.
  2. Go to DNSSEC tab.
  3. Enable DNSSEC.
  4. Copy the DS record to your domain registrar.
Terminal window
# Verify DNSSEC
dig example.com DNSSEC +dnssec

Verify Propagation

Terminal window
# Check nameserver propagation
dig example.com NS +short
# Check specific record
dig www.example.com A +short
# Check from specific DNS server
dig @ns1.aziondns.net example.com A
# Compare Route 53 and Azion records
dig @ns-1234.awsdns-12.com example.com A
dig @ns1.aziondns.net example.com A

Reference documentation

3. Migrating SSL/TLS to Certificate Manager

SSL/TLS certificates ensure secure communication between clients and your application. Azion provides automatic certificate provisioning and supports custom certificates from AWS Certificate Manager (ACM).

Key Differences

AreaAWS Certificate ManagerAzion Certificate Manager
Certificate typesPublic, Private, ImportedLet’s Encrypt, Custom, Azion SAN
ValidationDNS, EmailDNS-01, HTTP-01
RenewalAutomaticAutomatic (Let’s Encrypt)
ScopeRegional (us-east-1 for CloudFront)Global Network
mTLSSupported (Private CA)Supported (Trusted CA)
CostFree for AWS resourcesFree (Let’s Encrypt)

Automatic Certificate Provisioning

Azion automatically provisions Let’s Encrypt certificates for custom domains:

  1. Access Azion Console.
  2. Create or edit a Workload.
  3. Add your custom domain.
  4. Azion automatically provisions a Let’s Encrypt certificate.
  5. Verify domain ownership (if required).
  6. Wait for certificate activation (typically 5-15 minutes).

Custom Certificate Upload

For organizations with existing certificates from ACM or external CAs:

  1. Export your certificate from ACM (if applicable).
  2. Go to Products menu > Certificate Manager.
  3. Click + Certificate.
  4. Select Custom Certificate.
  5. Upload your certificate (PEM format).
  6. Upload your private key.
  7. Upload intermediate CA chain (if applicable).
  8. Associate the certificate with your workload.

mTLS Configuration

For mutual TLS authentication:

  1. Navigate to Certificate Manager.
  2. Upload your CA certificate as a Trusted CA.
  3. Configure your workload to require client certificates.
  4. See the mTLS configuration guide for detailed steps.

Reference documentation

4. Migrating WAF to Web Application Firewall

Web Application Firewall protects applications from malicious traffic, SQL injection, cross-site scripting (XSS), and other application-layer attacks. Migrating AWS WAF rules requires careful mapping of rule logic and understanding differences in rule construction.

Key Differences

AspectAWS WAFAzion WAF
Rule languageJSON-based rulesRules Engine criteria
Managed rulesAWS Managed Rules, Marketplace rulesAzion-managed rulesets
Custom rulesWeb ACL with rulesRules Engine for Firewall
OWASP coverageCore rule set via managed rulesOWASP Top 10 coverage
ScopeRegional or CloudFrontGlobal Network
Mode optionsCount, BlockLearning, Blocking

Migration Steps

  1. Access Azion Console.
  2. Go to Products menu > Firewall.
  3. Select or create a Firewall instance.
  4. Navigate to WAF tab.
  5. Enable desired managed rulesets (SQL Injection, XSS, etc.).
  6. Configure sensitivity level per ruleset.
  7. Create custom rules in Rules Engine tab.
  8. Associate the Firewall with your application.

Rule Migration Example

Convert AWS WAF rule to Azion Rules Engine:

AWS WAF JSON rule:

{
"Name": "BlockAdminAccess",
"Priority": 1,
"Statement": {
"AndStatement": {
"Statements": [
{
"ByteMatchStatement": {
"SearchString": "/admin",
"FieldToMatch": { "UriPath": {} },
"PositionalConstraint": "CONTAINS"
}
},
{
"NotStatement": {
"Statement": {
"IPSetReferenceStatement": { "IPSet": "allowed-ips" }
}
}
}
]
}
},
"Action": { "Block": {} }
}

Azion criteria:

Variable: ${uri}
Operator: matches
Argument: /admin
AND
Variable: ${remote_addr}
Operator: does not match
Argument: 10.0.0.0/8

AWS Managed Rules to Azion Rulesets Mapping

AWS Managed Rule GroupAzion Equivalent
AWSManagedRulesCommonRuleSetGeneral Attack Detection
AWSManagedRulesSQLiRuleSetSQL Injection ruleset
AWSManagedRulesXSSRuleSetXSS ruleset
AWSManagedRulesLinuxRuleSetOS Command Injection
AWSManagedRulesPHPAppRuleSetIncluded in General Detection

Reference documentation

5. Migrating DDoS Protection

DDoS protection guards against volumetric attacks, protocol attacks, and application layer attacks. Azion provides automatic DDoS mitigation with no configuration required for most attack types.

Key Differences

AspectAWS ShieldAzion DDoS Protection
Standard protectionAutomatic, no costAutomatic, no cost
Advanced protectionAWS Shield Advanced (additional cost)Managed rules + Rules Engine
Layer coverageL3, L4, L7L3, L4, L7
DDoS response teamShield Advanced onlyEnterprise support
Cost protectionShield Advanced includes cost protectionStandard protection

Automatic Protection

Azion DDoS Protection activates automatically for all applications. No manual configuration is required for standard protection against:

  • Volumetric attacks (UDP floods, ICMP floods)
  • Protocol attacks (SYN floods, packet fragmentation)
  • Application layer attacks (HTTP floods, slowloris)

Advanced Configuration

For applications requiring specific DDoS policies:

  1. Access Azion Console.
  2. Go to Products menu > Firewall.
  3. Select your Firewall instance.
  4. Navigate to DDoS Protection tab.
  5. Configure threshold settings.
  6. Enable/disable specific mitigation rules.
  7. Set up alert notifications.

Network Shield

For network-layer protection, use Azion Network Shield:

  • Provides L3/L4 DDoS protection
  • Works with Edge DNS for traffic filtering
  • Integrates with Firewall for unified security

Reference documentation

6. Migrating Bot Management

Bot management protects applications from automated threats while allowing legitimate bots. Azion Bot Manager provides detection, challenge, and mitigation capabilities.

Key Differences

AspectAWS Bot ControlAzion Bot Manager
DetectionMachine learning, heuristics, fingerprintingMachine learning, behavioral analysis, fingerprinting, Reputation Intelligence
ChallengeCAPTCHA, silent challengeJavaScript injection (fingerprinting), ALTCHA (via redirect)
ActionsAllow, Count, Block, CAPTCHAAllow, Deny, Drop, Redirect, Custom HTML, Random Delay, Hold Connection
Lite versionNot availableBot Manager Lite (Marketplace)

Bot Manager Lite (Marketplace)

For basic bot protection, install Bot Manager Lite from Azion Marketplace:

  1. Access Azion Console.
  2. Go to Marketplace.
  3. Search for Bot Manager Lite.
  4. Click Install.
  5. Configure detection sensitivity.
  6. Set up response actions (challenge, block).
  7. Associate with your Firewall instance.

Custom Bot Rules

Create custom rules to handle specific bots:

Criteria: ${user_agent} contains "BadBot"
Behavior: Deny (403)
Criteria: ${user_agent} contains "Googlebot"
Behavior: Allow

Verification

Terminal window
# Test bot detection
curl -A "BadBot/1.0" https://yourdomain.com/
# Expected: 403 Forbidden or challenge page
curl -A "Mozilla/5.0" https://yourdomain.com/
# Expected: Normal response

Reference documentation

7. Migrating Rate Limiting

Rate limiting protects applications from abuse by limiting request rates per client. Azion provides rate limiting through Firewall rules and Functions.

Key Differences

AspectAWS WAF Rate LimitingAzion Rate Limiting
ConfigurationRate-based rules in Web ACLFirewall rules + Functions
GranularityPath, method, IP, headerPath, method, IP, custom
ActionsBlock, CountBlock, Log
Window1 minute to 1 hourCustomizable
ScopeRegional or CloudFrontGlobal Network

Firewall-Based Rate Limiting

Configure rate limiting in Firewall Rules Engine:

  1. Access Azion Console.
  2. Go to Firewall > Rules Engine.
  3. Create a new rule.
  4. Set criteria (path, method, etc.).
  5. Add Rate Limit behavior.
  6. Configure requests per second/minute.
  7. Set action (Block, Log).

Reference documentation

8. Migrating Security Services

AWS provides multiple security services for threat detection and vulnerability management. Azion offers comparable protection through Firewall and Network Lists.

Key Differences

AspectAWS Security ServicesAzion Equivalent
Threat detectionGuardDutyFirewall + Network Lists
Vulnerability scanningInspectorExternal scanning + Firewall
Security HubCentralized findingsReal-Time Events + Firewall logs
Threat intelligenceGuardDuty threat feedsNetwork Lists (Tor, known malicious IPs)

Network Lists for Threat Intelligence

Azion provides Network Lists that include threat intelligence data:

  1. Access Azion Console.
  2. Go to Products menu > Network Lists.
  3. View available Azion-maintained lists:
    • Tor Nodes: Known Tor exit nodes
    • Malicious IPs: Known malicious IP addresses
    • Geo-blocking: Country-based lists
  4. Create custom lists for your specific needs.
  5. Reference lists in Firewall rules.

Migration Considerations

When migrating from AWS security services:

  1. GuardDuty findings: Export findings and create corresponding Firewall rules for IP-based threats.
  2. Inspector vulnerabilities: Address application vulnerabilities before migration; Azion WAF provides runtime protection.
  3. CloudTrail logs: Configure Real-Time Events for comparable visibility.
  4. Security Hub: Use Azion Real-Time Events and external SIEM integration.

Reference documentation

Store

The Store category covers data services. Migrate objects, key-value data, and relational databases with attention to consistency, access patterns, and application compatibility.

1. Migrating S3 to Object Storage

Object storage powers files that matter to users and business operations: images, documents, static assets, media files, uploads, and generated content. Azion Object Storage provides S3-compatible storage with zero data transfer out cost.

Key Differences

AspectAmazon S3Azion Object Storage
Endpointhttps://s3.amazonaws.com/buckethttps://s3.us-east-005.azionstorage.net
S3 endpoints3.amazonaws.coms3.us-east-005.azionstorage.net
RegionMultiple regionsus-east-005
Data transfer outCharged per GBZero cost
Storage classStandard, Intelligent-Tiering, GlacierStandard
Bucket limits100 per account (default)100 per account (default)

Update Configuration

Update your S3 client configuration to use Azion Object Storage:

import { S3Client } from '@aws-sdk/client-s3';
// Before: AWS S3
const s3Client = new S3Client({
region: 'us-east-1',
credentials: {
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY
}
});
// After: Azion Object Storage
const s3Client = new S3Client({
region: 'us-east-005',
endpoint: 'https://s3.us-east-005.azionstorage.net',
credentials: {
accessKeyId: Azion.env.get('AZION_ACCESS_KEY'),
secretAccessKey: Azion.env.get('AZION_SECRET_KEY')
}
});

Create S3 Credentials

  1. Access Azion Console.
  2. Go to Object Storage.
  3. Navigate to S3 Credentials tab.
  4. Click + Credential.
  5. Select the bucket or account scope.
  6. Configure capabilities (read, write, delete, list).
  7. Save the access key and secret key securely.

Migrate Data with s3cmd

s3cmd is a command-line tool for managing S3-compatible storage services. It’s an effective option for migrating data from Amazon S3 to Azion Object Storage.

  1. Install s3cmd and run s3cmd --configure to set up your Azion credentials:
  • Access Key / Secret Key: Enter the keys generated for Azion Object Storage.
  • Default Region: us-east-005 (s3cmd also accepts us-east for interactive configuration).
  • S3 Endpoint: s3.us-east-005.azionstorage.net.
  • DNS template: %(bucket).s3.us-east-005.azionstorage.net.
  • Use HTTPS protocol: true.
  1. Use the following commands to migrate your data:
CommandDescription
s3cmd lsLists all buckets.
s3cmd put file.png s3://my-bucket/Uploads an object.
s3cmd get s3://my-bucket/file.pngDownloads an object.
s3cmd sync s3://aws-bucket/ s3://azion-bucket/Syncs between buckets.

Migrate Data with AWS CLI

Configure AWS CLI with Azion credentials:

Terminal window
# Configure AWS CLI profile for Azion
aws configure --profile azion
# Access Key: [your Azion access key]
# Secret Key: [your Azion secret key]
# Region: us-east-005
# List buckets
aws s3 ls --profile azion --endpoint-url https://s3.us-east-005.azionstorage.net
# Sync from AWS S3 to Azion
aws s3 sync s3://source-bucket/ s3://dest-bucket/ \
--profile azion \
--endpoint-url https://s3.us-east-005.azionstorage.net

Migrate Data with rclone

rclone supports syncing between different storage providers:

Terminal window
# Configure rclone for AWS S3 (source)
rclone config
# Name: aws-s3
# Storage: s3
# Provider: AWS
# env_auth: true
# Configure rclone for Azion (destination)
rclone config
# Name: azion
# Storage: s3
# Provider: Other
# endpoint: https://s3.us-east-005.azionstorage.net
# acl: private
# Sync from AWS to Azion
rclone sync aws-s3:source-bucket azion:dest-bucket --progress

Use Bucket as Origin

Configure Object Storage as an origin for your Application:

  1. Access Azion Console.
  2. Go to Connectors.
  3. Create a new Connector with type Object Storage.
  4. Select your bucket.
  5. Configure the prefix (optional).
  6. Associate the Connector with your Application.

Reference documentation

2. Migrating DynamoDB to KV Store / SQL Database

DynamoDB is a serverless key-value and document database. The migration destination depends on your use case: key-value operations map to KV Store, while complex queries map to SQL Database.

Key Differences

AspectAmazon DynamoDBAzion KV StoreAzion SQL Database
Data modelKey-value, documentKey-valueRelational (SQLite)
Query capabilityKey lookups, queries, scansKey lookups, hash operationsFull SQL
Global replicationGlobal Tables (multi-Region)Global by defaultMain/Replicas architecture
ConsistencyEventually consistent, strongEventualStrong (ACID)
IndexingGSI, LSINot supportedFull SQL indexing
Capacity modeOn-demand, provisionedServerlessServerless

Migration Decision Guide

DynamoDB FeatureRecommended Azion Service
Primary key lookupsKV Store
Simple key-value operationsKV Store
Session storageKV Store
Feature flags, configurationKV Store
Complex queries with filtersSQL Database
Secondary index queriesSQL Database
Aggregations, joinsSQL Database
Relational data modelSQL Database

Migrate to KV Store

For key-value workloads, use KV Store with a Redis-like API:

import { createClient } from 'azion/kv';
// Create KV client
const client = await createClient({
namespace: 'my-namespace'
})
.on('error', (err) => console.error('KV Error:', err))
.connect();
// Before: DynamoDB GetItem
// const result = await dynamodb.getItem({
// TableName: 'Users',
// Key: { userId: { S: '123' } }
// }).promise();
// After: KV Store get
const userData = await client.get('user:123');
// Before: DynamoDB PutItem
// await dynamodb.putItem({
// TableName: 'Users',
// Item: { userId: { S: '123' }, name: { S: 'John' } }
// }).promise();
// After: KV Store set
await client.set('user:123', JSON.stringify({ name: 'John' }), {
expiration: { type: 'EX', value: 3600 } // 1 hour TTL
});

Create a KV Store

  1. Access Azion Console.
  2. Go to KV Store.
  3. Click + Store.
  4. Enter a name for your store.
  5. Configure settings.
  6. Click Save.

Migrate to SQL Database

For complex query workloads, migrate to SQL Database:

import { Database } from 'azion:sql';
// Open database connection
const db = await Database.open('my-database');
// Before: DynamoDB Query with filter
// const result = await dynamodb.query({
// TableName: 'Orders',
// IndexName: 'CustomerIdIndex',
// KeyConditionExpression: 'customerId = :cid',
// FilterExpression: 'orderDate > :date'
// }).promise();
// After: SQL Database query
const orders = await db.query(
'SELECT * FROM orders WHERE customer_id = ? AND order_date > ?',
['customer-123', '2024-01-01']
);
// Iterate results
let row = await orders.next();
while (row) {
console.log(row.getString(0)); // access column by index
row = await orders.next();
}

Create a SQL Database

  1. Access Azion Console.
  2. Go to SQL Database.
  3. Click + Database.
  4. Enter a name for your database.
  5. Create tables using SQL Shell or API.
  6. Import your data.

Export DynamoDB Data

Export DynamoDB data and transform for import:

Terminal window
# Export DynamoDB table to S3
aws dynamodb export-table-to-point-in-time \
--table-name Users \
--s3-bucket my-export-bucket \
--export-format DYNAMODB_JSON
# Convert and import to Azion
# For KV Store: Transform to key-value pairs
# For SQL Database: Transform to SQL INSERT statements

Global Tables Migration

DynamoDB Global Tables provide multi-Region replication. KV Store is global by default:

DynamoDB Global TablesAzion KV Store
Multi-Region replicationGlobal by default
Conflict resolution: Last writer winsAutomatic synchronization
Eventual consistencyLow-latency global access
Additional cost per replicated writeNo additional replication cost

Reference documentation

3. Migrating RDS/Aurora to SQL Database

Relational database migration moves your transactional data and SQL workloads to Azion SQL Database. Azion SQL Database is SQLite-compatible and provides ACID compliance with a distributed Main/Replicas architecture.

Key Differences

AspectAmazon RDS/AuroraAzion SQL Database
EngineMySQL, PostgreSQL, MariaDB, Oracle, SQL ServerSQLite
CompatibilityEngine-specificPostgreSQL-compatible API
ArchitecturePrimary/ReplicasMain/Replicas (distributed)
ConnectionConnection string, connection poolingRuntime API (no connection pooling needed)
TransactionsACIDACID
ScalingVertical scaling, read replicasDistributed architecture
RegionSingle or multi-RegionGlobal Network

PostgreSQL to SQL Database Migration

For PostgreSQL workloads, Azion SQL Database provides a familiar SQL interface:

import { Database } from 'azion:sql';
// Open database connection
const db = await Database.open('my-database');
// Before: PostgreSQL query
// const result = await pgClient.query(
// 'SELECT id, name, email FROM users WHERE status = $1',
// ['active']
// );
// After: SQL Database query
const result = await db.query(
'SELECT id, name, email FROM users WHERE status = ?',
['active']
);
// Process results
let row = await result.next();
while (row) {
const id = row.getString(0);
const name = row.getString(1);
const email = row.getString(2);
console.log(`User: ${name} <${email}>`);
row = await result.next();
}

Create a SQL Database

  1. Access Azion Console.
  2. Go to SQL Database.
  3. Click + Database.
  4. Enter a name for your database.
  5. Click Save.
  6. Use SQL Shell to create tables and import data.

Export and Import Data

Export data from RDS/Aurora and import to SQL Database:

Terminal window
# Export from RDS PostgreSQL
pg_dump -h my-db.xxxx.region.rds.amazonaws.com \
-U admin \
-d mydb \
--data-only \
--inserts \
> export.sql
# For Aurora, you can also use Snapshot Export to S3
aws rds start-export-task \
--export-task-identifier my-export \
--source-arn arn:aws:rds:region:account:cluster:my-aurora-cluster \
--s3-bucket-name my-export-bucket \
--export-only data
# Import to Azion SQL Database via SQL Shell
# Connect to SQL Shell and run the export.sql file
# Or use the import API

Data Type Mapping

PostgreSQL TypeSQLite Equivalent
INTEGER, BIGINT, SMALLINTINTEGER
SERIAL, BIGSERIALINTEGER (auto-increment)
VARCHAR(n), CHAR(n), TEXTTEXT
BOOLEANINTEGER (0 or 1)
REAL, DOUBLE PRECISIONREAL
DECIMAL, NUMERICREAL
DATE, TIME, TIMESTAMPTEXT (ISO 8601 format)
JSON, JSONBTEXT (use JSON functions)
UUIDTEXT
BYTEABLOB

Reference documentation

4. Migrating ElastiCache to Cache / KV Store

ElastiCache provides in-memory caching with Redis or Memcached. Azion provides caching through Cache and key-value storage through KV Store.

Key Differences

AspectAmazon ElastiCacheAzion CacheAzion KV Store
TypeIn-memory cacheCacheDistributed key-value
EnginesRedis, MemcachedHTTP cacheRedis-like API
PersistenceOptional (Redis AOF/RDB)Time-based TTLPersistent
Data structuresStrings, hashes, lists, sets, sorted setsHTTP responsesStrings, hashes
ReplicationCluster mode, replication groupsGlobal NetworkGlobal by default
AccessTCP connectionHTTP request/responseRuntime API

Migration Decision Guide

ElastiCache Use CaseRecommended Azion Service
HTTP response cachingCache
Session storageKV Store
Rate limiting countersKV Store
Feature flagsKV Store
Database query cachingCache + Functions
Pub/Sub messagingFunctions + KV Store
Leaderboards, sorted setsSQL Database
Complex data structuresSQL Database

Migrate Redis Caching to KV Store

For Redis-like key-value operations, use KV Store:

import { createClient } from 'azion/kv';
// Create KV client with Redis-like API
const client = await createClient()
.on('error', (err) => console.error('KV Error:', err))
.connect();
// Before: Redis SET with expiration
// await redis.set('session:abc123', JSON.stringify(sessionData), 'EX', 3600);
// After: KV Store set with expiration
await client.set('session:abc123', JSON.stringify(sessionData), {
expiration: { type: 'EX', value: 3600 }
});
// Before: Redis GET
// const data = await redis.get('session:abc123');
// After: KV Store get
const data = await client.get('session:abc123');
// Before: Redis DEL
// await redis.del('session:abc123');
// After: KV Store delete
await client.delete('session:abc123');

Reference documentation

Observe

The Observe category covers analytics, metrics, logs, and distributed tracing. Migrating observability ensures you keep production visibility, troubleshooting capabilities, and compliance reporting after the cutover.

1. Migrating CloudWatch Metrics to Real-Time Metrics

CloudWatch Metrics provides monitoring for AWS resources and applications. Azion Real-Time Metrics delivers comparable capabilities through a GraphQL API and integrated dashboards with near real-time data aggregation.

Key Differences

AspectAmazon CloudWatch MetricsAzion Real-Time Metrics
Data freshnessNear real-time (1-5 minutes)Near real-time (up to 10 minutes)
Retention15 months (standard)2 years
Query methodGetMetricStatistics API, CloudWatch InsightsGraphQL API, Console dashboards
MetricsCustom metrics, namespace-basedRequest, bandwidth, latency, cache, WAF, DNS
Granularity1 second to 1 dayAdaptive intervals (minute/hour/day)
DashboardsCloudWatch DashboardsReal-Time Metrics + Grafana plugin
AlarmsCloudWatch AlarmsExternal monitoring via Data Stream

Available Metrics

Azion Real-Time Metrics provides comprehensive monitoring across product categories:

Build metrics:

  • Applications: Total requests, data transferred, status codes, bandwidth saving, average request time
  • Functions: Total invocations, execution time
  • Image Processor: Total requests, requests per second
  • Tiered Cache: Caching offload, L2 offload

Secure metrics:

  • WAF: Threats vs requests, SQL injection, XSS, RFI, threats by country
  • Edge DNS: Total queries
  • Bot Manager: Bot hits, bad bot hits, good bot hits, traffic classification

Observe metrics:

  • Data Stream: Total data streamed, total requests

Configuration Steps

  1. Access Azion Console.
  2. Go to Products menu > Real-Time Metrics.
  3. Select a category tab (Build, Secure, Observe).
  4. Select a product tab to view specific metrics.
  5. Configure Time range (Last Hour, 24 Hours, 7 Days, 30 Days, 6 Months).
  6. Use Filters to refine analysis by host, status code, or other dimensions.
  7. Click the context menu on any chart to export CSV or copy the GraphQL query.

GraphQL Query Examples

Query requests by status code:

query RequestsByStatus {
http(
filter: {
tsRange: { begin: "2024-01-01T00:00:00", end: "2024-01-01T23:59:59" }
}
aggregate: { sum: requests }
groupBy: [status]
orderBy: [sum_DESC]
first: 20
) {
status
sum
}
}

Query WAF threats by country:

query WafThreatsByCountry {
waf(
filter: {
tsRange: { begin: "2024-01-01T00:00:00", end: "2024-01-02T00:00:00" }
}
aggregate: { sum: threats }
groupBy: [country]
orderBy: [sum_DESC]
first: 10
) {
country
sum
}
}

Query data transferred for specific host:

query DataTransferredByHost {
http(
filter: {
tsRange: { begin: "2024-01-01T00:00:00", end: "2024-01-07T00:00:00" }
host: { eq: "www.example.com" }
}
aggregate: { sum: dataTransferred }
groupBy: [ts]
first: 500
) {
ts
sum
}
}

CloudWatch Alarm Migration

CloudWatch Alarms notify on metric thresholds. Azion doesn’t provide built-in alerting, but you can achieve similar functionality:

CloudWatch AlarmAzion Equivalent
Metric threshold alarmConfigure alerts in external monitoring (Datadog, Splunk) via Data Stream
Composite alarmsFunctions with custom logic + Data Stream
Anomaly detectionExternal SIEM/analytics platforms

Grafana Integration

Use the Azion Grafana plugin for custom dashboards:

Terminal window
# Install Azion Grafana plugin
grafana-cli plugins install aziontech-azion-plugin

Reference the Grafana plugin documentation for dashboard configuration.

Reference documentation

2. Migrating CloudWatch Logs to Real-Time Events

CloudWatch Logs collects and stores log data from AWS resources. Azion Real-Time Events provides immediate log access through Console or GraphQL API for real-time troubleshooting and investigation.

Key Differences

AspectAmazon CloudWatch LogsAzion Real-Time Events
Access methodGetLogEvents API, CloudWatch Logs InsightsReal-time query via Console or GraphQL API
LatencySeconds to minutesSeconds
Retention1 day to 10 years (configurable)7 days (168 hours), 2 years for Activity History
Query languageCloudWatch Logs Insights (SQL-like)GraphQL queries
Log groupsLog groups with log streamsData sources by product type
Metric filtersCreate metrics from logsUse Data Stream for custom processing

Data Sources Mapping

CloudWatch Log GroupAzion Real-Time Events Data Source
/aws/cloudfront/…HTTP Requests
/aws/lambda/…Functions
/aws/waf/…HTTP Requests (WAF fields)
/aws/route53/…Edge DNS
CloudTrailActivity History

Configuration Steps

  1. Access Azion Console.
  2. Go to Products menu > Real-Time Events.
  3. Select the Data Source tab (HTTP Requests, Functions, Edge DNS, etc.).
  4. Configure Time filter (Last 15 minutes to Last 7 days, or Custom time range).
  5. Add filters to narrow results (host, status, remote address, etc.).
  6. Click Search to query logs.
  7. Click any row to see detailed log information in More details view.

CloudWatch Logs Insights to GraphQL Migration

Convert CloudWatch Logs Insights queries to Real-Time Events GraphQL:

CloudWatch Logs Insights query:

fields @timestamp, @message
| filter @logGroup = "/aws/cloudfront/distribution"
| filter status >= 500
| sort @timestamp desc
| limit 100

Azion GraphQL equivalent:

query ErrorRequests {
http(
filter: {
tsRange: { begin: "2024-01-01T00:00:00", end: "2024-01-01T23:59:59" }
status: { gte: "500" }
}
orderBy: [ts_DESC]
first: 100
) {
ts
status
requestUri
host
remoteAddress
upstreamStatus
upstreamResponseTime
}
}

Available Variables by Data Source

HTTP Requests:

  • Request metadata: ts, remoteAddress, remotePort, host, requestUri, requestMethod, status
  • Performance: requestTime, upstreamResponseTime, upstreamHeaderTime
  • Bandwidth: bytesSent, requestLength, upstreamBytesReceived, upstreamBytesSent
  • Cache: upstreamCacheStatus
  • Security: wafBlock, wafMatch, wafScore, wafLearning
  • Geo: geoipCountryName, geoipRegionName, geoipAsn
  • TLS: sslCipher, sslProtocol

Functions:

  • functionId, functionsList, functionsTime, functionLanguage

Edge DNS:

  • level, qType, resolutionType, statusCode, zoneId

Log-Based Metrics

To create metrics from logs (equivalent to CloudWatch metric filters), use Data Stream:

  1. Access Azion Console.
  2. Go to Products menu > Data Stream.
  3. Click + Stream.
  4. Select Applications as data source.
  5. Use Custom Template to select specific variables.
  6. Choose an endpoint (Datadog, Splunk, Elasticsearch, etc.).
  7. Configure the destination for log processing.
  8. Activate the stream.

Reference documentation

3. Migrating X-Ray to Data Stream

AWS X-Ray provides distributed tracing and request tracing across services. Azion Data Stream enables streaming of observability data to external destinations for distributed tracing analysis.

Key Differences

AspectAWS X-RayAzion Data Stream
Trace collectionAutomatic with X-Ray SDKStream logs to external tracing systems
Service mapBuilt-in service map visualizationExternal tools (Datadog, Jaeger, Splunk)
Trace analysisX-Ray consoleExternal tracing platforms
AnnotationsCustom key-value pairsCustom log templates
SamplingConfigurable sampling rulesConfigurable sampling percentage
DestinationsX-Ray console, CloudWatch10+ external destinations

Tracing Data Flow Migration

AWS X-Ray ConceptAzion Equivalent
SegmentsRequest/response log entries
SubsegmentsFunctions execution logs
Service graphBuilt in external tracing tools (Datadog, Jaeger)
Trace ID propagationCustom headers via Rules Engine or Functions
AnnotationsLog variables in Data Stream template

Configuration Steps

  1. Access Azion Console.
  2. Go to Products menu > Data Stream.
  3. Click + Stream.
  4. Select Applications as data source for request tracing.
  5. Select Functions as additional data source for function execution traces.
  6. Create a Custom Template with trace-related variables:
    • $request_id (unique trace identifier)
    • $ts (timestamp)
    • $upstream_addr (origin address)
    • $upstream_response_time (response time)
    • $request_uri, $status, $host
  7. Choose a tracing-compatible endpoint (Datadog, Splunk, Elasticsearch, Kafka).
  8. Configure destination credentials.
  9. Activate the stream.

Trace ID Propagation

To enable distributed tracing across services, propagate trace context via HTTP headers:

Using Rules Engine:

Criteria: All requests
Behavior: Add Request Header
Header Name: X-Trace-Id
Header Value: ${request_id}

Using Functions:

export default {
async fetch(request) {
// Extract or generate trace ID
const traceId = request.headers.get('x-trace-id') ||
crypto.randomUUID();
// Add trace ID to upstream request
const upstreamRequest = new Request(request, {
headers: {
...Object.fromEntries(request.headers),
'X-Trace-Id': traceId
}
});
return fetch(upstreamRequest);
}
};

Supported Endpoints for Tracing

Data Stream supports multiple endpoints suitable for distributed tracing:

EndpointUse Case
DatadogFull APM and distributed tracing
SplunkLog analytics and tracing
ElasticsearchSearch and trace correlation
Apache KafkaStream to Jaeger, Zipkin, or custom tracing
Google BigQueryData warehouse for trace analysis
AWS Kinesis Data FirehoseIntegration with AWS X-Ray or other AWS services
Standard HTTP/HTTPS POSTCustom tracing systems

Data Firehose Migration

AWS Kinesis Data Firehose delivers streaming data to destinations. Azion Data Stream provides similar capabilities:

AWS Kinesis Data FirehoseAzion Data Stream
S3 destinationS3 endpoint (any S3-compatible storage)
Redshift destinationBigQuery or custom HTTP endpoint
Elasticsearch destinationElasticsearch endpoint
HTTP endpointStandard HTTP/HTTPS POST
Data transformation (Lambda)Functions for preprocessing

Configure Data Stream for S3:

Terminal window
curl -X POST 'https://api.azion.com/v4/workspace/stream/streams' \
--header 'Authorization: Token YOUR_TOKEN' \
--header 'Content-Type: application/json' \
--data '{
"name": "S3 Archive Stream",
"source": {
"type": "applications"
},
"template_id": 12345,
"endpoint": {
"type": "s3",
"name": "my-s3-endpoint",
"host_url": "https://s3.amazonaws.com",
"bucket_name": "my-logs-bucket",
"region": "us-east-1",
"access_key": "YOUR_ACCESS_KEY",
"secret_key": "YOUR_SECRET_KEY",
"object_key_prefix": "azion-logs"
},
"active": true
}'

CloudWatch RUM to Edge Pulse

CloudWatch RUM provides real user monitoring. Azion Edge Pulse delivers comparable capabilities:

AspectCloudWatch RUMAzion Edge Pulse
Data collectionJavaScript SDKJavaScript SDK
MetricsPage load, Core Web Vitals, JavaScript errorsReal user metrics, performance data
Session replayAvailableAvailable via integration
Custom eventsCustom events APICustom events via SDK

Configure Edge Pulse for real user monitoring:

  1. Access Azion Console.
  2. Go to Products menu > Edge Pulse.
  3. Create a new Pulse instance.
  4. Configure the JavaScript snippet for your application.
  5. Add the snippet to your application’s HTML.
  6. Configure data collection settings.
  7. View metrics in Real-Time Metrics under Edge Pulse.

Reference documentation

Troubleshooting

ProblemLikely CauseSolution
DNS not resolvingNameserver propagation delayWait up to 48 hours after updating nameservers; verify with dig yourdomain.com NS
Certificate validation failsDomain ownership not verifiedConfirm DNS TXT record or HTTP challenge is accessible; check Certificate Manager status
Function returns process.env not definedNode.js environment variable syntax usedUse Azion.env.get('VARIABLE_NAME') instead of process.env.VARIABLE_NAME
Cache not purging as expectedPurge request still processingWait 5-10 minutes; verify purge via curl -I to check headers; use wildcard purge for broad changes
WAF rules blocking legitimate trafficSensitivity too high or false positiveSwitch WAF to Learning mode first; review blocked requests in Real-Time Events; adjust sensitivity
Origin connection timeoutsConnector misconfiguration or origin unavailableVerify Connector address and port; check origin health; increase timeout in Connector settings
SSL handshake failuresCertificate mismatch or incomplete chainVerify certificate covers the domain; include intermediate CA in certificate chain; check TLS minimum version
CORS errors on API requestsMissing CORS headers in responseAdd CORS headers via Rules Engine: Access-Control-Allow-Origin, Access-Control-Allow-Methods
Lambda function signature errorsCloudFront event structure differs from AzionUpdate function to use fetch(request, env, ctx) signature; access request via request object
DynamoDB queries fail after migrationKV Store API syntax differsUpdate code to use KVStore from azion:kv; check key naming conventions
S3 uploads fail with 403Incorrect credentials or endpointVerify Access Key and Secret Key; confirm endpoint is s3.us-east-005.azionstorage.net
CloudWatch metrics not appearingData Stream not configuredSet up Data Stream to export metrics; verify destination credentials and format

Key Advantages After Migration

CapabilityBefore (AWS)After (Azion)
Unified platformMultiple consoles for CloudFront, Lambda, S3, Route 53, WAF, CloudWatchSingle console for compute, storage, security, and observability
Cold startsPossible on Lambda (especially with VPC)Minimized with distributed V8 isolates
Global distributionRegions and edge locations (200+ PoPs)Azion platform locations worldwide with consistent performance
Pricing modelPer-service billing, data transfer fees, request countsSimpler consolidated billing; zero DTO cost for Object Storage
ObservabilityCloudWatch with separate dashboards, logs, and alarmsReal-Time Metrics and Events with instant access via Console or GraphQL API
Security integrationWAF, Shield, IAM as separate servicesBuilt-in WAF, DDoS Protection, Bot Manager integrated with workloads

Next Steps

After your migration is complete:

Get Started with a Small Project

The best way to begin is not with the most complex application in your portfolio. Start with a project that is meaningful enough to validate the migration path, but small enough to move quickly and safely.

Choose an application or workload that includes representative pieces of your architecture: a CloudFront distribution, a few Lambda functions, an S3 bucket, maybe a DynamoDB table. Use that project to validate the workflow, document the process, and identify internal patterns your team can reuse.

From there, expand gradually. Migrate more complex cache behaviors. Move additional functions. Bring over storage and database workloads. Add observability. Review security rules. Then prepare production cutovers with greater confidence.

Need Help?

Get help from the Azion Support team, or join our Discord community to see how others are using Azion.