标签: aws-lambda-go

运行AWS Golang Lambda时的exec格式错误

我有一个go应​​用程序,其结构如下:

cmd
|
报告
|
main.go

main.go导入internal/reports程序包,并且具有单个函数main(),该函数将对函数的调用委托给代理aws-lambda-go/lambda.Start()

运行命令(代码段)的代码已构建:

cd internal/reports && go build handler.go
cd ../..
go build -o reports ../cmd/reports/main.go && chmod +x reports && zip reports.zip reports
Run Code Online (Sandbox Code Playgroud)

reports.zip上载到AWS Lambda,当Test按下按钮时,后者又引发错误:

{
  "errorMessage": "fork/exec /var/task/reports: exec format error",
  "errorType": "PathError"
}
Run Code Online (Sandbox Code Playgroud)

reports设置为Lambda的Handler

同样,代码是aws/codebuild/ubuntu-base:14.04AWS CodeBuild上作为Docker Image 的一部分在Ubuntu 14.04机器上构建的。即使该错误表明存在跨平台问题,此处也不应该存在环境问题。

有任何想法吗?

go amazon-web-services aws-lambda aws-lambda-go

10
推荐指数
2
解决办法
3312
查看次数

通过 API GW 调用时,AWS Lambda Go 函数未获取请求正文

首先,有人可能会说这个问题与HTTP request body not getting to AWS lambda function via AWS API GatewayGetting json body in aws Lambda via API gateway非常相似

但是,这些问题都没有解决使用 Golang 的问题,我遇到的问题是找到event与 Node.js 文档中随处使用的参数等效的参数。

这是我的 Lambda 函数:

package main

import (
    "context"
    "encoding/json"
    "github.com/aws/aws-lambda-go/lambda"
    "github.com/aws/aws-lambda-go/events"
    "log"
)

type MyReturn struct {
    Response string `json:"response"`
}

type APIGWResponse struct {
    IsBase64Encoded bool              `json:"isBase64Encoded"`
    StatusCode      int               `json:"statusCode"`
    Headers         map[string]string `json:"headers"`
    Body            string            `json:"body"`
}

func handle(ctx context.Context, name MyReturn) (APIGWResponse, error) {
    log.Print("Called by …
Run Code Online (Sandbox Code Playgroud)

go aws-lambda aws-api-gateway aws-lambda-go

9
推荐指数
1
解决办法
5760
查看次数

func init() 与 func main() 用于初始化 AWS Lambda 处理程序中的全局状态

查看Go文档 中官方AWS Lambda 函数处理程序中的使用全局状态部分https://docs.aws.amazon.com/lambda/latest/dg/golang-handler.html

建议初始化func init() ie 中的所有全局状态。我们想要在多个 lambda 调用之间共享的任何包级别变量都放在此处。
我的理解是,每次 lambda 容器启动(即冷启动)时都会完成一次初始化。

我的问题是,是否可以使用func main()而不是做同样的事情func init()。由于运行的副作用,
使用func init()基本上使我的处理程序函数( )不可进行单元测试。将代码 移至似乎可以轻松解决此问题。使用vs 有什么副作用吗func LambdaHandlerfunc init()
func init()func main()
func main()func init()

代码示例

使用 func init()

package main
 
import (
        "log"
        "github.com/aws/aws-lambda-go/lambda"
        "github.com/aws/aws-sdk-go/aws/session"
        "github.com/aws/aws-sdk-go/service/s3"
        "github.com/aws/aws-sdk-go/aws"
)
 
var invokeCount = 0
var myObjects []*s3.Object
func init() {
        svc := s3.New(session.New())
        input := &s3.ListObjectsV2Input{
                Bucket: aws.String("examplebucket"),
        }
        result, _ := svc.ListObjectsV2(input) …
Run Code Online (Sandbox Code Playgroud)

go amazon-web-services aws-lambda aws-lambda-go

4
推荐指数
1
解决办法
3493
查看次数

模拟context.Context来测试lambdacontext.FromContext

我正在使用aws-sdk-goaws-lambda-go构建一个aws lambda ,我遇到了一个小问题.

我想测试我的lambda处理程序.为此,我需要模拟一个有效的context.Context,它包含lamdacontext.LambdaContext的有效属性并且满足lambdacontext.FromContext.

我似乎无法找到建立这样的模拟的方法,因为lambdacontext.FromContext总是回报我_, false.

这是我的主要内容,在events.SNSEvent事件上有一个简单的处理程序:

package main

import (
    "context"
    "github.com/aws/aws-lambda-go/events"
    "github.com/aws/aws-lambda-go/lambda"
    "github.com/aws/aws-lambda-go/lambdacontext"
)

func main() {
    lambda.Start(handleRequest)
}

func handleRequest(ctx context.Context, snsEvent events.SNSEvent) error {
    lc, ok := lambdacontext.FromContext(ctx); if !ok {
        // Always false
        ...
        return someErr
    }
    . . .
    return nil
}
Run Code Online (Sandbox Code Playgroud)

这是我的测试handleRequest:

package main

import (
    "context"
    "github.com/aws/aws-lambda-go/events"
    "github.com/aws/aws-lambda-go/lambdacontext"
    "github.com/stretchr/testify/assert"
    "gitlab.easy-network.it/meg/aml-rekognition/testdata"
    "testing"
)

const imgMock …
Run Code Online (Sandbox Code Playgroud)

unit-testing go aws-lambda aws-sdk-go aws-lambda-go

3
推荐指数
1
解决办法
1190
查看次数

如何使用 AWS lambda 函数获取 URL 参数?

我正在为 API 使用 Netlify 函数,除了我需要访问 URL 参数时,大多数函数都工作得很好

这是我必须获取参数的片段:

func Handler(ctx context.Context, request events.APIGatewayProxyRequest) (Response, error) {

    id := request.PathParameters["id"]

    ...
}

func main() {
    lambda.Start(Handler)
}
Run Code Online (Sandbox Code Playgroud)

我有其他功能可以正常工作,不需要 URL 参数,但无法弄清楚如何让这些功能正常工作,我尝试了多种不同的选择:

https://example.com/endpoint/1
https://example.com/endpoint/id=1
https://example.com/endpoint?id=1
Run Code Online (Sandbox Code Playgroud)

当到达端点时,以上都不会返回 id 路径参数

go aws-lambda aws-lambda-go

3
推荐指数
1
解决办法
4731
查看次数

无法通过 aws cli 从 localstack 调用 lambda 函数

我已经推送了 lambda 函数,因为我可以在 localstack 中看到它,基于下面的命令/输出

 aws lambda get-function --function-name books1 --endpoint-url=http://localhost:4574
{
    "Code": {
        "Location": "http://localhost:4574/2015-03-31/functions/books1/code"
    }, 
    "Configuration": {
        "Version": "$LATEST", 
        "FunctionName": "books1", 
        "CodeSize": 50, 
        "FunctionArn": "arn:aws:lambda:us-east-1:000000000000:function:books1", 
        "Environment": {}, 
        "Handler": "main", 
        "Runtime": "go1.x"
    }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试执行它时,如下所示,出现错误,并且我的 localstack 正在 docker 容器内运行

aws --endpoint-url= http://localhost:4574 lambda 调用 --function-name books1 /tmp/output.json

An error occurred (InternalFailure) when calling the Invoke operation (reached max retries: 4): Error executing Lambda function: Unable to find executor for Lambda function "books1". Note that Node.js and .NET Core Lambdas …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services aws-lambda aws-lambda-go localstack

2
推荐指数
1
解决办法
6923
查看次数