使用AWS SAM-CLI需要每次更新代码都要重新构建。

8

我正在使用SAM CLI开发API Gateway Lambda代理集成。根据文档,我应该能够使用sam local start-api在本地测试我的端点。 start-api命令允许进行“热重载”,如 AWS SAM文档中所述 。但是,我没有看到这种行为。

我的template.yaml文件看起来像:

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      PackageType: Image
      Architectures:
        - x86_64
      Events:
        HelloWorld:
          Type: Api
          Properties:
            Path: /hello
            Method: get
    Metadata:
      Dockerfile: Dockerfile
      DockerContext: ./hello_world
      DockerTag: python3.9-v1

当我执行以下命令:

> sam build && sam local start-api

我能看到端点正在工作:

将HelloWorldFunction挂载在http://127.0.0.1:3000/hello
您现在可以浏览以上端点来调用您的函数。在编写函数时,您无需重新启动/重新加载SAM CLI,更改将立即/自动反映。

然而,当我更改./hello_world/app.py中的lambda_handler函数时,对curl http://localhost:3000的响应仍然保持不变。没有热加载发生。

我找到的唯一解决办法是为每个代码更改运行sam build。由于requirements.txt中包含某些依赖项,这会严重拖慢开发时间--我必须等待每个代码更改的构建1-2分钟。我可以只在.aws-sam/build目录中的文件上工作--就像这里建议的那样--但这似乎是一个不好的解决方案,因为我必须同时维护两个处理程序副本。


也许你可以看一下这个新的 beta 版本,它允许更快的部署周期。不过它确实是关于云部署而不是本地部署的。https://aws.amazon.com/blogs/compute/accelerating-serverless-development-with-aws-sam-accelerate/ - stijndepestel
在此处查看答案 https://stackoverflow.com/a/75104075/444578 - David Lozzi
4个回答

11
一个解决这个问题的好方法是使用 skip-pull-image 标志,这样Docker将重用Lambda运行时。 基本上运行: sam local start-api -t template.yaml --skip-pull-image 这让我的热重新加载正常工作了。

1
它能够工作的原因是: AWS文档:如果您指定了--template选项,则AWS SAM CLI的默认行为将被覆盖,并且仅会加载该AWS SAM模板及其指向的本地资源。https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-local-start-api.html - pedram

1

以前我觉得在运行两个终端并且需要反复构建很烦人。因此,我最终编写了一个样板文件,将我的源代码和依赖项捆绑到一个dist目录中,并同时运行sam local start-api,并监视更改以更新dist目录。

这是存储库: https://github.com/zishanneno/aws-typescript-lambda-boilerplate

使用它进行开发和调试比手动构建每个小代码更新要快得多。


1

1
如果存在构建,则`sam local start-api`将使用构建文件来托管本地版本。 只需删除".aws-sam"文件夹,然后再次运行您的`sam local start-api`。 如果".aws-sam"文件夹不存在,则所有更改将自动应用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接