包括 aws-sam 中的本地源代码目录和文件?

cos*_*iry 5 python amazon-web-services aws-lambda aws-sam-cli aws-sam

我在一个单一存储库工作,其中有一个AWS SAM (lambda) 应用程序。结构或多或少像这样:

\n\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 my_folder1\n  \xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 file1.py\n\xc2\xa0   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n \xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 file2.py\n \xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 my_folder2\n \xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 my_folder3\n \xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n \xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 file3.py\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 sam-app\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 events\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 event.json\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 README.md\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 samconfig.toml\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 template.yaml\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 tests\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 hello_world\n    \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n    \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 requirements.txt\n                :preview:\n                numpy\n                pandas\n                ...\n    \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 app.py\n                :preview:\n                import pandas\n                from my_folder1.my_folder2.my_folder3.file3 import MyClass\n                ...\n\n    .\n    .\n    .\n    more_folders...\n    .\n    .\n    .\n
Run Code Online (Sandbox Code Playgroud)\n\n

您可以将我的申请分为三个部分:

\n\n
    \n
  1. 外部 pip 包,例如pandasnumpy等。这些包很少更改。有时我会添加一个新的。它们需要很长时间才能安装。它们需要构建在与 lambda 运行时相对应的 docker 容器中(任何使用过 numpy/pandas 的人都已经学会了这一点)。
  2. \n
  3. Mono 存储库中的源代码,从我的 lambda 隐式调用。因此,如果您按照上面的预览进行操作。\nmy_folder1.my_folder2.my_folder3.file3可能如下所示:

    \n\n
    .\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 my_folder1\n  \xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 file1.py\n\xc2\xa0   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n \xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 file2.py\n \xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 my_folder2\n \xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 my_folder3\n \xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n \xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 file3.py\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 sam-app\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 events\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 event.json\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 README.md\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 samconfig.toml\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 template.yaml\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 tests\n    \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 hello_world\n    \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n    \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 requirements.txt\n                :preview:\n                numpy\n                pandas\n                ...\n    \xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 app.py\n                :preview:\n                import pandas\n                from my_folder1.my_folder2.my_folder3.file3 import MyClass\n                ...\n\n    .\n    .\n    .\n    more_folders...\n    .\n    .\n    .\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    此代码经常更改。不需要构建 docker 镜像。

  4. \n
  5. 我的实际 lambda 代码由处理程序显式调用:./my_folder1/sam-app/hello_world/app.py
  6. \n
\n\n

假设我运行该sam build --use-container命令。这很棒!它创建.aws-sam/build/MyFunction/pandas.aws-sam/build/MyFunction/numpy等。这些 pip 包是针对 amazon-linux 构建的,可以由 lambda 使用。问题是我的本地导入(例如from my_folder1.my_folder2.my_folder3.file3 import MyClass)显然会失败。

\n\n

我的问题是:是否可以使用现有模板规范将我的代码的本地导入同步到我的 sam 应用程序? 有关模板规范的最佳文档

\n\n

附加信息:

\n\n
    \n
  • 目前我如何解决这个问题?\n我编写如下所示的 bash 脚本并在之后运行它们sam build --use-container

    \n\n
    .\n.\n.\nrsync "${EXCLUSIONS[@]}" -r $LOCAL_MODULES0 $LOCAL_MODULES1 ./.aws-sam/build/${FUNCTION}/my_folder2\nrsync "${EXCLUSIONS[@]}" -r $LOCAL_MODULES2 $LOCAL_MODULES3 ./.aws-sam/build/${FUNCTION}/\n.\n.\n.\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    它将相关的本地目录复制/同步到构建目录中,看起来就像是 pip 安装的一样。因为 lambda 必须已经在 python 路径中具有该文件夹。

    \n\n

    我也有一个专门用于./my_folder1/sam-app/hello_world/.

  • \n
  • 糟糕的事情:

    \n\n
      \n
    • 由于 pip 包太大,您无法在 UI 中查看 lambda 函数代码。如果它们是层并且放在 /opt/python 而不是 /var/task 中,这实际上是可能的。
    • \n
  • \n
  • 我想要的东西:

    \n\n
      \n
    • sam build --use-container --dependencies- 在 docker 镜像上构建外部包(使用 pip 安装的东西)。需要很长时间,但只需要完成一次(除非删除/添加依赖项)。
    • \n
    • sam build- 由于--dependencies未指定,仅将代码./my_folder1/sam-app/hello_world/与 template.yaml 中指定的任何本地目录一起安装
    • \n
    • template.yaml 中的预构建命令。提高可定制性。
    • \n
    • sam local invoke- 应该sam build && sam local invoke
    • \n
    • 默认情况下,外部依赖项(例如 pip 包)应分层。上传到s3。
    • \n
  • \n
\n