新闻详情

新闻详情

首页 / 资讯中心 / 详情

使用 Amazon CloudWatch 定时事件调用 AWS Lambda 函数:基于 AWS SDK for JavaScript v3 的完整实战指南

发布时间:2026/9/25 4:13:38来源:尧图网络
使用 Amazon CloudWatch 定时事件调用 AWS Lambda 函数:基于 AWS SDK for JavaScript v3 的完整实战指南
示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载本指南以仓库 javascriptv3/example_code/cross-services/lambda-scheduled-events 工作区为蓝本系统讲解如何基于 AWS SDK for JavaScript v3 构建一套由 Amazon CloudWatch 定时事件触发、自动扫描 DynamoDB 员工表并通过 Amazon SNS 发送工作周年纪念短信的 Lambda 应用。读者学完后将掌握 v3 客户端模块的依赖组织方式、Lambda 处理器编写、DynamoDB 批量写入与条件扫描、SNS 消息发布以及配套的 CloudFormation 资源编排与 webpack 打包构建流程。一、教程工作区概览一个跨服务定时任务示例该目录是 AWS 官方教程《使用 CloudWatch 定时事件调用 Lambda 函数》的可运行工作区。整个示例的业务场景非常直观企业将员工入职日期startDate保存在 DynamoDB 的Employees表中Lambda 函数每天定时被 CloudWatch 定时事件触发扫描当天恰逢工作周年纪念的员工记录并通过 Amazon SNS 向对应手机号发送祝贺短信。从源码结构看工作区按职责划分了清晰的目录src/mylamdbafunction.js核心 Lambda 处理器负责扫描 DynamoDB 并发布 SNS 短信src/helper-functions/populate-table.js向Employees表批量写入示例数据的辅助脚本src/helper-functions/lambda-function-setup.js调用 LambdaCreateFunction接口创建函数资源的辅助脚本src/libs/三个 v3 服务客户端工厂模块分别封装 DynamoDB、Lambda、SNS 的Client实例setup.yamlCloudFormation 模板一键创建 S3 桶、IAM 角色、DynamoDB 表package.json声明全部 SDK v3 依赖、第三方构建依赖与 npm 脚本。二、环境准备与依赖安装2.1 克隆仓库与安装依赖在开始前需要先把示例代码克隆到本地。依赖清单位于 package.json安装命令如下cd javascriptv3/example_code/cross-services/lambda-scheduled-events npm install如果使用 TypeScript 运行辅助脚本还需要全局安装ts-nodenpm install ts-node -g原教程文档中提到的npm install node -g属于占位性质的说明实际操作时以仓库 package.json 声明为准纯 JavaScript 环境可直接用 Node.js 运行。2.2 依赖模块逐一拆解本示例的依赖设计体现了 AWS SDK for JavaScript v3 的核心思想——按需按服务拆分为独立客户端模块而非像 v2 那样引入一个体积庞大的整体 SDK。仓库 package.json 的dependencies字段声明了以下 v3 服务模块依赖包对应 AWS 服务在本示例中的用途aws-sdk/client-dynamodbAmazon DynamoDB扫描员工表、批量写入示例数据aws-sdk/client-snsAmazon SNS向员工手机号发送周年祝福短信aws-sdk/client-lambdaAWS Lambda通过 API 创建 Lambda 函数aws-sdk/client-iamAWS IAM获取角色 ARN 等身份信息aws-sdk/client-cloudformationAWS CloudFormation查看/等待堆栈创建完成aws-sdk/client-api-gatewayAmazon API Gateway教程中配套的 API 调用场景aws-sdk/client-cognito-identityAmazon Cognito浏览器端身份凭证获取aws-sdk/credential-provider-cognito-identityAmazon Cognito基于 Cognito 身份的凭证提供器此外devDependencies中包含了webpack与webpack-cli版本要求 ^4.42.0 / ^3.3.11用于将 Lambda 函数源码及其依赖打包成单个可部署的index.js这正是 package.json 中build脚本的用途npm run build该脚本等价于执行webpack mylamdbafunction.js --mode development --target node --devtool false --output-library-target umd -o index.js其中--target node告诉 webpack 面向 Node.js 运行时打包--output-library-target umd则保证产物能以 CommonJS 方式被 Lambda 运行时正确加载Lambda 的index.handler入口约定要求模块以 CommonJS 导出handler。三、核心实现解析Lambda 处理器 mylamdbafunction.jsLambda 函数的业务逻辑全部集中在 src/mylamdbafunction.js它是整个跨服务流程的心脏。3.1 计算今天的日期函数一启动就先计算当天的日期字符串用于与员工startDate比对const today new Date(); const dd String(today.getDate()).padStart(2, 0); const mm String(today.getMonth() 1).padStart(2, 0); //January is 0! const yyyy today.getFullYear(); const date ${yyyy}-${mm}-${dd};这里有两个值得注意的细节一是getMonth()返回值从 0 开始1 月为 0因此必须加 1二是最终格式为YYYY-MM-DD与 populate-table.js 中写入的数据如2020-6-17比对时依赖一致的格式约定读者在实际改造时应统一两处的日期格式。3.2 构造 DynamoDB 扫描参数函数使用ScanCommand对Employees表执行条件扫描const params { FilterExpression: startDate :topic, ExpressionAttributeValues: { :topic: { S: date }, }, ProjectionExpression: firstName, phone, TableName: Employees, };关键参数说明FilterExpression只返回startDate等于今天的条目避免把整张表的数据都拉回客户端ExpressionAttributeValues以:topic占位符绑定当天日期属性值按 DynamoDB 类型封装为{ S: date }字符串类型ProjectionExpression只投影firstName与phone两个属性显著降低网络与内存开销TableName指向Employees表该表由 setup.yaml 中的 CloudFormation 资源table8235A42E创建表名固定为Employees。3.3 扫描结果与 SNS 短信发送处理器主体先扫描表再遍历命中项逐条发送短信exports.handler async () { async function sendText(textParams) { try { await snsClient.send(new PublishCommand(textParams)); console.log(Message sent); } catch (err) { console.log(Error, message not sent , err); } } try { const data await dynamoClient.send(new ScanCommand(params)); for (const element of data.Items) { const textParams { PhoneNumber: element.phone.N, Message: Hi ${element.firstName.S}; congratulations on your work anniversary!, }; sendText(textParams); } } catch (err) { console.log(Error, could not scan table , err); } };PublishCommand的PhoneNumber直接使用 DynamoDB 返回的phone.N数字类型Message则拼接firstName.S生成个性化短信文案。这里体现了 v3 的统一调用模型所有服务调用都遵循client.send(new Command(params))这一模式Command类是命令模式在 SDK 层面的标准化体现。3.4 客户端工厂libs 目录的三件套三个客户端模块结构完全一致只替换服务类与区域配置例如 dynamoClient.jsconst { DynamoDBClient } require(aws-sdk/client-dynamodb); const REGION REGION; //e.g. us-east-1 const dynamoClient new DynamoDBClient({ region: REGION }); module.exports { dynamoClient };与之对应的还有 lambdaClient.js封装LambdaClient和 snsClient.js封装SNSClient。将客户端实例集中管理的好处是区域等公共配置只改一处全项目复用这也符合 v3 推荐的单例客户端最佳实践避免在每次请求时重复创建连接。四、基础设施一键编排setup.yaml 详解在部署 Lambda 函数之前需要先准备 S3 桶、IAM 执行角色与 DynamoDB 表。仓库提供了完整的 CloudFormation 模板 setup.yaml从Metadata中的aws:cdk:path可以推断该模板由 AWS CDK 合成导出可以直接通过 CLI 部署aws cloudformation create-stack \ --stack-name STACK_NAME \ --template-body file://setup.yaml \ --capabilities CAPABILITY_IAM这条命令与 package.json 中的build-cdk脚本等价。4.1 DynamoDB 表table8235A42E模板创建的Employees表采用组合键设计分区键HASHid类型N排序键RANGEfirstName类型S预置吞吐读 10 RCU、写 10 WCU。同时模板还创建了一个名为FirstNameIndex的全局二级索引GSI其投影方式为ProjectionType: ALL预置读 5 RCU、写 10 WCU。该索引的存在说明教程后续可能涉及按firstName直接查询的场景。4.2 S3 桶mybucket160F8132模板创建一个 S3 桶用于存放 Lambda 函数代码包.zip并配置了PublicAccessBlockConfigurationBlockPublicAcls: true、IgnorePublicAcls: true禁止通过 ACL 公开BlockPublicPolicy: false、RestrictPublicBuckets: false允许通过桶策略控制访问保持灵活性。桶的DeletionPolicy: Delete意味着堆栈删除时资源一并删除。4.3 IAM 执行角色myLambdaRole8B777879角色myLambdaRole8B777879信任 Lambda 服务Service: lambda.amazonaws.com的sts:AssumeRole其关联的内联策略myLambdaRoleDefaultPolicyF1CBE162赋予函数以下权限类别CloudWatch Logslogs:CreateLogGroup、logs:PutLogEvents等用于写入函数运行日志SNSsns:*全部权限覆盖Publish、Subscribe、CreateTopic等保证短信发送与主题管理DynamoDB 与 DAXdynamodb:*、dax:*以及全套application-autoscaling:*权限支撑表的扫描与自动扩缩容Lambda 管理lambda:CreateFunction、lambda:CreateEventSourceMapping、lambda:DeleteFunction等允许教程辅助脚本通过 API 创建/管理函数S3 对象读写s3:GetObject*、s3:PutObject*等仅限定在本模板创建的桶 ARN 及其/*子资源范围内CloudWatch 监控cloudwatch:*指标与告警相关权限IAM 有限操作iam:GetRole、iam:ListRoles、iam:PassRole限定传给 application-autoscaling / dax与iam:CreateServiceLinkedRole限定 DynamoDB 复制、DAX、contributor insights 等服务。从这些权限配置可以看出该角色不仅服务 Lambda 本身还允许教程代码通过 SDK 以编程方式创建 Lambda 函数与事件源映射属于面向教学场景的宽口径角色实际生产环境中建议按最小权限原则收敛。模板最后通过Outputs导出TableName、Bucketname、IAMrole三个堆栈输出值供后续脚本读取资源引用。五、辅助脚本建表数据填充与函数部署5.1 填充示例数据populate-table.jspopulate-table.js 使用BatchWriteItemCommand一次批量写入 3 条员工记录每条记录包含id数字、firstName字符串、phone数字和startDate字符串。运行方式node src/helper-functions/populate-table.js # 若以 TypeScript 运行ts-node src/helper-functions/populate-table.ts注意示例数据中的phone是 15 位数字字符串如155555555555653startDate与 Lambda 函数中的日期格式需保持一致。5.2 以 API 方式创建 Lambda 函数lambda-function-setup.jslambda-function-setup.js 演示了如何用 v3 的CreateFunctionCommand以编程方式创建函数const params { Code: { S3Bucket: BUCKET_NAME, // 存放代码 zip 的桶 S3Key: ZIP_FILE_NAME, // zip 对象键 }, FunctionName: LAMBDA_FUNCTION_NAME, Handler: index.handler, // 指向 webpack 产物 index.js 的 handler 导出 Role: IAM_ROLE_ARN, // e.g. arn:aws:iam::650138640062:role/v3-lambda-tutorial-lambda-role Runtime: nodejs12.x, Description: Scans a DynamoDB table of employee details and using Amazon Simple Notification Service (Amazon SNS) to send employees an email on the anniversary of their start-date., };关键要点Code.S3Bucket/S3Key指向第一步用 webpack 打包后上传到 S3 的index.js压缩为 zip的位置Handler必须写index.handler与 package.json 中main字段与build产物的模块导出结构严格对应Role使用上一节 setup.yaml 输出的 IAM 角色 ARN源码注释中标注的Runtime: nodejs12.x是教程编写时的运行版本读者在当今环境中应替换为当前受支持的 Node.js 运行时如nodejs18.x、nodejs20.xnodejs12.x已不在官方支持周期内。六、完整运行链路从零到定时任务综合以上组件整个示例的部署链路可以归纳为五步准备代码与构建克隆仓库后进入javascriptv3/example_code/cross-services/lambda-scheduled-events执行npm install安装全部 v3 依赖修改 src/libs 三个客户端文件中的REGION占位符为实际区域创建基础设施执行npm run build-cdk或直接运行aws cloudformation create-stack命令部署 setup.yaml等待堆栈创建完成从堆栈输出获得表名、桶名与 IAM 角色 ARN填充数据运行 populate-table.js向Employees表批量写入含startDate的员工数据打包并创建函数执行npm run build生成index.js将其压缩为 zip 上传到 S3然后修改 lambda-function-setup.js 中的桶名、对象键、函数名与角色 ARN 后运行完成函数创建配置定时触发在 Amazon CloudWatch或 EventBridge中为该函数创建定时规则cron 或固定频率表达式使函数按设定的时间周期被调用函数每次被触发时执行扫描→发短信流程。七、对本示例的进一步思考从 mylamdbafunction.js 的实现可以看到本示例刻意选择ScanCommand全表扫描加FilterExpression过滤的方式这在数据量小的教学场景下简单直观当表数据规模增长后应改为基于startDate的 GSI 查询或引入QueryCommand避免每次定时触发产生全表扫描的读写成本。同时示例将sendText定义在exports.handler内部并直接await未等待 Promise 数组在函数并发批量命中时可能存在潜在的未处理 Promise读者可自行改为Promise.all聚合发送以提升健壮性。该工作区完整呈现了 AWS SDK for JavaScript v3 的典型工程形态服务级客户端模块 命令对象调用模型 webpack 打包 CloudFormation 编排可作为学习 v3 跨服务集成、以及把任何定时扫描数据库并通知用户类业务迁移到 Serverless 架构的参考蓝本。赞分享示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载相关推荐AWS SDK for JavaScript (v3) 操作 Amazon CloudWatch 完整实战指南AWS SDK for JavaScript v3 操作 Amazon CloudWatch 完整实战指南 导读 本文基于 AWS 官方代码示例仓库aws d示例工程教程后端aws-doc-sdk-examples 实战使用 Amazon API Gateway 调用 AWS Lambda 函数的 JavaScriptSDK v3跨服务示例解析aws doc sdk examples 实战使用 Amazon API Gateway 调用 AWS Lambda 函数的 JavaScriptSDK v示例工程教程后端使用 AWS SDK for JavaScript (v3) 操作 Amazon Bedrock Agents完整实战指南使用 AWS SDK for JavaScript v3 操作 Amazon Bedrock Agents完整实战指南 本指南基于开源仓库 aws doc s示例工程教程后端上一篇终极指南如何在Windows上使用com0com虚拟串口驱动实现零成本串口通信下一篇虚拟串口终极解决方案com0com如何彻底改变Windows串口调试工作流创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

