Невозможно запустить скомпилированный stati c исполняемый файл hello-world из AWS лямбда-функции - PullRequest
0 голосов
/ 13 января 2020

Впервые отправив здесь вопрос, открытый для обратной связи.

Я пытаюсь запустить исполняемый файл в 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
...