The aws:lambda/alias:Alias resource, part of the Pulumi AWS provider, creates a named pointer to a specific Lambda function version, enabling stable references and traffic management. This guide focuses on three capabilities: version pinning for stable references, traffic splitting between versions, and development aliases tracking latest code.
Aliases reference Lambda functions and their published versions, which must exist before creating the alias. The examples are intentionally small. Combine them with your own function versioning strategy and deployment pipelines.
Point an alias to a specific function version
Most deployments use aliases to create stable references that can be updated without changing client code or API Gateway integrations.
import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";
const example = new aws.lambda.Alias("example", {
name: "production",
description: "Production environment alias",
functionName: exampleAwsLambdaFunction.arn,
functionVersion: "1",
});
import pulumi
import pulumi_aws as aws
example = aws.lambda_.Alias("example",
name="production",
description="Production environment alias",
function_name=example_aws_lambda_function["arn"],
function_version="1")
package main
import (
"github.com/pulumi/pulumi-aws/sdk/v7/go/aws/lambda"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_, err := lambda.NewAlias(ctx, "example", &lambda.AliasArgs{
Name: pulumi.String("production"),
Description: pulumi.String("Production environment alias"),
FunctionName: pulumi.Any(exampleAwsLambdaFunction.Arn),
FunctionVersion: pulumi.String("1"),
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Aws = Pulumi.Aws;
return await Deployment.RunAsync(() =>
{
var example = new Aws.Lambda.Alias("example", new()
{
Name = "production",
Description = "Production environment alias",
FunctionName = exampleAwsLambdaFunction.Arn,
FunctionVersion = "1",
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.aws.lambda.Alias;
import com.pulumi.aws.lambda.AliasArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var example = new Alias("example", AliasArgs.builder()
.name("production")
.description("Production environment alias")
.functionName(exampleAwsLambdaFunction.arn())
.functionVersion("1")
.build());
}
}
resources:
example:
type: aws:lambda:Alias
properties:
name: production
description: Production environment alias
functionName: ${exampleAwsLambdaFunction.arn}
functionVersion: '1'
The alias acts as a pointer: clients invoke the alias name, and Lambda routes requests to the specified functionVersion. When you publish a new version, update the alias to point to it. The name property creates the stable reference (e.g., “production”), while functionVersion controls which code actually runs.
Split traffic between two function versions
When testing new code in production, teams gradually shift traffic from a stable version to a new version.
import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";
const example = new aws.lambda.Alias("example", {
name: "staging",
description: "Staging environment with traffic splitting",
functionName: exampleAwsLambdaFunction.functionName,
functionVersion: "2",
routingConfig: {
additionalVersionWeights: {
"1": 0.1,
},
},
});
import pulumi
import pulumi_aws as aws
example = aws.lambda_.Alias("example",
name="staging",
description="Staging environment with traffic splitting",
function_name=example_aws_lambda_function["functionName"],
function_version="2",
routing_config={
"additional_version_weights": {
"1": 0.1,
},
})
package main
import (
"github.com/pulumi/pulumi-aws/sdk/v7/go/aws/lambda"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_, err := lambda.NewAlias(ctx, "example", &lambda.AliasArgs{
Name: pulumi.String("staging"),
Description: pulumi.String("Staging environment with traffic splitting"),
FunctionName: pulumi.Any(exampleAwsLambdaFunction.FunctionName),
FunctionVersion: pulumi.String("2"),
RoutingConfig: &lambda.AliasRoutingConfigArgs{
AdditionalVersionWeights: pulumi.Float64Map{
"1": pulumi.Float64(0.1),
},
},
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Aws = Pulumi.Aws;
return await Deployment.RunAsync(() =>
{
var example = new Aws.Lambda.Alias("example", new()
{
Name = "staging",
Description = "Staging environment with traffic splitting",
FunctionName = exampleAwsLambdaFunction.FunctionName,
FunctionVersion = "2",
RoutingConfig = new Aws.Lambda.Inputs.AliasRoutingConfigArgs
{
AdditionalVersionWeights =
{
{ "1", 0.1 },
},
},
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.aws.lambda.Alias;
import com.pulumi.aws.lambda.AliasArgs;
import com.pulumi.aws.lambda.inputs.AliasRoutingConfigArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var example = new Alias("example", AliasArgs.builder()
.name("staging")
.description("Staging environment with traffic splitting")
.functionName(exampleAwsLambdaFunction.functionName())
.functionVersion("2")
.routingConfig(AliasRoutingConfigArgs.builder()
.additionalVersionWeights(Map.of("1", 0.1))
.build())
.build());
}
}
resources:
example:
type: aws:lambda:Alias
properties:
name: staging
description: Staging environment with traffic splitting
functionName: ${exampleAwsLambdaFunction.functionName}
functionVersion: '2'
routingConfig:
additionalVersionWeights:
'1': 0.1
The routingConfig property enables weighted traffic splitting. Here, 90% of invocations go to version 2 (the primary functionVersion), while 10% go to version 1 (specified in additionalVersionWeights). This canary pattern lets you monitor error rates before fully committing to the new version.
Track the latest unpublished function code
Development environments often test the most recent code changes without publishing numbered versions.
import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";
const example = new aws.lambda.Alias("example", {
name: "dev",
description: "Development environment - always points to latest",
functionName: exampleAwsLambdaFunction.functionName,
functionVersion: "$LATEST",
});
import pulumi
import pulumi_aws as aws
example = aws.lambda_.Alias("example",
name="dev",
description="Development environment - always points to latest",
function_name=example_aws_lambda_function["functionName"],
function_version="$LATEST")
package main
import (
"github.com/pulumi/pulumi-aws/sdk/v7/go/aws/lambda"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
_, err := lambda.NewAlias(ctx, "example", &lambda.AliasArgs{
Name: pulumi.String("dev"),
Description: pulumi.String("Development environment - always points to latest"),
FunctionName: pulumi.Any(exampleAwsLambdaFunction.FunctionName),
FunctionVersion: pulumi.String("$LATEST"),
})
if err != nil {
return err
}
return nil
})
}
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Aws = Pulumi.Aws;
return await Deployment.RunAsync(() =>
{
var example = new Aws.Lambda.Alias("example", new()
{
Name = "dev",
Description = "Development environment - always points to latest",
FunctionName = exampleAwsLambdaFunction.FunctionName,
FunctionVersion = "$LATEST",
});
});
package generated_program;
import com.pulumi.Context;
import com.pulumi.Pulumi;
import com.pulumi.core.Output;
import com.pulumi.aws.lambda.Alias;
import com.pulumi.aws.lambda.AliasArgs;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
public class App {
public static void main(String[] args) {
Pulumi.run(App::stack);
}
public static void stack(Context ctx) {
var example = new Alias("example", AliasArgs.builder()
.name("dev")
.description("Development environment - always points to latest")
.functionName(exampleAwsLambdaFunction.functionName())
.functionVersion("$LATEST")
.build());
}
}
resources:
example:
type: aws:lambda:Alias
properties:
name: dev
description: Development environment - always points to latest
functionName: ${exampleAwsLambdaFunction.functionName}
functionVersion: $LATEST
Setting functionVersion to “$LATEST” makes the alias always point to the unpublished function code. This is useful for development but not recommended for production, since “$LATEST” changes with every function update and doesn’t support traffic splitting.
Beyond these examples
These snippets focus on specific alias-level features: version pinning and stable references, and traffic splitting for canary deployments. They’re intentionally minimal rather than full deployment pipelines.
The examples reference pre-existing infrastructure such as Lambda functions with published versions. They focus on configuring the alias rather than managing function code or versions.
To keep things focused, common alias patterns are omitted, including:
- API Gateway integration (invokeArn usage)
- EventBridge or other trigger configuration
- Alias lifecycle policies and rollback strategies
- Monitoring and alarming on per-alias metrics
These omissions are intentional: the goal is to illustrate how each alias feature is wired, not provide drop-in deployment modules. See the Lambda Alias resource reference for all available configuration options.
Let's manage AWS Lambda Aliases
Get started with Pulumi Cloud, then follow our quick setup guide to deploy this infrastructure.
Try Pulumi Cloud for FREEFrequently Asked Questions
Traffic Management & Deployment
routingConfig with additionalVersionWeights to route a percentage of traffic to a secondary version. For example, setting "6": 0.05 routes 5% to version 6 and 95% to the primary functionVersion.functionVersion to $LATEST to always point to the most recent unpublished version. This is useful for development environments.additionalVersionWeights map specifies decimal weights (0.0 to 1.0) for secondary versions. The primary functionVersion receives the remaining traffic percentage.Configuration & Constraints
functionName and name are immutable. Changing either property forces Pulumi to destroy and recreate the alias.(?!^[0-9]+$)([a-zA-Z0-9-_]+), which rejects purely numeric names. Include at least one letter, hyphen, or underscore.functionVersion must be either $LATEST or a numeric version string matching the pattern (\$LATEST|[0-9]+).Integration & Usage
invokeArn output property as the uri in your aws.apigateway.Integration resource.function-name/alias-name, for example: pulumi import aws:lambda/alias:Alias example my-function/production.Using a different cloud?
Explore serverless guides for other cloud providers: