Развертывание AWS SAM: ошибка fork / exec / var / task / myfunction: нет такого файла или каталога: PathError

Я разработал набор функций Lambda в Golang и пытаюсь развернуть эти функции и шлюз API с помощью SAM.

Я создаю исполняемые файлы локально, создаю zip-файл для каждой из этих лямбда-функций и загружаю эти zip-файлы в корзину s3.

Я даю ссылку на эту корзину S3 в файле шаблона SAM.

Мой файл шаблона SAM выглядит следующим образом

myfunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: s3://<<my-bucket>>/bin/handlers/myfunction.zip
      Handler: myfunction
      Role: !GetAtt CFLambdaExecutionRole.Arn
      Events:
        Getcfdemoapi:
          Type: Api
          Properties:
            Path: /myfunction
            Method: get
        CreateCustomer:
          Type: Api
          Properties:
            Path: /myfunction
            Method: post
        UpdateCustomer:
          Type: Api
          Properties:
            Path: /customer
            Method: put
        DeleteCustomer:
          Type: Api
          Properties:
            Path: /myfunction
            Method: delete

Развертывание прошло успешно.

Я вызвал лямбда-функцию через шлюз API.

Я проверил журнал часов Cloud и увидел ошибку ниже -

Ошибка fork / exec / var / task / myfunction: нет такого файла или каталога: PathError

Что-то не так в шаблоне SAM, связанном с CodeUri и обработчиком?

Я создаю сборку на MacOS и использую следующую команду для сборки -

GOOS=linux GOARCH=amd64 go build

person Dattatray    schedule 11.12.2019    source источник
comment
Какова структура myfunction.zip?   -  person Marcin    schedule 30.11.2020
comment
Можете ли вы добавить код функции к вашему вопросу?   -  person petey    schedule 30.11.2020
comment
Можете ли вы включить шаги, которые вы сделали для создания ZIP-файла? А также каталоги / файлы внутри?   -  person Noel Llevares    schedule 01.12.2020


Ответы (1)


Эта конкретная ошибка может быть вызвана рядом проблем. На ум приходят три:

  1. Ваш двоичный файл не называется myfunction (вы используете set Handler: myfunction, поэтому двоичный файл должен быть назван myfunction)
  2. Бинарный файл отсутствует в ZIP-архиве
  3. Бинарный файл находится в ZIP-архиве, но находится по неправильному пути.

Чтобы решить эту проблему, вы можете запустить следующие команды в каталоге, содержащем код ваших лямбда-функций.


Шаг 1. Создайте двоичный файл и явно задайте имя myfunction

GOOS=linux GOARCH=amd64 go build -o myfunction

Если вы не используете параметр -o, двоичный файл будет назван в честь каталога, в котором вы строите. Поэтому, если каталог не имеет самого имени myfunction, полученный двоичный файл будет иметь неправильное имя (см. Возможную проблему №1 выше).

Шаг 2. Создайте ZIP-архив.

zip --junk-paths myfunction.zip myfunction

Параметр --junk-paths удалит путь и просто поместит двоичный файл в корень ZIP-архива. На странице руководства говорится:

Сохраните только имя сохраненного файла (удалите путь) и не храните имена каталогов. По умолчанию zip сохраняет полный путь (относительно текущего каталога).

Это сделано для того, чтобы избежать проблемы №3, которую я перечислил выше.

Чтобы проверить, работает ли это так, как задумано, вы можете запустить следующую команду:

unzip -l myfunction.zip

Это должно выглядеть примерно так:

Archive:  myfunction.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
  2142872  12-01-2020 19:19   myfunction
---------                     -------
  2142872                     1 file

Шаг 3. Загрузите ZIP-архив в S3.

Чтобы загрузить ZIP-архив в S3, я бы рекомендовал вам использовать AWS CLI. Консоль AWS тоже подойдет.

Используя интерфейс командной строки AWS, вы можете выполнить следующую команду:

aws s3 cp myfunction.zip s3://<<my-bucket>>/bin/handlers/myfunction.zip

Документацию по этой команде cp можно найти здесь: cp documentation.

person Jens    schedule 01.12.2020