当前位置: 首页 > 知识库问答 >
问题:

AWS Lambda带锈的reqwest分段断层

雍俊远
2023-03-14

我不知道如何使用rust从AWS Lambda发出简单的HTTP请求而不会出现分段错误。无论使用兼容层的tokio-0.2还是tokio-0.3,都会出现此错误。看起来lambda_http是用tokio-0.2编译的,所以它应该可以工作。

cargo.toml:

[package]
name = "req"
version = "0.1.0"
authors = ["X"]
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
lambda_http = { version = "0.2.0-beta.1", git = "https://github.com/awslabs/aws-lambda-rust-runtime" }
tokio = { version = "0.3.4", features = ["full"] }
tokio-compat-02 = "0.1.2"
reqwest = { version = "0.10.9", features = ["json"] }
use lambda_http::{
    handler,
    lambda::{self, Context},
    IntoResponse, Request,
};
// NOTE:
// when using tokio-0.2 alone, you get a segmentation fault
// when tokio-0.2 compatibility is enabled with tokio-0.3, you get a segmentation fault
// when tokio-0.2 compatibility is not enabled with tokio-0.3, 'main' panics because 'there is
// no reactor running, must be called from the context of Tokio runtime'
// use tokio_compat_02::FutureExt;

pub type Error = Box<dyn std::error::Error + Send + Sync + 'static>;

#[tokio::main]
async fn main() -> Result<(), Error> {
    lambda::run(handler(func)).await?;
    // NOTE: [tokio-0.2 compat] - this doesn't help
    // lambda::run(handler(func)).compat().await?;
    Ok(())
}

async fn func(_: Request, _: Context) -> Result<impl IntoResponse, Error> {
    let _res = reqwest::get("https://www.google.com").await?;
    // NOTE: [tokio-0.2 compat] - this doesn't help
    // let _res = reqwest::get("https://www.google.com").compat().await?;
    Ok("success")
}
PKG_CONFIG_ALLOW_CROSS=1 cargo build --release --target x86_64-unknown-linux-musl
cp target/x86_64-unknown-linux-musl/release/req target/x86_64-unknown-linux-musl/release/bootstrap
zip -j target/x86_64-unknown-linux-musl/release/bootstrap.zip target/x86_64-unknown-linux-musl/release/bootstrap
# aws lambda create-function \
#   --function-name reqwest-test \
#   --handler doesnt.matter \
#   --zip-file fileb://target/x86_64-unknown-linux-musl/release/bootstrap.zip \
#   --runtime provided \
#   --role [REMOVED] \
#   --environment Variables={RUST_BACKTRACE=1} \
#   --tracing-config Mode=Active
aws lambda update-function-code \
  --function-name reqwest-test \
  --zip-file fileb://target/x86_64-unknown-linux-musl/release/bootstrap.zip

event.json

{
  "headers": {
    "accept": "*/*",
    "content-length": "0",
    "host": "xxx.execute-api.us-east-1.amazonaws.com",
    "user-agent": "curl/7.64.1",
    "x-amzn-trace-id": "Root=1-5eb33c07-de25b420912dee103a5db434",
    "x-forwarded-for": "65.78.31.245",
    "x-forwarded-port": "443",
    "x-forwarded-proto": "https"
  },
  "isBase64Encoded": false,
  "rawPath": "/",
  "rawQueryString": "",
  "requestContext": {
    "accountId": "123456789012",
    "apiId": "xxx",
    "domainName": "xxx.execute-api.us-east-1.amazonaws.com",
    "domainPrefix": "xxx",
    "http": {
      "method": "GET",
      "path": "/",
      "protocol": "HTTP/1.1",
      "sourceIp": "65.78.31.245",
      "userAgent": "curl/7.64.1"
    },
    "requestId": "MIZRNhJtIAMEMDw=",
    "routeKey": "$default",
    "stage": "$default",
    "time": "06/May/2020:22:36:55 +0000",
    "timeEpoch": 1588804615616
  },
  "routeKey": "$default",
  "version": "2.0"
}

共有1个答案

江衡
2023-03-14

这是通过不使用openssl进行交叉编译来解决的,openssl是在glibc中动态链接的。您可以将其更改为reqwest={version=“0.45.0”,default-features=false,features=[“rustls-tls”]}。如果您使用的是Rusoto板条箱,除了features=[“rustls”]之外,还有同样的事情。

 类似资料:
  • reqwest 用于浏览器异步HTTP请求。支持xmlHttpRequest, JSONP, CORS, 和 CommonJS约束。 API reqwest('path/to/html', function (resp) {  qwery('#content').html(resp)})reqwest({    url: 'path/to/html'  , method: 'post'  , da

  • 此代码基于生存期章节中Rust书中的示例代码。我想知道相同方法的以下两个版本有何不同: 对 我猜在第一个版本中,我们指示编译器 > 查找生存期,使两者都 确保返回的引用仅在该生命周期内使用,因为在该生命周期之外,它可能会成为悬空引用。 代码的第二个版本是做什么的?Rust书中的生命周期省略规则之一说,在结构方法中,返回的引用被分配了

  • 问题 解释器因为某个分段错误、总线错误、访问越界或其他致命错误而突然间奔溃。 你想获得Python堆栈信息,从而找出在发生错误的时候你的程序运行点。 解决方案 faulthandler 模块能被用来帮你解决这个问题。 在你的程序中引入下列代码: import faulthandler faulthandler.enable() 另外还可以像下面这样使用 -Xfaulthandler 来运行Pyth

  • 我有以下Rust游乐场永久墨水 如果我从这样的问题中理解正确的话,那么由于泛型是单态的,Rust运行时就不可能泄漏出的适当方法,假设每个实现的类型表面上可能有一个不同的方法?这对我来说并不是很好,因为在与Rust运行时相同的位置上,我似乎可以查看我手头上的实现器,比如和我将查看的vtable。你能解释一下我错在哪里吗? 从那里,我尝试简单地与编译器战斗,并进入静态分派。第17-21行 变成了

  • 我目前正在尝试使用actix-web和ReqWest测试一个APIendpoint。 这就是产生错误的原因: 如果我将上的断言顺序与交换,它就可以工作了。但我认为这不是最好的方法,正如它应该明确指出的那样,与评论或进一步了解,这是以这种特定的方式工作。 如果我不能克隆reqwest响应,我可以做些什么来避免依赖断言的顺序吗?或者我怎么克隆它?

  • 我在这里使用了这个很棒的资源--https://forums.aws.amazon.com/thread.jspa?messageid=673012--但是如果数据中有空字段(我会这样做,这超出了我的控制),它会抛出一个内部服务器错误。 然后从Christian E Willman-https://github.com/christianewillman/aws-api-gateway-bodyP