Запуск AWS лямбда-функции локально с помощью AWS SAM не дает ни результатов, ни журналов, просто время ожидания - PullRequest
0 голосов
/ 08 июля 2019

Описание:

По какой-то причине, когда я пытаюсь вызвать или отладить свою функцию Lambda, AWS SAM всегда застревает на этапе монтирования. Вот как выглядит мой файл template.yml:

AWSTemplateFormatVersion: '2010-09-09'

Transform: 'AWS::Serverless-2016-10-31'

FFMPEG:
  Type: AWS::Serverless::Application
  Properties:
    Location:
      ApplicationId: arn:aws:serverlessrepo:us-east-1:145266761615:applications/ffmpeg-lambda-layer
      SemanticVersion: 1.0.0

Resources:

  Thumbnail:
    Type: 'AWS::Serverless::Function'
    Properties:
      Handler: bin/thumbnail
      Runtime: go1.x
      Timeout: 300
      CodeUri: ./bin/thumbnail.zip
      Layers: 
         - !GetAtt FFMPEG.Outputs.LayerVersion
      Events:
        GetSegmentFrames:
          Type: Api
          Properties:
            Path: /ai/thumbnail
            Method: post

А вот как выглядят команды Makefile, которые я использую. Обратите внимание, что я специально использую команду run :

# Go commands
GOCMD=go
GOBUILD=$(GOCMD) build
GOGET=$(GOCMD) get

# SAM commands
SAMCMD=sam
SAMPKG=$(SAMCMD) package
SAMDEPLOY=$(SAMCMD) deploy
SAMLOCAL=$(SAMCMD) local start-api
SAMINVOKE=$(SAMCMD) local invoke
DELVE_PATH = $(GOPATH)/dlv github.com/go-delve/delve/cmd/dlv

#  Debug main.go using AWS SAM
debug:
    GOARCH=amd64 GOOS=linux go build -gcflags='-N -l' -o $(THUMBNAIL_DEBUG_BINARY) $(THUMBNAIL_SOURCE)
    GOARCH=amd64 GOOS=linux go build -o $(DELVE_PATH)
    $(SAMLOCAL) -d 5986 --debugger-path $(GOPATH)

# Invoke Thumbnail Lambda's Handler Locally
run:
    $(SAMINVOKE) --event payload.json "Thumbnail"

Я также могу поделиться тем, как я структурировал свою функцию обработчика:

type Handler struct{}

func (handler Handler) Invoke(ctx context.Context, payload []byte) ([]byte, error) {
    glog.Info("Thumbnail Lambda handler has been Invoked..")
    lambdaConfig := config.Config{}
    thumbnailLambdaStatus := status.Initialize()

    apiGatewayEvent := new(events.APIGatewayProxyRequest)
    if err := json.Unmarshal(payload, apiGatewayEvent); err != nil {
        glog.Errorf("Error occurred while trying to unmarshal payload as APIGatewayProxyRequest. Error message - %v", err)
        return nil, err
    } else {
        if err := json.Unmarshal([]byte(apiGatewayEvent.Body), &lambdaConfig); err != nil {
            glog.Errorf("Error occurred while trying to unmarshal body of APIGatewayProxyRequest. Error message - %v", err)
            return nil, err
        }

        err := lambdaConfig.Validate()
        if err != nil {
            glog.Errorf("Error during validation of Config struct. Error message - %v", err)
            return nil, err
        }

        switch strings.ToUpper(apiGatewayEvent.HTTPMethod) {
        case "POST":
            resp, err := thumbnailLambda(&lambdaConfig, &thumbnailLambdaStatus)
            if err != nil {
                glog.Errorf("Error occurred while trying to execute Thumbnail Lambda's core logic. Error message - %v", err)
                return nil, err
            }

            glog.Infof("Response: %s", resp.Body)
            break
        default:
            err = fmt.Errorf("Invalid method: %s", apiGatewayEvent.HTTPMethod)
        }

    }

    return nil, nil
}

func main(){
         glog.Info("Starting Thumbnail Lambda ...")
         lambda.StartHandler(Handler{})
}

Обратите внимание, что я пытаюсь обработать несколько событий. На данный момент Lambda поддерживает только событие APIGatewayProxyRequest. Этот подход был взят из: Как поддерживать более одного триггера в AWS Lambda на Голанге?

Через некоторое время я получаю следующий вывод:

START RequestId: adb8e970-8ccf-1b11-f4f4-d4e65ea5bd69 Version: $LATEST
END RequestId: adb8e970-8ccf-1b11-f4f4-d4e65ea5bd69
REPORT RequestId: adb8e970-8ccf-1b11-f4f4-d4e65ea5bd69  Duration: 300000.00 ms  Billed Duration: 300000 ms      Memory Size: 128 MB     Max Memory Used: 0 MB
{
  "errorMessage": "2019-07-04T07:46:00.692Z adb8e970-8ccf-1b11-f4f4-d4e65ea5bd69 Task timed out after 300.00 seconds"
}
2019-07-04 09:46:00 Function 'Thumbnail' timed out after 300 seconds

Что меня смущает, так почему я не получаю журналы или что-то еще?

Наблюдаемый результат:

am local invoke --event payload.json "Thumbnail"
2019-07-04 09:26:10 Found credentials in shared credentials file: ~/.aws/credentials
2019-07-04 09:26:10 Invoking bin/thumbnail (go1.x)

Fetching lambci/lambda:go1.x Docker container image......
2019-07-04 09:26:12 Mounting /home/stefan/go/src/pipeline as /var/task:ro,delegated inside runtime container

Ожидаемый результат:

Я ожидал, что моя функция обработчика будет вызвана.

...