Engine Split Traffic
Traffic routing configuration for versions within a single service. Traffic splits define how traffic directed to the service is assigned to versions. To get more information about ServiceSplitTraffic, see:
Example Usage
App Engine Service Split Traffic
import * as pulumi from "@pulumi/pulumi";
import * as gcp from "@pulumi/gcp";
const bucket = new gcp.storage.Bucket("bucket", {
name: "appengine-static-content",
location: "US",
});
const object = new gcp.storage.BucketObject("object", {
name: "hello-world.zip",
bucket: bucket.name,
source: new pulumi.asset.FileAsset("./test-fixtures/hello-world.zip"),
});
const liveappV1 = new gcp.appengine.StandardAppVersion("liveapp_v1", {
versionId: "v1",
service: "liveapp",
deleteServiceOnDestroy: true,
runtime: "nodejs20",
entrypoint: {
shell: "node ./app.js",
},
deployment: {
zip: {
sourceUrl: pulumi.interpolate`https://storage.googleapis.com/${bucket.name}/${object.name}`,
},
},
envVariables: {
port: "8080",
},
});
const liveappV2 = new gcp.appengine.StandardAppVersion("liveapp_v2", {
versionId: "v2",
service: "liveapp",
noopOnDestroy: true,
runtime: "nodejs20",
entrypoint: {
shell: "node ./app.js",
},
deployment: {
zip: {
sourceUrl: pulumi.interpolate`https://storage.googleapis.com/${bucket.name}/${object.name}`,
},
},
envVariables: {
port: "8080",
},
});
const liveapp = new gcp.appengine.EngineSplitTraffic("liveapp", {
service: liveappV2.service,
migrateTraffic: false,
split: {
shardBy: "IP",
allocations: pulumi.all([liveappV1.versionId, liveappV2.versionId]).apply(([liveappV1VersionId, liveappV2VersionId]) => {
[liveappV1VersionId]: 0.75,
[liveappV2VersionId]: 0.25,
}),
},
});
Content copied to clipboard
import pulumi
import pulumi_gcp as gcp
bucket = gcp.storage.Bucket("bucket",
name="appengine-static-content",
location="US")
object = gcp.storage.BucketObject("object",
name="hello-world.zip",
bucket=bucket.name,
source=pulumi.FileAsset("./test-fixtures/hello-world.zip"))
liveapp_v1 = gcp.appengine.StandardAppVersion("liveapp_v1",
version_id="v1",
service="liveapp",
delete_service_on_destroy=True,
runtime="nodejs20",
entrypoint={
"shell": "node ./app.js",
},
deployment={
"zip": {
"source_url": pulumi.Output.all(
bucketName=bucket.name,
objectName=object.name
).apply(lambda resolved_outputs: f"https://storage.googleapis.com/{resolved_outputs['bucketName']}/{resolved_outputs['objectName']}")
,
},
},
env_variables={
"port": "8080",
})
liveapp_v2 = gcp.appengine.StandardAppVersion("liveapp_v2",
version_id="v2",
service="liveapp",
noop_on_destroy=True,
runtime="nodejs20",
entrypoint={
"shell": "node ./app.js",
},
deployment={
"zip": {
"source_url": pulumi.Output.all(
bucketName=bucket.name,
objectName=object.name
).apply(lambda resolved_outputs: f"https://storage.googleapis.com/{resolved_outputs['bucketName']}/{resolved_outputs['objectName']}")
,
},
},
env_variables={
"port": "8080",
})
liveapp = gcp.appengine.EngineSplitTraffic("liveapp",
service=liveapp_v2.service,
migrate_traffic=False,
split={
"shard_by": "IP",
"allocations": pulumi.Output.all(
liveappV1Version_id=liveapp_v1.version_id,
liveappV2Version_id=liveapp_v2.version_id
).apply(lambda resolved_outputs: {
resolved_outputs['liveappV1Version_id']: 0.75,
resolved_outputs['liveappV2Version_id']: 0.25,
})
,
})
Content copied to clipboard
using System.Collections.Generic;
using System.Linq;
using Pulumi;
using Gcp = Pulumi.Gcp;
return await Deployment.RunAsync(() =>
{
var bucket = new Gcp.Storage.Bucket("bucket", new()
{
Name = "appengine-static-content",
Location = "US",
});
var @object = new Gcp.Storage.BucketObject("object", new()
{
Name = "hello-world.zip",
Bucket = bucket.Name,
Source = new FileAsset("./test-fixtures/hello-world.zip"),
});
var liveappV1 = new Gcp.AppEngine.StandardAppVersion("liveapp_v1", new()
{
VersionId = "v1",
Service = "liveapp",
DeleteServiceOnDestroy = true,
Runtime = "nodejs20",
Entrypoint = new Gcp.AppEngine.Inputs.StandardAppVersionEntrypointArgs
{
Shell = "node ./app.js",
},
Deployment = new Gcp.AppEngine.Inputs.StandardAppVersionDeploymentArgs
{
Zip = new Gcp.AppEngine.Inputs.StandardAppVersionDeploymentZipArgs
{
SourceUrl = Output.Tuple(bucket.Name, @object.Name).Apply(values =>
{
var bucketName = values.Item1;
var objectName = values.Item2;
return $"https://storage.googleapis.com/{bucketName}/{objectName}";
}),
},
},
EnvVariables =
{
{ "port", "8080" },
},
});
var liveappV2 = new Gcp.AppEngine.StandardAppVersion("liveapp_v2", new()
{
VersionId = "v2",
Service = "liveapp",
NoopOnDestroy = true,
Runtime = "nodejs20",
Entrypoint = new Gcp.AppEngine.Inputs.StandardAppVersionEntrypointArgs
{
Shell = "node ./app.js",
},
Deployment = new Gcp.AppEngine.Inputs.StandardAppVersionDeploymentArgs
{
Zip = new Gcp.AppEngine.Inputs.StandardAppVersionDeploymentZipArgs
{
SourceUrl = Output.Tuple(bucket.Name, @object.Name).Apply(values =>
{
var bucketName = values.Item1;
var objectName = values.Item2;
return $"https://storage.googleapis.com/{bucketName}/{objectName}";
}),
},
},
EnvVariables =
{
{ "port", "8080" },
},
});
var liveapp = new Gcp.AppEngine.EngineSplitTraffic("liveapp", new()
{
Service = liveappV2.Service,
MigrateTraffic = false,
Split = new Gcp.AppEngine.Inputs.EngineSplitTrafficSplitArgs
{
ShardBy = "IP",
Allocations = Output.Tuple(liveappV1.VersionId, liveappV2.VersionId).Apply(values =>
{
var liveappV1VersionId = values.Item1;
var liveappV2VersionId = values.Item2;
return
{
{ liveappV1VersionId, 0.75 },
{ liveappV2VersionId, 0.25 },
};
}),
},
});
});
Content copied to clipboard
resources:
bucket:
type: gcp:storage:Bucket
properties:
name: appengine-static-content
location: US
object:
type: gcp:storage:BucketObject
properties:
name: hello-world.zip
bucket: ${bucket.name}
source:
fn::FileAsset: ./test-fixtures/hello-world.zip
liveappV1:
type: gcp:appengine:StandardAppVersion
name: liveapp_v1
properties:
versionId: v1
service: liveapp
deleteServiceOnDestroy: true
runtime: nodejs20
entrypoint:
shell: node ./app.js
deployment:
zip:
sourceUrl: https://storage.googleapis.com/${bucket.name}/${object.name}
envVariables:
port: '8080'
liveappV2:
type: gcp:appengine:StandardAppVersion
name: liveapp_v2
properties:
versionId: v2
service: liveapp
noopOnDestroy: true
runtime: nodejs20
entrypoint:
shell: node ./app.js
deployment:
zip:
sourceUrl: https://storage.googleapis.com/${bucket.name}/${object.name}
envVariables:
port: '8080'
liveapp:
type: gcp:appengine:EngineSplitTraffic
properties:
service: ${liveappV2.service}
migrateTraffic: false
split:
shardBy: IP
allocations:
${liveappV1.versionId}: 0.75
${liveappV2.versionId}: 0.25
Content copied to clipboard
Import
ServiceSplitTraffic can be imported using any of these accepted formats:
apps/{{project}}/services/{{service}}
{{project}}/{{service}}
{{service}}
When using thepulumi import
command, ServiceSplitTraffic can be imported using one of the formats above. For example:
$ pulumi import gcp:appengine/engineSplitTraffic:EngineSplitTraffic default apps/{{project}}/services/{{service}}
Content copied to clipboard
$ pulumi import gcp:appengine/engineSplitTraffic:EngineSplitTraffic default {{project}}/{{service}}
Content copied to clipboard
$ pulumi import gcp:appengine/engineSplitTraffic:EngineSplitTraffic default {{service}}
Content copied to clipboard
Properties
Link copied to clipboard
If set to true traffic will be migrated to this version.
Link copied to clipboard
Link copied to clipboard
Link copied to clipboard
Link copied to clipboard
Mapping that defines fractional HTTP traffic diversion to different versions within the service. Structure is documented below.