Итак, у меня есть следующая лямбда-функция rust aws:
use std::io::Read;
use std::process::{Command, Stdio};
use lambda_http::{run, service_fn, Body, Error, Request, RequestExt, Response};
use lambda_http::aws_lambda_events::serde_json::json;
/// This is the main body for the function.
/// Write your code inside it.
/// There are some code example in the following URLs:
/// - https://github.com/awslabs/aws-lambda-rust-runtime/tree/main/examples
async fn function_handler(_event: Request) -> Result<Response<Body>, Error> {
// Extract some useful information from the request
let program = Command::new("./myProggram")
.stdout(Stdio::piped())
.output()
.expect("failed to execute process");
let data = String::from_utf8(program.stdout).unwrap();
let parsed = data.split("\n").filter(|x| !x.is_empty()).collect::<Vec<&str>>();
// Return something that implements IntoResponse.
// It will be serialized to the right response event automatically by the runtime
let resp = Response::builder()
.status(200)
.header("content-type", "application/json")
.body(json!(parsed).to_string().into())
.map_err(Box::new)?;
Ok(resp)
}
#[tokio::main]
async fn main() -> Result<(), Error> {
tracing_subscriber::fmt()
.with_max_level(tracing::Level::INFO)
// disable printing the name of the module in every log line.
.with_target(false)
// disabling time is handy because CloudWatch will add the ingestion time.
.without_time()
.init();
run(service_fn(function_handler)).await
}
Идея здесь в том, что я хочу вернуть ответ из бинарника в формате JSON.
Я компилирую функцию с лямбдой Cargo, которая создает файл начальной загрузки, затем я заархивирую его вручную, включив двоичный файл начальной загрузки и двоичный файл myProgram.
Когда я проверяю свою функцию на лямбда-панели, отправляя ей событие, я получаю ответ с правильными заголовками и т. д., но тело ответа пусто. Я развертываю свою функцию через панель aws в пользовательской среде выполнения на Amazon Linux 2, загружая zip-файл.
Когда я тестирую локально с помощью Cargo Lambda Watch и Cargo Lambda, тело ответа заполняется стандартным выводом myProgram, преобразованным в json.
Любые идеи или мысли о том, что пойдет не так в реальном облаке, очень ценятся!
да, как я уже описал, на локальном компьютере, когда я вызываю функцию с помощью вызова лямбда-груза, я получаю вывод из myProgram, отформатированный как json
Я не говорю о вашем локальном, но в лямбда-выражении AWS, вы уверены, что ./myProgram работает? Я имею в виду, вы можете как-то распечатать содержимое program
? Возможно, output
пуст, потому что ./myProggram не запущен
Спасибо, что указали мне правильное направление. Не уверен, почему я не подумал о проверке STDERR в начале.
Моя проблема была с динамически подключаемыми библиотеками в бинарнике. На самом деле это двоичный файл Python, и в нем отсутствовала конкретная версия GLIBC. Самым простым решением в моем случае было скомпилировать myProgram на Amazon Linux 2.
Вы пытаетесь выполнить команду в aws lambda из среды выполнения Rust? Вы уверены, что это действительно работает? Я имею в виду, что ответ пуст, может быть, потому, что нет вывода??