我不知道如何使用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"
}
这是通过不使用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