aws lambda rust的sdk和自定义运行时
rust的aws sdk
参考资料
- https://docs.aws.amazon.com/sdk-for-rust/latest/dg/getting-started.html
- https://awslabs.github.io/aws-sdk-rust/
- https://github.com/awslabs/aws-sdk-rust
- https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/rust_dev_preview
rus sdk获取凭证的顺序
- Environment variables:
AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY, andAWS_REGION - The default credentials files located in
~/.aws/configand~/.aws/credentials(location can vary per platform) - Web Identity Token credentials from the environment or container (including EKS)
- ECS Container Credentials (IAM roles for tasks)
- EC2 Instance Metadata Service (IAM Roles attached to instance)
以下是示例的列出s3桶代码
// Cargo.toml
[package]
name = "rusttour"
version = "0.1.0"
edition = "2021"[dependencies]
aws-config = "0.54.1"
aws-sdk-s3 = "0.24.0"
structopt = "0.3.26"
tokio = { version = "1.25.0", features = ["full"] }
tracing-subscriber = "0.3.16"// main.rs
use aws_config::meta::region::RegionProviderChain;
use aws_sdk_s3::{Client, Error, Region, PKG_VERSION};
use structopt::StructOpt;#[derive(Debug, StructOpt)]
struct Opt {#[structopt(short, long)]region: Option<String>,#[structopt(short, long)]bucket: String,#[structopt(short, long)]verbose: bool,
}
async fn show_objects(client: &Client, bucket: &str) -> Result<(), Error> {let resp = client.list_objects_v2().bucket(bucket).send().await?;for object in resp.contents().unwrap_or_default() {println!("{}", object.key().unwrap_or_default());}Ok(())
}
#[tokio::main]
async fn main() -> Result<(), Error> {tracing_subscriber::fmt::init();let Opt {region,bucket,verbose,} = Opt::from_args();let region_provider = RegionProviderChain::first_try(region.map(Region::new)).or_default_provider().or_else(Region::new("cn-north-1"));println!();if verbose {println!("S3 client version: {}", PKG_VERSION);println!("Region: {}",region_provider.region().await.unwrap().as_ref());println!("Bucket: {}", &bucket);println!();}let shared_config = aws_config::from_env().region(region_provider).load().await;let client = Client::new(&shared_config);show_objects(&client, &bucket).await
}
lambda的rust自定义运行时
lambda自定义运行时
lambda自定义运行时是一个比较复杂的话题
运行时是一个程序,调用函数时程序将运行 Lambda 函数的处理程序方法。可以采用可执行文件(名为
bootstrap)的形式, 将运行时包含在函数的部署程序包中
自定义运行时的入口点是一个名为 bootstrap 的可执行文件。引导文件可以是运行时,也可以调用创建运行时的另一个文件。运行时代码负责完成一些初始化任务。然后,它将在一个循环中处理调用事件直到被终止
(1)初始化任务
- 检索设置 – 读取环境变量以获取有关函数和环境的详细信息。
_HANDLER– 处理程序的位置(来自函数的配置)。标准格式为file.method,其中file是没有表达式的文件的名称,method是在文件中定义的方法或函数的名称。LAMBDA_TASK_ROOT– 包含函数代码的目录。AWS_LAMBDA_RUNTIME_API– 运行时 API 的主机和端口。- 初始化函数 – 加载处理程序文件并运行它包含的任何全局或静态代码。函数应该创建静态资源(如开发工具包客户端和数据库连接)一次,然后将它们重复用于多个调用。
- 处理错误 – 如果出现错误,请调用初始化错误 API 并立即退出。
(2)处理任务
- 获取事件 – 调用下一个调用 API 来获取下一个事件。响应正文包含事件数据。响应标头包含请求 ID 和其他信息。
- 传播跟踪标头 – 从 API 响应中的
Lambda-Runtime-Trace-Id标头获取 X-Ray 跟踪标头。使用相同的值在本地设置_X_AMZN_TRACE_ID环境变量。X-Ray SDK 使用此值在服务之间连接追踪数据。- 创建上下文对象 – 使用来自 API 响应中的环境变量和标头的上下文信息创建一个对象。
- 调用函数处理程序 – 将事件和上下文对象传递到处理程序。
- 处理响应 – 调用调用响应 API 以发布来自处理程序的响应。
- 处理错误 – 如果出现错误,请调用调用错误 API。
- 清理 – 释放未使用的资源,将数据发送到其他服务,或在获取下一个事件之前执行其他任务。
官方提供了一个自定义运行时的示例
Tutorial – Publishing a custom runtime
创建rust运行时函数
https://docs.aws.amazon.com/sdk-for-rust/latest/dg/lambda.html
https://github.com/awslabs/aws-lambda-rust-runtime#deployment
lambda托管环境目前没有对rust运行时的支持,因此无法直接创建。aws-lambda-rust-runtime仓库提供了构建自定义lambda运行时的方式。
使用cargo-lambda可以快速在本地创建rust运行时的lambda函数
https://www.cargo-lambda.info/guide/installation.html
pip3 install cargo-lambda
创建新的lambda项目
$ cargo lambda new myrustlambda
查看项目配置
$ cat Cargo.toml
[package]
name = "myrustlambda"
version = "0.1.0"
edition = "2021"[dependencies]
lambda_runtime = "0.7"
serde = "1.0.136"
tokio = { version = "1", features = ["macros"] }
tracing = { version = "0.1", features = ["log"] }
tracing-subscriber = { version = "0.3", default-features = false, features = ["fmt"] }
创建示例的lambda函数
use lambda_runtime::{service_fn, LambdaEvent, Error};
use serde_json::{json, Value};#[tokio::main]
async fn main() -> Result<(), Error> {let func = service_fn(func);lambda_runtime::run(func).await?;Ok(())
}async fn func(event: LambdaEvent<Value>) -> Result<Value, Error> {let (event, _context) = event.into_parts();let first_name = event["firstName"].as_str().unwrap_or("world");Ok(json!({ "message": format!("Hello, {}!", first_name) }))
}
构建函数,当然还可以交叉编译为其他平台,默认情况CargoLambda 将构建在 x86 _ 64架构上运行的函数
$ cargo lambda build --release
$ # cargo lambda build --release --arm64
$ #cargo lambda build --release --target aarch64-unknown-linux-gnu.2.17
构建过程中出现以下错误
warning: spurious network error (2 tries remaining): [28] Timeout was reached
修改下载源为tuna
# `$HOME/.cargo/config`
[source.crates-io]
registry = "https://github.com/rust-lang/crates.io-index"replace-with = 'tuna'[source.tuna]
registry = "https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index.git"[net]
git-fetch-with-cli=true
对于自定义运行时,AWS Lambda 在部署包 zip 中查找名为 bootstrap 的可执行文件。在 target/lambda 目录下找到函数的引导程序二进制文件
$ tree -L 3
├── Cargo.lock
├── Cargo.toml
├── src
│ └── main.rs
└── target├── CACHEDIR.TAG├── lambda│ └── myrustlambda //引导程序├── bootstrap.zip└── bootstrap├── release│ ├── build│ ├── deps│ ├── examples│ └── incremental└── x86_64-unknown-linux-gnu├── CACHEDIR.TAG└── release
部署函数
$ cargo lambda deploy \--iam-role arn:aws-cn:iam::037047667284:role/myLambdaRole

