aws lambda rust的sdk和自定义运行时

news2024/9/25 0:41:03

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, and AWS_REGION
  • The default credentials files located in ~/.aws/config and ~/.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!"}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/354963.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

XlsReadWriteII EXCEL Cell Font 单元字体设置

XlsReadWriteII EXCEL Cell Font 单元字体设置 通过XLSReadWriteII5在写EXCEL时&#xff0c;由于XLSReadWriteII5中使用的是个性化的TFont&#xff0c;因而通过参数带入TFont&#xff0c;不能完整地将TFont带入Cell的Font&#xff0c;问题解决如下&#xff1a; 一、问题说明 1、…

Python学习-----模块2.0(常用模块之时间模块-->time)

目录 前言&#xff1a; time简介 导入模块 1.时间戳 2.时间元组 &#xff08;1&#xff09;把时间戳转换为元组形式 &#xff08;2&#xff09;元组转换为时间戳输出 &#xff08;3&#xff09;把元组转换为格式化时间 &#xff08;4&#xff09;把时间戳转换为格式化时间…

【深度学习】模型评估

上一章——多分类问题和多标签分类问题 文章目录算法诊断模型评估交叉验证测试算法诊断 如果你为问题拟合了一个假设函数&#xff0c;我们应当如何判断假设函数是否适当拟合了&#xff1f;我们可以通过观察代价函数的图像&#xff0c;当代价函数达到最低点的时候&#xff0c;此…

手机/移动端的UI框架-Vant和NutUI

下面推荐2款手机/移动端的UI框架。 其实还有很多的框架&#xff0c;各个大厂都有UI框架。目前&#xff0c;找来找去&#xff0c;只有腾讯的移动端是setup语法写的TDesign&#xff0c;其他大厂&#xff0c;虽然都是VUE3写的&#xff0c;但是都还未改成setup的语法&#xff0c;而…

张晨光-JAVA零基础保姆式JDBC技术教程

JDBC文档 JDBC概述 JDBC概述 Java DataBase Connectivity Java 数据库连接技术 JDBC的作用 通过Java语言操作数据库&#xff0c;操作表中的数据 SUN公司为**了简化、**统一对数据库的操作&#xff0c;定义了一套Java操作数据库的规范&#xff0c;称之为JDBC JDBC的本质 是官方…

【JavaSE专栏10】Java的顺序结构、选择结构和循环结构

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;Java全栈软件工程师一枚&#xff0c;来自浙江宁波&#xff0c;负责开发管理公司OA项目&#xff0c;专注软件前后端开发&#xff08;Vue、SpringBoot和微信小程序&#xff09;、系统定制、远程技术指导。CSDN学院、蓝桥云…

金融错配程度/信贷错配程度/资本错配程度/资本资源错配程度(1998-2021年)

数据来源&#xff1a;根据沪深A股上市公司数据进行测算 时间跨度&#xff1a;1998-2021年 区域范围&#xff1a;沪深A股上市公司 指标说明&#xff1a; 参考邵挺(2010)、周煜皓和张胜勇(2014)的研究&#xff0c;运用金融错配负担水平来衡量信贷错配&#xff08;Fd&#xff…

Redis-哨兵模式以及集群

在开始这部分内容之前需要先说一下复制功能&#xff0c;因为这是Redis实现主从数据同步的实现方式。复制功能如果存在两台服务器的话&#xff0c;我们可以使用redis的复制功能&#xff0c;让一台服务器去同步另一台服务器的数据。现在我启动了两台redis服务器&#xff0c;一个端…

【大数据】HADOOP-Yarn集群界面UI指标项详解(建议收藏哦)

目录首页&#xff08;Cluster&#xff09;节点信息Scheduler Metrics&#xff1a;集群调度信息节点信息详解&#xff08;Nodes&#xff09;应用列表信息&#xff08;applications&#xff09;队列详情页&#xff08;Scheduler&#xff09;指标详细说明&#xff08;非常重要&…

斯坦福:chatGPT可能有了人类心智,相当于9岁儿童!

chatGPT已经具备了人类独心智&#xff0c;这话不是我说的&#xff0c;是一位来自斯坦福大学计算机科学家说的。很多玩过chatGPT的人都见识过他的”无所不知”&#xff0c;但是&#xff0c;我觉得最让我吃惊的是&#xff0c;他比以前我们用过那些对话机器人最大的差别就是你甚至…

