Kinesis Analytics Flink
Version 2.273.0-alpha.0
Separate package
@aws-cdk/aws-kinesisanalytics-flink-alpha is not part of aws-cdk-lib — install it separately:
npm install @aws-cdk/aws-kinesisanalytics-flink-alpha
pip install aws-cdk.aws-kinesisanalytics-flink-alpha
This module is experimental (alpha): its API may change in any release, without a major version bump.
The APIs of higher level constructs in this module are experimental and under active development. They are subject to non-backward compatible changes or removal in any future version. These are not subject to the Semantic Versioning model and breaking changes will be announced in the release notes. This means that while you may use them, you may need to update your source code when upgrading to a newer version of this package.
This package provides constructs for creating Kinesis Analytics Flink applications. To learn more about using using managed Flink applications, see the AWS developer guide.
Creating Flink Applications
To create a new Flink application, use the Application construct:
import * as path from 'path';
import * as integ from '@aws-cdk/integ-tests-alpha';
import * as core from 'aws-cdk-lib';
import * as cloudwatch from 'aws-cdk-lib/aws-cloudwatch';
import * as flink from '../lib';
const app = new core.App();
const stack = new core.Stack(app, 'FlinkAppTest');
const flinkRuntimes = [
flink.Runtime.FLINK_1_15,
flink.Runtime.FLINK_1_18,
flink.Runtime.FLINK_1_19,
flink.Runtime.FLINK_1_20,
flink.Runtime.FLINK_2_2,
];
flinkRuntimes.forEach((runtime) => {
const flinkApp = new flink.Application(stack, `App-${runtime.value}`, {
code: flink.ApplicationCode.fromAsset(path.join(__dirname, 'code-asset')),
runtime: runtime,
});
new cloudwatch.Alarm(stack, `Alarm-${runtime.value}`, {
metric: flinkApp.metricFullRestarts(),
evaluationPeriods: 1,
threshold: 3,
});
});
new integ.IntegTest(app, 'ApplicationTest', {
testCases: [stack],
});
import path as path
import aws_cdk.integ_tests_alpha as integ
import aws_cdk as core
import aws_cdk.aws_cloudwatch as cloudwatch
import aws_cdk.aws_kinesisanalytics_flink_alpha as flink
app = core.App()
stack = core.Stack(app, "FlinkAppTest")
flink_runtimes = [flink.Runtime.FLINK_1_15, flink.Runtime.FLINK_1_18, flink.Runtime.FLINK_1_19, flink.Runtime.FLINK_1_20, flink.Runtime.FLINK_2_2
]
flink_runtimes.for_each((runtime) => {
const flinkApp = new flink.Application(stack, `App-${runtime.value}`, {
code: flink.ApplicationCode.fromAsset(path.join(__dirname, 'code-asset')),
runtime: runtime,
});
new cloudwatch.Alarm(stack, `Alarm-${runtime.value}`, {
metric: flinkApp.metricFullRestarts(),
evaluationPeriods: 1,
threshold: 3,
});
})
integ.IntegTest(app, "ApplicationTest",
test_cases=[stack]
)
import path.*;
import software.amazon.awscdk.integtests.alpha.*;
import software.amazon.awscdk.*;
import software.amazon.awscdk.services.cloudwatch.*;
import software.amazon.awscdk.services.kinesisanalytics.flink.alpha.*;
App app = new App();
Stack stack = new Stack(app, "FlinkAppTest");
Runtime[] flinkRuntimes = List.of(Runtime.FLINK_1_15, Runtime.FLINK_1_18, Runtime.FLINK_1_19, Runtime.FLINK_1_20, Runtime.FLINK_2_2);
flinkRuntimes.forEach((runtime) => {
const flinkApp = new flink.Application(stack, `App-${runtime.value}`, {
code: flink.ApplicationCode.fromAsset(path.join(__dirname, 'code-asset')),
runtime: runtime,
});
new cloudwatch.Alarm(stack, `Alarm-${runtime.value}`, {
metric: flinkApp.metricFullRestarts(),
evaluationPeriods: 1,
threshold: 3,
});
});
IntegTest.Builder.create(app, "ApplicationTest")
.testCases(List.of(stack))
.build();
using Path;
using Amazon.CDK.IntegTests.Alpha;
using Amazon.CDK;
using Amazon.CDK.AWS.CloudWatch;
using Amazon.CDK.AWS.Kinesisanalytics.Flink.Alpha;
var app = new App();
var stack = new Stack(app, "FlinkAppTest");
var flinkRuntimes = new [] { Runtime.FLINK_1_15, Runtime.FLINK_1_18, Runtime.FLINK_1_19, Runtime.FLINK_1_20, Runtime.FLINK_2_2 };
flinkRuntimes.ForEach((runtime) => {
const flinkApp = new flink.Application(stack, `App-${runtime.value}`, {
code: flink.ApplicationCode.fromAsset(path.join(__dirname, 'code-asset')),
runtime: runtime,
});
new cloudwatch.Alarm(stack, `Alarm-${runtime.value}`, {
metric: flinkApp.metricFullRestarts(),
evaluationPeriods: 1,
threshold: 3,
});
});
new IntegTest(app, "ApplicationTest", new IntegTestProps {
TestCases = new [] { stack }
});
import path "github.com/aws-samples/dummy/path"
import integ "github.com/aws/aws-cdk-go/awscdkintegtestsalpha"
import "github.com/aws/aws-cdk-go/awscdk"
import cloudwatch "github.com/aws/aws-cdk-go/awscdk"
import "github.com/aws/aws-cdk-go/awscdkkinesisanalyticsflinkalpha"
app := core.NewApp()
stack := core.NewStack(app, jsii.String("FlinkAppTest"))
flinkRuntimes := []Runtime{
flink.Runtime_FLINK_1_15(),
flink.Runtime_FLINK_1_18(),
flink.Runtime_FLINK_1_19(),
flink.Runtime_FLINK_1_20(),
flink.Runtime_FLINK_2_2(),
}
flinkRuntimes.forEach((runtime) => {
const flinkApp = new flink.Application(stack, `App-${runtime.value}`, {
code: flink.ApplicationCode.fromAsset(path.join(__dirname, 'code-asset')),
runtime: runtime,
});
new cloudwatch.Alarm(stack, `Alarm-${runtime.value}`, {
metric: flinkApp.metricFullRestarts(),
evaluationPeriods: 1,
threshold: 3,
});
})
integ.NewIntegTest(app, jsii.String("ApplicationTest"), &IntegTestProps{
TestCases: []Stack{
stack,
},
})
The code property can use fromAsset as shown above to reference a local jar file in s3 or fromBucket to reference a file in s3.
new flink.Application(stack, 'App', {
code: flink.ApplicationCode.fromBucket(bucket, fileKey),
runtime: flink.Runtime.FLINK_1_19,
});
flink.Application(stack, "App",
code=flink.ApplicationCode.from_bucket(bucket, file_key),
runtime=flink.Runtime.FLINK_1_19
)
Application.Builder.create(stack, "App")
.code(ApplicationCode.fromBucket(bucket, fileKey))
.runtime(Runtime.FLINK_1_19)
.build();
new Application(stack, "App", new ApplicationProps {
Code = ApplicationCode.FromBucket(bucket, fileKey),
Runtime = Runtime.FLINK_1_19
});
flink.NewApplication(stack, jsii.String("App"), &ApplicationProps{
Code: flink.ApplicationCode_FromBucket(bucket, fileKey),
Runtime: flink.Runtime_FLINK_1_19(),
})
The propertyGroups property provides a way of passing arbitrary runtime properties to your Flink application. You can use the aws-kinesisanalytics-runtime library to retrieve these properties.
declare const bucket: s3.Bucket;
const flinkApp = new flink.Application(this, 'Application', {
propertyGroups: {
FlinkApplicationProperties: {
inputStreamName: 'my-input-kinesis-stream',
outputStreamName: 'my-output-kinesis-stream',
},
},
// ...
runtime: flink.Runtime.FLINK_2_2,
code: flink.ApplicationCode.fromBucket(bucket, 'my-app.jar'),
});
# bucket: s3.Bucket
flink_app = flink.Application(self, "Application",
property_groups={
"FlinkApplicationProperties": {
"input_stream_name": "my-input-kinesis-stream",
"output_stream_name": "my-output-kinesis-stream"
}
},
# ...
runtime=flink.Runtime.FLINK_2_2,
code=flink.ApplicationCode.from_bucket(bucket, "my-app.jar")
)
Bucket bucket;
Application flinkApp = Application.Builder.create(this, "Application")
.propertyGroups(Map.of(
"FlinkApplicationProperties", Map.of(
"inputStreamName", "my-input-kinesis-stream",
"outputStreamName", "my-output-kinesis-stream")))
// ...
.runtime(Runtime.FLINK_2_2)
.code(ApplicationCode.fromBucket(bucket, "my-app.jar"))
.build();
Bucket bucket;
var flinkApp = new Application(this, "Application", new ApplicationProps {
PropertyGroups = new Dictionary<string, IDictionary<string, string>> {
{ "FlinkApplicationProperties", new Dictionary<string, string> {
{ "inputStreamName", "my-input-kinesis-stream" },
{ "outputStreamName", "my-output-kinesis-stream" }
} }
},
// ...
Runtime = Runtime.FLINK_2_2,
Code = ApplicationCode.FromBucket(bucket, "my-app.jar")
});
var bucket Bucket
flinkApp := flink.NewApplication(this, jsii.String("Application"), &ApplicationProps{
PropertyGroups: map[string]map[string]*string{
"FlinkApplicationProperties": map[string]*string{
"inputStreamName": jsii.String("my-input-kinesis-stream"),
"outputStreamName": jsii.String("my-output-kinesis-stream"),
},
},
// ...
Runtime: flink.Runtime_FLINK_2_2(),
Code: flink.ApplicationCode_FromBucket(bucket, jsii.String("my-app.jar")),
})
Flink applications also have specific configuration for passing parameters when the Flink job starts. These include parameters for checkpointing, snapshotting, monitoring, and parallelism.
declare const bucket: s3.Bucket;
const flinkApp = new flink.Application(this, 'Application', {
code: flink.ApplicationCode.fromBucket(bucket, 'my-app.jar'),
runtime: flink.Runtime.FLINK_2_2,
checkpointingEnabled: true, // default is true
checkpointInterval: Duration.seconds(30), // default is 1 minute
minPauseBetweenCheckpoints: Duration.seconds(10), // default is 5 seconds
logLevel: flink.LogLevel.ERROR, // default is INFO
metricsLevel: flink.MetricsLevel.PARALLELISM, // default is APPLICATION
autoScalingEnabled: false, // default is true
parallelism: 32, // default is 1
parallelismPerKpu: 2, // default is 1
snapshotsEnabled: false, // default is true
logGroup: new logs.LogGroup(this, 'LogGroup'), // by default, a new LogGroup will be created
});
# bucket: s3.Bucket
flink_app = flink.Application(self, "Application",
code=flink.ApplicationCode.from_bucket(bucket, "my-app.jar"),
runtime=flink.Runtime.FLINK_2_2,
checkpointing_enabled=True, # default is true
checkpoint_interval=Duration.seconds(30), # default is 1 minute
min_pause_between_checkpoints=Duration.seconds(10), # default is 5 seconds
log_level=flink.LogLevel.ERROR, # default is INFO
metrics_level=flink.MetricsLevel.PARALLELISM, # default is APPLICATION
auto_scaling_enabled=False, # default is true
parallelism=32, # default is 1
parallelism_per_kpu=2, # default is 1
snapshots_enabled=False, # default is true
log_group=logs.LogGroup(self, "LogGroup")
)
Bucket bucket;
Application flinkApp = Application.Builder.create(this, "Application")
.code(ApplicationCode.fromBucket(bucket, "my-app.jar"))
.runtime(Runtime.FLINK_2_2)
.checkpointingEnabled(true) // default is true
.checkpointInterval(Duration.seconds(30)) // default is 1 minute
.minPauseBetweenCheckpoints(Duration.seconds(10)) // default is 5 seconds
.logLevel(LogLevel.ERROR) // default is INFO
.metricsLevel(MetricsLevel.PARALLELISM) // default is APPLICATION
.autoScalingEnabled(false) // default is true
.parallelism(32) // default is 1
.parallelismPerKpu(2) // default is 1
.snapshotsEnabled(false) // default is true
.logGroup(new LogGroup(this, "LogGroup"))
.build();
Bucket bucket;
var flinkApp = new Application(this, "Application", new ApplicationProps {
Code = ApplicationCode.FromBucket(bucket, "my-app.jar"),
Runtime = Runtime.FLINK_2_2,
CheckpointingEnabled = true, // default is true
CheckpointInterval = Duration.Seconds(30), // default is 1 minute
MinPauseBetweenCheckpoints = Duration.Seconds(10), // default is 5 seconds
LogLevel = LogLevel.ERROR, // default is INFO
MetricsLevel = MetricsLevel.PARALLELISM, // default is APPLICATION
AutoScalingEnabled = false, // default is true
Parallelism = 32, // default is 1
ParallelismPerKpu = 2, // default is 1
SnapshotsEnabled = false, // default is true
LogGroup = new LogGroup(this, "LogGroup")
});
var bucket Bucket
flinkApp := flink.NewApplication(this, jsii.String("Application"), &ApplicationProps{
Code: flink.ApplicationCode_FromBucket(bucket, jsii.String("my-app.jar")),
Runtime: flink.Runtime_FLINK_2_2(),
CheckpointingEnabled: jsii.Boolean(true),
// default is true
CheckpointInterval: awscdk.Duration_Seconds(jsii.Number(30)),
// default is 1 minute
MinPauseBetweenCheckpoints: awscdk.Duration_*Seconds(jsii.Number(10)),
// default is 5 seconds
LogLevel: flink.LogLevel_ERROR,
// default is INFO
MetricsLevel: flink.MetricsLevel_PARALLELISM,
// default is APPLICATION
AutoScalingEnabled: jsii.Boolean(false),
// default is true
Parallelism: jsii.Number(32),
// default is 1
ParallelismPerKpu: jsii.Number(2),
// default is 1
SnapshotsEnabled: jsii.Boolean(false),
// default is true
LogGroup: logs.NewLogGroup(this, jsii.String("LogGroup")),
})
Flink applications can optionally be deployed in a VPC:
declare const bucket: s3.Bucket;
declare const vpc: ec2.Vpc;
const flinkApp = new flink.Application(this, 'Application', {
code: flink.ApplicationCode.fromBucket(bucket, 'my-app.jar'),
runtime: flink.Runtime.FLINK_2_2,
vpc,
});
# bucket: s3.Bucket
# vpc: ec2.Vpc
flink_app = flink.Application(self, "Application",
code=flink.ApplicationCode.from_bucket(bucket, "my-app.jar"),
runtime=flink.Runtime.FLINK_2_2,
vpc=vpc
)
Bucket bucket;
Vpc vpc;
Application flinkApp = Application.Builder.create(this, "Application")
.code(ApplicationCode.fromBucket(bucket, "my-app.jar"))
.runtime(Runtime.FLINK_2_2)
.vpc(vpc)
.build();
Bucket bucket;
Vpc vpc;
var flinkApp = new Application(this, "Application", new ApplicationProps {
Code = ApplicationCode.FromBucket(bucket, "my-app.jar"),
Runtime = Runtime.FLINK_2_2,
Vpc = vpc
});
var bucket Bucket
var vpc Vpc
flinkApp := flink.NewApplication(this, jsii.String("Application"), &ApplicationProps{
Code: flink.ApplicationCode_FromBucket(bucket, jsii.String("my-app.jar")),
Runtime: flink.Runtime_FLINK_2_2(),
Vpc: Vpc,
})
Types
| Name | Kind | Summary |
|---|---|---|
Application | Construct (L2) | The L2 construct for Flink Kinesis Data Applications. |
ApplicationAttributes | Struct | Attributes used for importing an Application with Application.fromApplicationAttributes. |
ApplicationCode | Class | Code configuration providing the location to a Flink application JAR file. |
ApplicationCodeConfig | Struct | The return type of ApplicationCode.bind. This represents CloudFormation configuration and an s3 bucket holding the Flink application JAR file. |
ApplicationProps | Struct | Props for creating an Application construct. |
IApplication | Interface | An interface expressing the public properties on both an imported and CDK-created Flink application. |
LogLevel | Enum | Available log levels for Flink applications. |
MetricsLevel | Enum | Granularity of metrics sent to CloudWatch. |
PropertyGroups | Struct | Interface for building AWS::KinesisAnalyticsV2::Application PropertyGroup configuration. |
Runtime | Class | Available Flink runtimes for Kinesis Analytics. |