亚马逊事件Bridge 调度器目标构建库
此API 可能会发出警告 。 后向兼容性没有保证 .
所有构造已移入 aws-cdk-lib/aws-scheduler-targets。 。 。 .
亚马逊事件Bridge 调度器 是一个来自亚马逊事件Bridge的特性 用于创建、运行和管理预定任务。 使用 EventBridge 调度器,您可以在不提供或管理基础基础设施的情况下,为各种AWS服务安排数百万个一次性或重复的任务.
此库包含 Amazon EventBridge 调度器的集成类 支持的AWS服务数量.
支持下列目标:
targets.LambdaInvoke数字 : 启动 AWS Lambda 函数targets.StepFunctionsStartExecution数字 : 启动 AWS 步函数targets.CodeBuildStartBuild数字 : 启动代码构建任务targets.SqsSendMessage数字 : 向 Amazon SQS 队列发送信件targets.SnsPublish数字 : 向 Amazon SNS 专题发布消息targets.EventBridgePutEvents数字 : 将事件放在事件桥上targets.InspectorStartAssessmentRun数字 : 启动亚马逊检查员评估targets.KinesisStreamPutRecord数字 : 给亚马逊 Kinesis 数据流记录targets.FirehosePutRecord数字 : 给亚马逊数据放唱片targets.CodePipelineStartPipelineExecution数字 : 启动代码Pipeline执行targets.SageMakerStartPipelineExecution数字 : 启动 SageMaker 管道执行targets.EcsRunTask数字 : 开始一项新的ECS任务targets.Universal数字 : 启动更宽的 AWS API
启动 Lambda 函数
使用 LambdaInvoke 目标以引用 lambda 函数.
下面的代码片段创建了以 Lambda 函数作为目标的事件规则 每隔一小时由 EventBridge 调度员用定制的有效载荷打电话 您可以选择附加 死信队列。 。 。 .
import * as lambda from 'aws-cdk-lib/aws-lambda';
const fn = new lambda.Function(this, 'MyFunc', {
runtime: lambda.Runtime.NODEJS_LATEST,
handler: 'index.handler',
code: lambda.Code.fromInline(`exports.handler = handler.toString()`),
});
const dlq = new sqs.Queue(this, "DLQ", {
queueName: 'MyDLQ',
});
const target = new targets.LambdaInvoke(fn, {
deadLetterQueue: dlq,
maxEventAge: Duration.minutes(1),
retryAttempts: 3,
input: ScheduleTargetInput.fromObject({
'payload': 'useful'
}),
});
const schedule = new Schedule(this, 'Schedule', {
schedule: ScheduleExpression.rate(Duration.hours(1)),
target
});
启动 AWS 步函数
使用 StepFunctionsStartExecution 目标在步进函数上启动新的执行.
下面的代码片段创建了以 Step 函数为目标的事件规则 每隔一小时由 EventBridge 调度员用定制的有效载荷打电话.
import * as sfn from 'aws-cdk-lib/aws-stepfunctions';
import * as tasks from 'aws-cdk-lib/aws-stepfunctions-tasks';
const payload = {
Name: "MyParameter",
Value: '🌥️',
};
const putParameterStep = new tasks.CallAwsService(this, 'PutParameter', {
service: 'ssm',
action: 'putParameter',
iamResources: ['*'],
parameters: {
"Name.$": '$.Name',
"Value.$": '$.Value',
Type: 'String',
Overwrite: true,
},
});
const stateMachine = new sfn.StateMachine(this, 'StateMachine', {
definitionBody: sfn.DefinitionBody.fromChainable(putParameterStep)
});
new Schedule(this, 'Schedule', {
schedule: ScheduleExpression.rate(Duration.hours(1)),
target: new targets.StepFunctionsStartExecution(stateMachine, {
input: ScheduleTargetInput.fromObject(payload),
}),
});
启动代码构建任务
使用 CodeBuildStartBuild 目标是在代码构建项目上启动一个新的构建运行.
下面的代码片段创建了一个以代码构建项目为目标的事件规则,即 由事件Bridge调度员每小时打电话.
import * as codebuild from 'aws-cdk-lib/aws-codebuild';
declare const project: codebuild.Project;
new Schedule(this, 'Schedule', {
schedule: ScheduleExpression.rate(Duration.minutes(60)),
target: new targets.CodeBuildStartBuild(project),
});
向 SQS 队列发送信件
使用 SqsSendMessage 目标向 SQS 队列发送消息.
下面的代码片段创建以 SQS 队列为目标的事件规则 每隔一小时由 EventBridge 调度员用定制的有效载荷打电话.
包含 messageGroupId 当目标为FIFO队列时使用。 如果您指定
a FIFO 队列作为目标,队列必须启用基于内容的分解.
const payload = 'test';
const messageGroupId = 'id';
const queue = new sqs.Queue(this, 'MyQueue', {
fifo: true,
contentBasedDeduplication: true,
});
const target = new targets.SqsSendMessage(queue, {
input: ScheduleTargetInput.fromText(payload),
messageGroupId,
});
new Schedule(this, 'Schedule', {
schedule: ScheduleExpression.rate(Duration.minutes(1)),
target
});
向 Amazon SNS 专题发布消息
使用 SnsPublish 目标向亚马逊 SNS 专题发布消息.
下面的代码片段创建了以亚马逊 SNS 为目标的事件规则. 它每小时由亚马逊事件Bridge调度器使用自定义的有效载荷命名.
import * as sns from 'aws-cdk-lib/aws-sns';
const topic = new sns.Topic(this, 'Topic');
const payload = {
message: 'Hello scheduler!',
};
const target = new targets.SnsPublish(topic, {
input: ScheduleTargetInput.fromObject(payload),
});
new Schedule(this, 'Schedule', {
schedule: ScheduleExpression.rate(Duration.hours(1)),
target,
});
将事件发送到 EventBridge 事件总线
使用 EventBridgePutEvents 目标将事件发送到 EventBridge 事件总线.
下面的代码片段以 EventBridge 事件总线为目标创建事件规则 每小时由事件Bridge调度员用自定义事件有效载荷呼叫.
import * as events from 'aws-cdk-lib/aws-events';
const eventBus = new events.EventBus(this, 'EventBus', {
eventBusName: 'DomainEvents',
});
const eventEntry: targets.EventBridgePutEventsEntry = {
eventBus,
source: 'PetService',
detail: ScheduleTargetInput.fromObject({ Name: 'Fluffy' }),
detailType: '🐶',
};
new Schedule(this, 'Schedule', {
schedule: ScheduleExpression.rate(Duration.hours(1)),
target: new targets.EventBridgePutEvents(eventEntry),
});
启动亚马逊检查员评估
使用 InspectorStartAssessmentRun 目标开始对检查专员进行评估.
下面的代码片段创建了一个事件规则,其中有一个评估模板作为目标,即 由事件Bridge调度员每小时打电话.
import * as inspector from 'aws-cdk-lib/aws-inspector';
declare const cfnAssessmentTemplate: inspector.CfnAssessmentTemplate;
const assessmentTemplate = inspector.AssessmentTemplate.fromCfnAssessmentTemplate(this, 'MyAssessmentTemplate', cfnAssessmentTemplate);
new Schedule(this, 'Schedule', {
schedule: ScheduleExpression.rate(Duration.minutes(60)),
target: new targets.InspectorStartAssessmentRun(assessmentTemplate),
});
给亚马逊 Kinesis 数据流记录
使用 KinesisStreamPutRecord 目标给亚马逊Kinesis数据流记录.
下面的代码片段创建以流为目标的事件规则 由事件Bridge调度员每小时打电话.
import * as kinesis from 'aws-cdk-lib/aws-kinesis';
const stream = new kinesis.Stream(this, 'MyStream');
new Schedule(this, 'Schedule', {
schedule: ScheduleExpression.rate(Duration.minutes(60)),
target: new targets.KinesisStreamPutRecord(stream, {
partitionKey: 'key',
}),
});
给亚马逊数据放唱片
使用 FirehosePutRecord 目标给亚马逊数据Firehose传送流录制.
下面的代码片段创建了以传送流为目标的事件规则 每隔一小时由 EventBridge 调度员用定制的有效载荷打电话.
import * as firehose from 'aws-cdk-lib/aws-kinesisfirehose';
declare const deliveryStream: firehose.IDeliveryStream;
const payload = {
Data: "record",
};
new Schedule(this, 'Schedule', {
schedule: ScheduleExpression.rate(Duration.minutes(60)),
target: new targets.FirehosePutRecord(deliveryStream, {
input: ScheduleTargetInput.fromObject(payload),
}),
});
启动代码Pipeline执行
使用 CodePipelineStartPipelineExecution 目标开始代码Pipeline管道的新执行.
下面的代码片段创建了一个事件规则,以代码Pipeline管道作为目标,即 由事件Bridge调度员每小时打电话.
import * as codepipeline from 'aws-cdk-lib/aws-codepipeline';
declare const pipeline: codepipeline.Pipeline;
new Schedule(this, 'Schedule', {
schedule: ScheduleExpression.rate(Duration.minutes(60)),
target: new targets.CodePipelineStartPipelineExecution(pipeline),
});
启动 SageMaker 管道执行
使用 SageMakerStartPipelineExecution 目标为启动 SageMaker 管道的新执行.
下面的代码片段创建了以 SageMaker 管道为目标的事件规则,即 由事件Bridge调度员每小时打电话.
import * as sagemaker from 'aws-cdk-lib/aws-sagemaker';
declare const pipeline: sagemaker.IPipeline;
new Schedule(this, 'Schedule', {
schedule: ScheduleExpression.rate(Duration.minutes(60)),
target: new targets.SageMakerStartPipelineExecution(pipeline, {
pipelineParameterList: [{
name: 'parameter-name',
value: 'parameter-value',
}],
}),
});
安排一个ECS任务运行
使用 EcsRunTask 目标为为集群运行的ECS任务.
下面的代码片段创建了一个事件规则,以远门任务定义和集群作为目标,由 EventBridge 调度器每小时调用.
import * as ecs from 'aws-cdk-lib/aws-ecs';
declare const cluster: ecs.ICluster;
declare const taskDefinition: ecs.FargateTaskDefinition;
new Schedule(this, 'Schedule', {
schedule: ScheduleExpression.rate(cdk.Duration.minutes(60)),
target: new targets.EcsRunFargateTask(cluster, {
taskDefinition,
}),
});
下面的代码片段创建了一个事件规则,以EC2任务定义并集群作为目标,由 EventBridge 调度器每小时调用.
import * as ecs from 'aws-cdk-lib/aws-ecs';
declare const cluster: ecs.ICluster;
declare const taskDefinition: ecs.Ec2TaskDefinition;
new Schedule(this, 'Schedule', {
schedule: ScheduleExpression.rate(cdk.Duration.minutes(60)),
target: new targets.EcsRunEc2Task(cluster, {
taskDefinition,
}),
});
启动更宽的 AWS API
使用 Universal 目标引用 AWS API。 见 https://docs.aws.amazon.com/cheduler/latest/UserGuide/managing-targets-universal.html 互联网档案馆的存檔,存档日期2013-12-12
下面的代码片段以 AWS API 作为目标创建事件规则 每天午夜由事件Bridge调度员打电话来.
new Schedule(this, 'Schedule', {
schedule: ScheduleExpression.cron({
minute: '0',
hour: '0',
}),
target: new targets.Universal({
service: 'rds',
action: 'stopDBCluster',
input: ScheduleTargetInput.fromObject({
DbClusterIdentifier: 'my-db',
}),
}),
});
这个 service 必须是小写和 action 一定是在骆驼场.
默认情况下,从API调用中提取出调度器的IAM政策. 政策中的行动是使用下列方法构建的: service 财务报告和审定财务报表 action 道具 (英语).
重新利用上述例子,将采取行动 rds:stopDBCluster。请注意,并非所有的IAM行动都遵循同样的模式。 在这种情况下,请使用
policyStatements 覆盖策略的道具 :
new Schedule(this, 'Schedule', {
schedule: ScheduleExpression.rate(Duration.minutes(60)),
target: new targets.Universal({
service: 'sqs',
action: 'sendMessage',
policyStatements: [
new iam.PolicyStatement({
actions: ['sqs:SendMessage'],
resources: ['arn:aws:sqs:us-east-1:123456789012:my_queue'],
}),
new iam.PolicyStatement({
actions: ['kms:Decrypt', 'kms:GenerateDataKey*'],
resources: ['arn:aws:kms:us-east-1:123456789012:key/0987dcba-09fe-87dc-65ba-ab0987654321'],
}),
],
}),
});
注:默认策略用途
*在资源字段中,由于CDK没有自动发现所需资源许可的直线前进方式. 建议你们把实地缩小到具体的资源范围内,以便有更好的安全态势.