将函数打包为zip查看具体的内容,压缩包中只有一个bootstrap二进制文件
cargo lambda build --release --output-format zip
测试函数
$ aws lambda invoke \--cli-binary-format raw-in-base64-out \--function-name myrustlambda \--payload '{"command": "Say Hi!"}' \output.json
$ cat output.json
{"message":"Hello, world!"}
相关文章:
aws lambda rust的sdk和自定义运行时
rust的aws sdk 参考资料 https://docs.aws.amazon.com/sdk-for-rust/latest/dg/getting-started.htmlhttps://awslabs.github.io/aws-sdk-rust/https://github.com/awslabs/aws-sdk-rusthttps://github.com/awsdocs/aws-doc-sdk-examples/tree/main/rust_dev_preview rus sd…...
[安装之3] 笔记本加装固态和内存条教程(超详细)
由于笔记本是几年前买的了,当时是4000,现在用起来感到卡顿,启动、运行速度特别慢,就决定换个固态硬盘,加个内存条,再给笔记本续命几年。先说一下加固态硬盘SSD的好处:1.启动快 2.读取延迟小 3.写…...
极客时间左耳听风-高效学习
左耳听风——高效学习篇 P95 | 高效学习:端正学习态度 本人真实⬇️⬇️⬇️⬇️ “ 大部分人都认为自己爱学习,但是: 他们都是只有意识没有行动,他们是动力不足的人。 他们都不知道自己该学什么,他们缺乏方向和目标。…...
MSR寄存器访问
1.介绍 MSR是CPU的一组64位寄存器,每个MSR都有它的地址值(如下图所示),可以分别通过RDMSR 和WRMSR 两条指令进行读和写的操作。 如图中为8个P-state寄存器,地址分别为0xC001 0064 ~ 0xC001 006B,每个寄存…...
ArcGIS:模型构建器实现批量按掩膜提取影像
用研究区域的矢量数据来裁剪栅格数据集时,一般我们使用ArcGIS中的【按掩膜提取工具】。如果需要裁剪的栅格数据太多,处理起来非常的麻烦,虽然ArcGIS中有批处理的功能,但是还是需要手动选择输入输出数据。 如下图,鼠标…...
算法刷题打卡第94天: 找出给定方程的正整数解
找出给定方程的正整数解 难度:中等 给你一个函数 f(x, y) 和一个目标结果 z,函数公式未知,请你计算方程 f(x,y) z 所有可能的正整数 数对 x 和 y。满足条件的结果数对可以按任意顺序返回。 尽管函数的具体式子未知,但它是单调…...
浅析SAS协议(1):基本介绍
文章目录概述SAS协议发展历程SAS技术特性SAS设备拓扑SAS phySAS地址SAS设备类型SAS协议分层参考链接概述 SAS,全称Serial Attached SCSI,即串行连结SCSI,是一种采用了串行总线的高速互连技术。通过物理上使用串行总线连结,在链路…...
93.【Vue-细刷-02】
Vue-02(十六)、基本列表渲染 (v-for)1.使用v-for遍历数组2.使用v-for遍历对象3.使用v-for遍历字符串(十七)、列表过滤 (filter())1.⭐JS中Change属性的原生状态⭐2.使用watch监听实现3.const {xxx} this 在Vue的作用⭐⭐4.JS箭头函数参数的简写⭐5.使用computed进行计算实现(最…...
Allegro负片层不显示反盘的原因和解决办法
Allegro负片层不显示反盘的原因和解决办法 在用Allegro做PCB设计的时候,负片设计是较为常用的一种方式,有时会出现打开负片层却看不到反盘的情况,如下图 L2层是负片层 L2层仍然只能看到盘 如何才能看到反盘显示的效果,具体操作如下 首先确定L2层层叠里面设置的是负片...
ACM数论 裴蜀定理(贝祖定理)
一.内容定义 「裴蜀定理」,又称贝祖定理(Bzouts lemma)。是一个关于最大公约数的定理。其内容定义为:对于不全为零的任意整数 a 和 b,记二者的最大公约数为 g 即 gcd(a,b) g,则对于任意整数 x 和 y 都一定…...
基础篇—CSS Position(定位)解析
CSS Position(定位) position 属性指定了元素的定位类型。 position 属性的五个值: relativefixedabsolutesticky元素可以使用的顶部,底部,左侧和右侧属性定位。然而,这些属性无法工作,除非是先设定position属性。他们也有不同的工作方式,这取决于定位方法。 1、static…...
正则表达式与grep
基本正则表达式BRE集合 匹配字符匹配次数位置锚定 符号作用^尖角号,用于模式的最正常,如“^haha”,匹配以haha单词开头的行$美元符,用于模式的最右侧,如“haha$”,表示haha单词结尾的行^$组合符ÿ…...
开发必备的IDEA 插件!效率提升 50 倍!
日常开发中,面向百度编程的程序员,很多时候,你跟大佬级别的差距,可能不仅仅是知识面的差距,还有就是开发效率的差距。以下是我常用的几个IDEA插件,废话不多说,直接肝干货! 1. Codot…...
aws eks 集群访问ecr仓库拉取镜像的认证逻辑
本文主要讨论三个问题 ecr帮助程序在docker上如何配置eks集群访问ecr仓库的逻辑kubelet授权ecr的源码分析 ecr帮助程序 在docker环境下,可以通过在$HOME/.docker/config.json中指定凭证管理程序 docker login aws同样提供了证书助手,避免手动执行ecr认…...
Linux Socket Buffer介绍
一. 前言 Linux内核网络子系统的实现之所以灵活高效,主要是在于管理网络数据包的缓冲器-socket buffer设计得高效合理。在Linux网络子系统中,socket buffer是一个关键的数据结构,它代表一个数据包在内核中处理的整个生命周期。 二. Socket Bu…...
ACL与NAT
ACL---访问控制列表,是一种策略控制工具 功能:1.定义感兴趣流量(数据层面 ) 2.定义感兴趣路由(控制层面) ACL 条目表项组成: 编号规则:步数或者跳数默认值为5,…...
使用gdb来debug程序并查找Segmentation fault原因
GDB 调试前言GDB基础用法1.启动及退出调试2.设置参数3.执行程序4.流程控制5.设置断点6.输出信息7.查看栈帧8.info命令9.显示源码GDB调试coredump文件关注公众号【程序员DeRozan】,回复【1207】,免费获取计算机经典资料及现金红包 前言 在开发程序时&…...
vbs简单语法及简单案例
文章目录一、简单语法1、变量2、输入3、输出4、选择语句5、循环二、用记事本编译中文乱码问题三、制作一个简单vbs脚本表白一、简单语法 1、变量 语法: dim 变量名例: dim a,b a1 b2 msgbox ab运行: 2、输入 语法:InputBox(…...
学板绘课程学费一般多少钱
学板绘课程学费一般多少钱?培训机构的费用和师资、模式有关,价格贵不贵要结合相同类型的机构多多对比。因为好些平台做了很多的宣传广告,运营成本很高, 终羊毛出在羊身上,这样的机构知名度很高,但是性价比不…...
48.在ROS中实现local planner(1)- 实现一个可以用的模板
有了之前45.在ROS中实现global planner(1)- 实现一个可以用模板的global planner的经验, 现在再去创建一个local planner的包就容易多了 1. 创建包 创建 cd ~/pibot_ros/ros_ws/src # 这里可以使用自己的ros workspace catkin_create_pkg sample_loc…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
