亚马逊事件Bridge 构造库
AWS CDK v1在2023-06-01上达到了支持结束. 此软件包不再更新,用户应该迁移到 AWS CDK v2.
关于如何移徙的更多信息,请参见: 移动到 AWS CDK v2 指南。 。 。 .
Amazon EventBridge提供近实时的系统事件流 描述AWS资源的变化. 例如,一个 AWS 代码Pipeline 发送 状态 变动 当管道改变状态时.
- 活动: 一个事件表示您的 AWS 环境有变化 。 AWS 资源 可以在状态变化时生成事件。 例如,亚马逊EC2 当 EC2 实例状态从待决状态变为 运行中,而 Amazon EC2 自动缩放在启动时生成事件或 终止实例。 AWS CloudTrail 发布事件时会给API打电话. 您可以生成自定义的应用程序关卡事件并将其发布到 事件布莱奇。 您也可以设置在 : a 定期计算。 关于生成事件的服务清单和样本 每个服务的事件,见 事件桥事件实例 支助 服务。 。 。 .
- 目标: 一个目标进程事件。 目标可包括亚马逊EC2 实例、 AWS Lambda 函数、 Kinesis 流、 Amazon ECS 任务、 Step 函数状态机器 亚马逊 SNS 主题 亚马逊 SQS 队列 亚马逊 Cloud Watch Log Groups 和内置 目标。 一个目标以JSON格式接收事件.
- 规则: 一条规则,将即将到来的事件匹配,并将它们引导到目标 处理。 一条规则可以通向多个目标,所有目标都是 平行处理。 规则不按特定顺序处理。 这个 使一个组织的不同部分能够寻找和处理事件 这是他们感兴趣的。 规则可以自定义 JSON 发送到 目标,仅通过某些部分或用常数覆盖.
- 事件说明: 活动总线可以从自定义应用程序接收事件 也可以从AWS SaaS合作伙伴创建的应用程序和服务接收事件. 见 创建事件总线。 。 。 .
规则
这个 Rule 构造定义用于监视
基于一个 事件
模式
并援引 事件目标 当图案匹配到触发时
活动。 事件目标是指执行 IRuleTarget 接口.
通常你会使用其中一种 source.onXxx(name[, target[, options]]) -> Rule 关于事件源的方法,用于定义与
具体的活动。 您可以通过道具瞄准目标, 或者使用
rule.addTarget。 。 。 .
例如,定义一个规则,该规则将在一个 承诺被推到代码承诺存储器的"主"分支:
declare const repo: codecommit.Repository;
declare const project: codebuild.Project;
const onCommitRule = repo.onCommit('OnCommit', {
target: new targets.CodeBuildProject(project),
branches: ['master']
});
您可以添加附加目标, 可选 投入
变压器
使用 eventRule.addTarget(target[, input])。例如,我们可以添加一个 SNS
用于格式化可读消息的主题目标.
例如,这增加了一个SNS主题作为目标:
declare const onCommitRule: events.Rule;
declare const topic: sns.Topic;
onCommitRule.addTarget(new targets.SnsTopic(topic, {
message: events.RuleTargetInput.fromText(
`A commit was pushed to the repository ${codecommit.ReferenceEvent.repositoryName} on branch ${codecommit.ReferenceEvent.referenceName}`
)
}));
或使用对象 :
declare const onCommitRule: events.Rule;
declare const topic: sns.Topic;
onCommitRule.addTarget(new targets.SnsTopic(topic, {
message: events.RuleTargetInput.fromObject(
{
DataType: `custom_${events.EventField.fromPath('$.detail-type')}`
}
)
}));
时间安排
您可以配置规则以运行在时间表( cron 或 rate) 上 . 收费标准必须在分钟、小时或天内规定.
以下例子每天凌晨4点执行一个任务:
import { Rule, Schedule } from '@aws-cdk/aws-events';
import { EcsTask } from '@aws-cdk/aws-events-targets';
import { Cluster, TaskDefinition } from '@aws-cdk/aws-ecs';
import { Role } from '@aws-cdk/aws-iam';
declare const cluster: Cluster;
declare const taskDefinition: TaskDefinition;
declare const role: Role;
const ecsTaskTarget = new EcsTask({ cluster, taskDefinition, role });
new Rule(this, 'ScheduleRule', {
schedule: Schedule.cron({ minute: '0', hour: '4' }),
targets: [ecsTaskTarget],
});
如果您想要指定 Fargate 平台版本, 请设定 platformVersion 在 EcsTask 的道具中,例如:
declare const cluster: ecs.Cluster;
declare const taskDefinition: ecs.TaskDefinition;
declare const role: iam.Role;
const platformVersion = ecs.FargatePlatformVersion.VERSION1_4;
const ecsTaskTarget = new targets.EcsTask({ cluster, taskDefinition, role, platformVersion });
事件目标
这个 @aws-cdk/aws-events-targets 模块包括执行 IRuleTarget
用于各种 AWS 服务的接口.
支持下列目标:
targets.CodeBuildProject: 启动 AWS 代码构建targets.CodePipeline: 启动 AWS 代码管道执行targets.EcsTask: 在 Amazon ECS 集群上启动任务targets.LambdaFunction: 启动 AWS Lambda 函数targets.SnsTopic: 发布到 SNS 主题targets.SqsQueue: 向 Amazon SQS 队列发送消息targets.SfnStateMachine: 触发 AWS 步骤函数状态机targets.BatchJob: 队列 AWS 批次任务targets.AwsApi: 给 AWS API 打电话targets.ApiGateway: 启动 AWS API 网关targets.ApiDestination: 给外部目的地打电话
跨账户和跨区域目标
可以将事件源头和一个目标分别放在单独的AWS账户和区域内:
import { App, Stack } from '@aws-cdk/core';
import * as codebuild from '@aws-cdk/aws-codebuild';
import * as codecommit from '@aws-cdk/aws-codecommit';
import * as targets from '@aws-cdk/aws-events-targets';
const app = new App();
const account1 = '11111111111';
const account2 = '22222222222';
const stack1 = new Stack(app, 'Stack1', { env: { account: account1, region: 'us-west-1' } });
const repo = new codecommit.Repository(stack1, 'Repository', {
repositoryName: 'myrepository',
});
const stack2 = new Stack(app, 'Stack2', { env: { account: account2, region: 'us-east-1' } });
const project = new codebuild.Project(stack2, 'Project', {
// ...
});
repo.onCommit('OnCommit', {
target: new targets.CodeBuildProject(project),
});
在这种情况下,丹麦中央银行将把两个帐户合并起来:
- 它会在源堆栈中生成一条规则, 将目标账户的事件总线作为目标
- 它将在目标堆栈中生成一个规则, 并附带提供的目标
- 它会生成一个单独的堆栈, 允许源账户发布事件 到指定区域目标账户的事件总线, 并确保在源文件堆栈之前部署
更多信息,请参见 AWS 关于交叉账户事件的文件。 。 。 .
存档
可以将发送到活动总线的全部或部分事件存档. 然后有可能 重放这些事件。 。 。 .
const bus = new events.EventBus(this, 'bus', {
eventBusName: 'MyCustomEventBus'
});
bus.archive('MyArchive', {
archiveName: 'MyCustomEventBusArchive',
description: 'MyCustomerEventBus Archive',
eventPattern: {
account: [Stack.of(this).account],
},
retention: Duration.days(365),
});
授予已存在的事件Bus PutEvents
要将已有的事件Bus导入您的 CDK 应用程序, 请使用 EventBus.fromEventBusArn, (中文(简体) ), EventBus.fromEventBusAttributes
或者说 EventBus.fromEventBusName 工厂方法.
那么,你可以使用这个 grantPutEventsTo 发放方法 event:PutEvents 到活动Bus.
declare const lambdaFunction: lambda.Function;
const eventBus = events.EventBus.fromEventBusArn(this, 'ImportedEventBus', 'arn:aws:events:us-east-1:111111111:event-bus/my-event-bus');
// now you can just call methods on the eventbus
eventBus.grantPutEventsTo(lambdaFunction);