TypeDoc @include 与 @includeCode 标签实战指南:在文档注释中嵌入外部文件、代码区域与行号片段 2026/9/25 4:54:30

TypeDoc @include 与 @includeCode 标签实战指南:在文档注释中嵌入外部文件、代码区域与行号片段

开发工具文档 【免费下载链接】typedoc Documentation generator for TypeScript projects. 项目地址: https://gitcode.com/gh_mirrors/ty/typedoc 点击查看 免费下载 TypeDoc 的 {include} 标签族允许你在 TSDoc 文档注释或外部 Markdown 文档中直接嵌入仓库里的…

阅读更多 →
LTSPICE参数变量与参数扫描实操指南:批量仿真高效探索设计空间 2026/9/25 4:54:24

LTSPICE参数变量与参数扫描实操指南:批量仿真高效探索设计空间

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
机械仪表与自动化会议论文投稿指南:EI/Scopus检索与见刊策略 2026/9/25 4:54:24

机械仪表与自动化会议论文投稿指南:EI/Scopus检索与见刊策略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
TRON钱包选型指南:TronLink、Ledger、Bitget钱包深度对比 2026/9/25 4:54:24

TRON钱包选型指南:TronLink、Ledger、Bitget钱包深度对比

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
拯救者Y9000P软件卡顿根因与精准治理方案 2026/9/25 4:54:24

拯救者Y9000P软件卡顿根因与精准治理方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
如何用 Ruffle 浏览器扩展在浏览器里重新播放 Flash:新手入门指南 2026/9/25 4:54:23

如何用 Ruffle 浏览器扩展在浏览器里重新播放 Flash:新手入门指南

如何用 Ruffle 浏览器扩展在浏览器里重新播放 Flash:新手入门指南 【免费下载链接】ruffle A Flash Player emulator written in Rust 项目地址: https://gitcode.com/GitHub_Trending/ru/ruffle 打开老页面只剩一块灰底,还提示“需要安装 Flash”…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