当前位置: 首页 > 知识库问答 >
问题:

AWS SAM:跨Lambda函数共享文件

任昊阳
2023-03-14

我正在使用AWS SAM(无服务器应用程序模型)在API网关设置中构建Python 3.6 lambda代码。因此,我有一个单独的template.yaml文件来创建几个Lambda函数。它们与lambda函数一起组织在项目中各自的子目录中。lambda还共享几个我保存在共享文件夹中的常见文件。

project-home
 -lambda_a_dir
   -lambda_a.py
 -lambda_b_dir
   -lambda_b.py
 -shared_dir
   -shared.py

问题是,虽然Pycharm可以清楚地看到共享的。py,SAM无法并拒绝识别共享文件,出现以下错误:无法导入模块“lambdaA”:如果我移动共享文件的副本,则没有名为“shared”的模块。py文件放入每个lambda目录,Pycharm和SAM都很高兴,我可以构建/部署到AWS
我的问题:如何使用共享目录中的共享文件构建SAM模板
到目前为止,我已经尝试过:

  • 符号链接和MacOS别名
  • CodeUri备选方案的各种组合
  • 带有\uuuu init\uuuu设置的本地包。py。(我不能使用公共包,因为代码是私有的,不能放在公共存储库中。)

这是我的模板文件:

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
  lambdaA:
    Type: AWS::Serverless::Function 
    Properties:
      CodeUri: ./lambda_a_dir/
      Handler: lambda_a.lambda_handler
      Runtime: python3.6
  lambdaB:
    Type: AWS::Serverless::Function 
    Properties:
      CodeUri: ./lambda_b_dir/
      Handler: lambda_b.lambda_handler
      Runtime: python3.6

共有3个答案

牟恺
2023-03-14

您是否尝试过使用Rocketsam CLI?它正好解决了这个问题(使用在构建期间自动创建的符号链接在lambda之间共享代码)。它还允许分割YAML文件,以便每个lambda可以有一个单独的YAML文件。

施旭东
2023-03-14

图层解决方案看起来像黑客。我尝试创建符号链接到“共享”文件夹,它起作用了——共享文件夹成功地与我的lambda函数一起打包。

cd lambda_a_dir
ln -s ../shared
那安宁
2023-03-14

根据@Dunedan的建议,我用共享代码为每个lambda函数创建了一个Layers对象,这有效地将这些例程添加到这些函数的PythonPath中。我还使用新的Layers属性在API模板定义中添加了以下内容:

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
  lambdaA:
    Type: AWS::Serverless::Function 
    Properties:
      CodeUri: ./lambda_a_dir/
      Handler: lambda_a.lambda_handler
      Runtime: python3.6
      Layers: 
        - arn:aws:lambda:us-west-1:012345678:layer:my_shared_zip:1
  lambdaB:
    Type: AWS::Serverless::Function 
    Properties:
      CodeUri: ./lambda_b_dir/
      Handler: lambda_b.lambda_handler
      Runtime: python3.6
      Layers: 
        - arn:aws:lambda:us-west-1:012345678:layer:my_shared_zip:1

请注意,代码在上传之前需要进行压缩,并且需要具有以下目录结构,代码位于具有语言名称的目录中。在这种情况下,因为我使用Python,代码需要在python目录中,然后将python目录压缩:

my_shared_zip.zip
 -python
   -shared.py
   -other_shared.py
   -more_shared.py

最后一点。虽然理想情况下,这个共享python目录应该通过sam deploy命令直接部署到层对象中,但我发现AWS sam CLI中对Layers的支持仍然很新,而且存在很多缺陷,因此在这一点上它不起作用。希望在接下来的几个月里它会被修复。同时,我需要自己手动安装共享zip文件的新版本。叹气

 类似资料:
  • 只有在必要时,我才尝试在“httpRequestBegin”管道中执行一些操作。我的处理器在Sitecore解析用户后执行(processor type=“Sitecore.Pipelines.HttpRequest.UserResolver,Sitecore.Kernel”),因为如果Sitecore无法首先解析用户,我也在解析用户。 稍后,我想在管道“insertRenderings”中添加一

  • 我目前正在从事一个托管在域上的laravel项目。此应用程序的一部分(某些功能)必须位于不同的域上。我在我的网上找到了一条路。在php中,我用以下命令映射了所有路由: 以及需要以相同方式位于另一个域上,但具有不同域的路由。好啊在主域中,我创建了一个具有src属性的图像: 指向此方法路线: 它起作用了。我在不同的域上共享同一个会话,但是,我想问你们,对于这个案例场景,你们是否知道更好的方法。我知道这

  • 通过XHR 实现Ajax 通信的一个主要限制,来源于跨域安全策略。默认情况下,XHR 对象只能访问与包含它的页面位于同一个域中的资源。这种安全策略可以预防某些恶意行为。但是,实现合理的跨域请求对开发某些浏览器应用程序也是至关重要的。 CORS(Cross-Origin Resource Sharing,跨源资源共享)是W3C 的一个工作草案,定义了在必须访问跨源资源时,浏览器与服务器应该如何沟通。

  • 由于进程数据隔离,A进程的数据无法直接的被B使用,为解决该问题,可以尝试使用Swoole自带的Memory模块。 或者也可以尝试使用EasySwoole提供的ShareMemory,或者借助第三方的类似Redis之类的服务。

  • 问题内容: 我正在编写一个HTML5应用程序,该应用程序使用JSONP从几个不同的来源收集数据。我对GET所做的任何事情都可以正常工作。我现在正尝试发布数据,并且遇到了一个有趣的问题。我需要将数据从我的应用程序发布到另一个应用程序,该应用程序从本地计算机运行。我正在尝试编写具有跨平台功能的移动应用程序(请考虑使用Pulse / Flipboard),因此该代码将始终从本地源运行。我的思考过程如下:

  • 跨域资源共享 (CORS) 跨域资源共享(Cross-Origin Resource Sharing)允许WEB端的应用程序访问不属于本域的资源 配置格式 CORS配置为json字符串,类似 { "rules":[ { "id":"id1" "AllowOrigin":"http://*.example.com" //指定允许发送跨源请求的源,支持使用通配符