「数据科学」数据科学家为什么应该学习PostgreSQL?

SQL是成为数据科学家的必要条件吗?答案是肯定的。数据科学已经发展了&#xff0c;虽然许多数据科学家仍然使用CSV文件(值以逗号分隔的文本文件)&#xff0c;但它们不是最好的选择。Python Panda库允许从CSV文件加载数据&#xff0c;但是这些文件有许多约束。例如&#xff0c;它…

各种常用C/C++集成开发环境的安装与配置

新学期又开始了&#xff0c;帮助又一堆菜鸟安装和配置C/C集成开发环境是一件恼人的工作。 本文引用自作者编写的下述图书; 本文允许以个人学习、教学等目的引用、讲授或转载&#xff0c;但需要注明原作者"海洋饼干叔 叔"&#xff1b;本文不允许以纸质及电子出版为目的…

【k8s】如何搭建搭建k8s服务器集群(Kubernetes)

搭建k8s服务器集群 服务器搭建环境随手记 文章目录搭建k8s服务器集群前言&#xff1a;一、前期准备&#xff08;所有节点&#xff09;1.1所有节点&#xff0c;关闭防火墙规则&#xff0c;关闭selinux&#xff0c;关闭swap交换&#xff0c;打通所有服务器网络&#xff0c;进行p…

Bash Shell 通过ls命令筛选文件

Bash Shell 通过ls命令及其管道根据大小名称筛选文件 最近参与的项目当中有需要用pyarmor加密项目的要求&#xff0c;听网上吹的pyarmor都那么神&#xff0c;用了一下感觉也一般&#xff0c;试用版普通模式下文件加密居然还有大小32KB的限制&#xff0c;加密到一半就失败了&am…

Linux常用命令汇总

1、tcpdump抓包 tcpdump这个命令是用来抓包的&#xff0c;默认情况下这个命令是没有的&#xff0c;需要安装一下&#xff1a; yum install -y tcpdump 使用这个命令的时候最好是加上你网卡的名称&#xff0c;不然可能使用不了&#xff1a; tcpdump -nn -i {网卡名称} 网卡名称…

iOS开发笔记之九十六——本地Data Persistence总结笔记

本质上来说&#xff0c;不管是哪种缓存方式最终都会以文件的形式存储在磁盘上&#xff0c;只不过上层进行了某种“封装”或“抽象”&#xff0c;所以还是做了分类&#xff0c;目前iOS本地持久化缓存&#xff08;Storage/Persistence&#xff09;有以下几种形式&#xff1a;User…

vTESTstudio - VT System CAPL Functions - VT2004(续1)

成熟,就是某一个突如其来的时刻,把你的骄傲狠狠的踩到地上,任其开成花或者烂成泥。vtsStartStimulation - 启动激励输出功能&#xff1a;自动激励输出注意&#xff1a;在启动激励输出之前&#xff0c;一定要设置好输出模式Target&#xff1a;目标通道变量空间名称&#xff0c;例…

TLB内存页表 - LoongArch

TLB内存页表 - LoongArch 文章目录TLB内存页表 - LoongArch页表操作指令TLB相关寄存器页表格式CpuSetAttributesUEFI Memory attribute页表操作指令 LDDIR: 用于软件页表遍历过程中目录项的访问. LDPTE: 用于在软件页表遍历过程中页表项的访问. INVTLB: 用于无效TLB中的内容. …

Mybatis源码分析:Mybatis的数据存储对象

前言&#xff1a;SQLSession是对JDBC的封装 一&#xff1a;SQLSession和JDBC的对照说明 左边是我们的客户端程序&#xff0c;右边是我们的MySQL数据仓&#xff0c;或者叫MySQL实例 Mybatis是对JDBC的封装&#xff0c;将JDBC封装成了一个核心的SQLSession对象 JDBC当中的核心对…

2023年浙江理工大学MBA招生考试初试成绩查询及复查的通知

根据往年的情况&#xff0c;2023浙江理工大学MBA考试初试成绩可能将于2月21日下午两点公布&#xff0c;为了广大考生可以及时查询到自己的分数&#xff0c;杭州达立易考教育为大家汇总了信息。 一、成绩查询考生可登录中国研究生招生信息网“全国硕士研究生招生考试初试成绩查询…