【问题标题】:Deploying AWS Lambda with Go & Cloudformation使用 Go 和 Cloudformation 部署 AWS Lambda
【发布时间】:2018-08-06 15:30:06
【问题描述】:

我正在自动部署基于 Go 的 AWS Lambda,但遇到了问题。

我的 AWS Serverless 模板是:

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
  HelloLambda:
    Type: AWS::Serverless::Function
    Properties:
      Handler: hello
      Runtime: go1.x
      CodeUri: ./deploy/hello.zip
      Environment:
        Variables: 
          S3_BUCKET: hello_lambda

我通过以下方式部署它:

GOOS=linux GOARCH=amd64 go build -o ./deploy/hello
zip ./deploy/hello.zip ./deploy/hello
aws cloudformation package \
   --template-file hello.yaml \
   --output-template-file serverless-deploy_hello.yaml \
   --s3-bucket hello_deploy
aws cloudformation deploy\
 --template-file serverless-deploy_hello.yaml\
  --stack-name hello-lambda\
  --capabilities CAPABILITY_IAM

当 Cloudformation 执行其操作时,serverless-deploy_hello.yaml 具有 CodeUri: s3://hello_deploy/17ab86653aab79eee51fc6f77d7a152e,并且该 s3 存储桶包含 zip 文件(当我在本地下载它并使用 cmp 时,它是位相同的)。

但是当我测试生成的 Lambda 时,它给了我:

{
  "errorMessage": "fork/exec /var/task/hello: no such file or directory",
  "errorType": "PathError"
}

不太清楚我在这里做错了什么......

==== 已解决 ====

上面的 zip 命令也会压缩目录路径,因此可执行文件解压缩到 deploy/hello 而不是 ./hello

因此,Lambda 运行时无法连接到进程。

【问题讨论】:

  • 您能否在解压缩 zip 时检查它是否会创建一个额外的文件夹?类似 var/task/hello/hello"。这可能是原因。但你说在本地下载它时,它会创建相同的确切路径。可能只是预感。
  • 嗯,这是其中一个 zip 文件的问题,但我现在上传的文件只包含 hello 可执行文件。很奇怪。
  • 不,这正是问题所在 - 正在查看错误的 zip
  • 去过那里.. :P

标签: go aws-lambda


【解决方案1】:
{
  "errorMessage": "fork/exec /var/task/hello: no such file or directory",
  "errorType": "PathError"
}

这将在您的 zip 文件中查找 hello 函数作为应用程序的起点。如果你想继续使用 main 函数或其他一些函数

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

您需要更改 AWS Lambda 函数模板上的处理程序名称(默认为 hello)。

【讨论】:

  • 2020:要更改处理程序名称,请转到“基本设置”窗格
猜你喜欢
  • 2017-06-12
  • 2018-07-19
  • 1970-01-01
  • 2017-07-14
  • 2017-10-21
  • 2019-09-24
  • 1970-01-01
  • 2021-11-03
  • 2020-11-02
相关资源
最近更新 更多