为什么 AWS sam 包会导致 - 无法导入模块 '' 没有名为 '' 的模块 - 在 sam 部署期间但 sam build 不会?
Why does AWS sam package causes - Unable to import module '' No module named '' - during sam deploy but sam build does not?
我目前正在处理的项目创建了一个 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
时,它成功找到了处理程序并 运行 它。
当我将更改推送到我们设置的 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 映像。由于在创建管道期间的疏忽,我使用了一个托管图像,该图像使用不支持构建嵌套 stacks/templates 的 CodeBuild 标准 1。由于上面提到的堆栈是作为更大模板的嵌套堆栈构建的,因此它没有构建,因此导致层错误。
更改为 CodeBuild 标准 3 后,堆栈按预期构建和打包。
我目前正在处理的项目创建了一个 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
时,它成功找到了处理程序并 运行 它。
当我将更改推送到我们设置的 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 映像。由于在创建管道期间的疏忽,我使用了一个托管图像,该图像使用不支持构建嵌套 stacks/templates 的 CodeBuild 标准 1。由于上面提到的堆栈是作为更大模板的嵌套堆栈构建的,因此它没有构建,因此导致层错误。
更改为 CodeBuild 标准 3 后,堆栈按预期构建和打包。