Я написал лямбда-функцию, которая выполняет другой исполняемый файл с именем abc.exe.
Теперь я создал zip-файл лямбда-функции и загрузил его в aws. Я не уверен куда поместить мой "abc.exe"
Я попытался поместить его в тот же почтовый индекс, но я получаю следующую ошибку:
exec: "abc": executable file not found in $PATH:
Вот мой код лямбда-функции:
func HandleLambdaEvent(request Request) (Response, error) {
fmt.Println("Input", request.Input)
fmt.Println("Output", request.Output)
cmd := exec.Command("abc", "-v", "--lambda", request.Input, "--out", request.Output)
var out bytes.Buffer
var stderr bytes.Buffer
cmd.Stdout = &out
cmd.Stderr = &stderr
err := cmd.Run()
if err != nil {
fmt.Println(fmt.Sprint(err) + ": " + stderr.String())
return Response{Message: fmt.Sprintf(stderr.String())}, nil
}
fmt.Println("Result: " + out.String())
return Response{Message: fmt.Sprintf(" %s and %s are input and output", request.Input, request.Output)}, nil
}
Обновлять:
Испытание 1:
Я загрузил abc.exe на s3, а затем в своей функции HandleLambdaEvent я загружаю его в папку tmp/. И затем, когда я пытаюсь получить к нему доступ после успешной загрузки, он показывает следующую ошибку:
fork/exec /tmp/abc: no such file or directory:
Код для загрузки abc.exe:
file, err2 := os.Create("tmp/abc.exe")
if err2 != nil {
fmt.Println("Unable to create file %q, %v", err2)
}
defer file.Close()
sess, _ := session.NewSession(&aws.Config{
Region: aws.String(region)},
)
downloader := s3manager.NewDownloader(sess)
numBytes, err2 := downloader.Download(file,
&s3.GetObjectInput{
Bucket: aws.String(bucket),
Key: aws.String("abc.exe"),
})
if err2 != nil {
fmt.Println("Unable to download item %q, %v", fileName, err2)
}
fmt.Println("Downloaded", file.Name(), numBytes, "bytes")
file.Close()
Что за файл .exe? Это приложение для Windows?
@Flimzy, я тоже не уверен. Для меня это тоже метод проб и ошибок. Но чтобы проверить, может ли лямбда выполнять двоичный код, во-первых, мне нужен способ получить к нему доступ из лямбды :)
@JohnRotenstein Это исполняемый программный файл golang.
Интересно, можно ли просто использовать GO напрямую? объявляет о поддержке Go для AWS Lambda | Блог AWS о вычислительных ресурсах и Создание функций Lambda с помощью Go — AWS Lambda
Я сомневаюсь, что в целом вы идете в правильном направлении, но непосредственная проблема заключается в том, что .exe никогда не подразумевается в Linux. Полное имя файла, например. exec.Command("abc.exe", ... потребуется.





are you sure you even can execute an external binary? That seems counter-intuitive to me, like it violates the point of Lambda
Вполне приемлемо. Посмотрите Запуск произвольных исполняемых файлов в AWS Lambda в блоге AWS Compute.
I am not sure where to put my "abc.exe"
Для запуска исполняемых файлов на Lambda упакуйте их в ZIP-файл, который вы загружаете. Затем сделайте что-то вроде
exec.Command(path.Join(os.GetEnv("LAMBDA_TASK_ROOT"), "abc.exe"))
What sort of file is the .exe file? Is it a Windows app?
Вы не сможете запускать приложения Windows на Lambda. Связанный пост в блоге гласит: Если вы компилируете свои собственные двоичные файлы, убедитесь, что они либо статически связаны, либо созданы для соответствующей версии Amazon Linux.
Переменные среды, доступные для лямбда-функций docs.aws.amazon.com/lambda/latest/dg/…
Как бы вы запустили исполняемый файл с аргументами командной строки? Я делаю то же самое на python и могу запустить исполняемый файл через subprocess.Popen(args), где args = "./abc.exe". Могу ли я просто добавить еще один элемент в список аргументов?
Я почти ничего не знаю о Lambda, но вы уверены, что даже могу выполняете внешний двоичный файл? Мне это кажется нелогичным, как будто это нарушает точку лямбда.