微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 AWS sam 包会导致 - 无法导入模块 '' 没有名为 '' 的模块 - 在 sam 部署期间但 sam 构建没有?

如何解决为什么 AWS sam 包会导致 - 无法导入模块 '' 没有名为 '' 的模块 - 在 sam 部署期间但 sam 构建没有?

我目前正在处理的项目创建了一个 lambda 层,其中包含一个名为 app.py文件,在该文件中是一个名为 lambda_handler函数,它有兴趣用作 Handler无论 lambda 函数是否包含该层。我用来执行此操作的 sam 模板如下所示:

Resources:
  LamLayer:
    Type: AWS::Serverless::LayerVersion
    LayerName: !Join
      - ''
      - - 'LamLayer'
      - - !Ref AWS::StackName
    Properties:
      ContentUri: ./lam_layer
      CompatibleRuntimes:
        - python3.8
    Metadata:
      BuildMethod: python3.8
  LamFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: ./lam_function
      Runtime: python3.8
      Handler: app.lambda_handler
      Layers:
        - !Ref LamLayer
      Timeout: 60
      AutopublishAlias: live

现在虽然 Handler: app.lambda_handler 不存在于 lambda 函数本身中,但它存在于包含的层中。

现在,在创建此设置后,我通过调用 sam build; sam deploy 对其进行了测试,并成功部署并运行。当我调用 LamFunction 时,它成功找到了 Handler 并运行它。

当我将更改推送到我们设置的 CodePipeline 时,问题就出现了。构建和部署成功,但当我现在调用 LamFunction 时,它抛出以下错误

Unable to import module 'app': No module named 'app'

在调试了一段时间之后,我似乎已经将问题缩小到我构建的方式与管道构建项目的方式之间的差异。

我打电话给:sam build; sam deploy

而管道调用sam build; sam package --s3-bucket codepipeline-eu-central-1-XXXXXXXXXX --output-template-file packaged-template.yml,然后使用标准管道部署阶段从 S3 存储桶进行部署。

但是虽然我认为我知道这种差异导致了问题,但我不确定根本原因是什么以及我需要更改什么来修复它?

---- 编辑----

这里是 buildspec.yml,以防这是罪魁祸首:

version: 0.2
phases:
  install:
    runtime-versions:
        python: 3.8
  build:
    commands:
      - sam build
      - sam package --s3-bucket codepipeline-eu-central-1-XXXXXXXXXX --output-template-file packaged-template.yml
artifacts:
  files:
    - packaged-template.yml

解决方法

最后,我设法将问题追溯到管道中使用的 CodeBuild 映像。由于在创建管道期间的疏忽,我使用了一个托管映像,该映像使用了不支持构建嵌套堆栈/模板的 CodeBuild 标准 1。由于上述堆栈是作为较大模板的嵌套堆栈构建的,因此未构建,因此会导致层出错。

更改为 CodeBuild 标准 3 后,堆栈按预期构建和打包。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。