Впервые отправив здесь вопрос, открытый для обратной связи.
Я пытаюсь запустить исполняемый файл в AWS лямбда-выражении, однако я получаю сообщение об ошибке "не удается выполнить двоичный файл", что довольно расплывчато (больше выходов ниже). Я надеюсь определить, что может быть не так и почему. Как заявление об отказе от ответственности, я не очень хорош в c или python.
В настоящее время мой процесс заключается в написании программы hello world на c:
#include <stdio.h>
int main() {
printf("Hello World");
return 0;
}
Создание AWS экземпляр, который соответствует Python 3.8 лямбда-времени выполнения (Amazon Linux 2) (пробовал на Amazon Linux 1 с теми же результатами) Установите инструменты компилятора
sudo yum install gcc
sudo yum install glibc-static
Скомпилируйте программу в stati c исполняемый файл
gcc -static -static-libgcc -static-libstdc++ hello.c -o testings
Также пробовал с меньшим количеством флагов с похожими результатами.
gcc -static hello.c -o testings
Также пробовал как 32-битный двоичный файл с использованием флага -m32. Попробовал это, так как просмотр информации о процессоре для лямбда-времени показал 32-битный процессор.
Убедитесь, что он скомпилирован с stati c зависимостями
file testings
с результатами
testings: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 3.2.0, BuildID[sha1]=7167aa934c751be053864ee555be8f6a46e4d62e, not stripped
и
ldd testings
с результатами
not a dynamic executable
Я скопировал его на свой локальный компьютер, изменил права доступа к файлу, чтобы разрешить выполнение, заархивировал и загрузил его в лямбду.
Который содержит два файла. Testings (скомпилированная c программа) lambda_function.py, которая выглядит как
import json
from subprocess import run, call
def lambda_handler(event, context):
call(["ls -ll"], shell=True)
print("using run")
out = run(["./testings"], shell=True)
print("printing result")
print(out.returncode)
print("printing output")
print(out.stdout)
print("printing error")
print(out.stderr)
return {
'statusCode': 200,
'body': json.dumps('hello')
}
Результат выполнения этой функции:
Response:
{
"statusCode": 200,
"body": "\"hello\""
}
Request ID:
"fb640125-6698-4777-841a-47228d4da930"
Function Logs:
START RequestId: fb640125-6698-4777-841a-47228d4da930 Version: $LATEST
total 1092
-rwxrwxrwx 1 slicer 497 426 Jan 13 07:03 lambda_function.py
-rwxrwxrwx 1 slicer 497 1111526 Jan 13 06:32 testings
using run
/bin/sh: ./testings: cannot execute binary file
printing result
126
printing output
None
printing error
None
END RequestId: fb640125-6698-4777-841a-47228d4da930
REPORT RequestId: fb640125-6698-4777-841a-47228d4da930 Duration: 24.81 ms Billed Duration: 100 ms Memory Size: 512 MB Max Memory Used: 58 MB Init Duration: 113.42 ms
Я могу запустить исполняемый файл на AWS экземпляр, где он был скомпилирован и на моей локальной машине (Ubuntu 18.04.3 LTS).
Я прочитал довольно много похожих вопросов (запуск исполняемого файла в lambda) и знаю, что это не новый вопрос, однако Мне не удалось найти решение, которое работает для меня (я подозреваю, что я неправильно понимаю что-то фундаментальное, поскольку это очень новый домен для меня.)
Дополнительная информация:
с использованием readelf посмотреть заголовки двоичных файлов:
ELF Header:
Magic: 7f 45 4c 46 02 01 01 03 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - GNU
ABI Version: 0
Type: EXEC (Executable file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x400950
Start of program headers: 64 (bytes into file)
Start of section headers: 699480 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 6
Size of section headers: 64 (bytes)
Number of section headers: 33
Section header string table index: 32