标签: aws-sam-cli

Python 中的 AWS Lambda:在 Lambda 函数处理程序中导入父包/目录

我在我的无服务器应用程序(避免混乱的最简单应用程序)中有一个类似于以下的目录结构,我使用 AWS SAM 和 Python 3.8 作为运行时创建了它:

??? common
?   ??? a.py
??? hello_world
?   ??? __init__.py
?   ??? app.py
?   ??? requirements.txt
??? template.yaml
Run Code Online (Sandbox Code Playgroud)

我想common/a.py在 Lambda 处理程序中导入模块 - hello_world/app.py。现在我知道我可以通过将路径添加到or来在 Python 中正常导入它,但是当代码在 Docker 容器内的 Lambda 中运行时它不起作用。调用时,Lambda 处理函数在目录内运行,不考虑文件夹结构。PYTHONPATHsys.path/var/task

我尝试插入/var/task/common, /var/common,/var甚至像这样/commonsys.path编程方式插入:

import sys
sys.path.insert(0, '/var/task/common')
from common.a import Alpha
Run Code Online (Sandbox Code Playgroud)

但我仍然收到错误:

ModuleNotFoundError: No module named 'common'

我知道Lambda 层,但鉴于我的场景,我想直接引用多个 Lambda 函数中的公共代码,而无需上传到层。我想serverless-python-requirements无服务器框架中但在 …

python python-3.x aws-lambda aws-sam-cli aws-sam

10
推荐指数
1
解决办法
6397
查看次数

如何使用 TypeScript 编写的 API Gateway 在 VS Code 中调试本地 AWS Lambda 函数?

我们即将开始使用 Lambda 函数。
我们有必须使用 TypeScript 的技术限制。
当从 Postman 调用相关端点时,我希望能够在 VS Code 中调试我的 ts 文件。

所以,我们有以下开发环境:

  • 视窗 10
  • Docker for Windows(使用 Hyper-V 而不是 WSL 2)
  • 打字稿 4.1
  • 节点 12.17
  • SAM CLI 1.13.2

我已经使用sam initHello World 模板来生成初始文件夹结构。
我已经对其进行了增强(主要基于本文)以使用 TypeScript。

文件夹结构

.
??? template.yaml
??? .aws-sam
??? .vscode
|   ??? launch.json
??? events
??? hello-world
|   ??? dist
|       ??? app.js
|       ??? app.js.map
|   ??? src  
|       ??? app.ts
|   ??? package.json
|   ??? tsconfig.json
Run Code Online (Sandbox Code Playgroud)

template.yaml

.
??? …
Run Code Online (Sandbox Code Playgroud)

amazon-web-services node.js typescript aws-lambda aws-sam-cli

10
推荐指数
2
解决办法
2233
查看次数

aws sam 发布/部署流程

我没有完全掌握使用 sam 发布/部署的流程。我最大的问题是我的 sam 模板声明了 aAWS::Serverless::Function并且 CodeUri 参数强制我输入 s3 存储桶 url。

我见过一些示例,其中 CodeUri 只是计算机上代码资源的路径。当我尝试这个时,萨姆抱怨道

“CodeUri”不是具有可选 versionId 查询参数的“s3://bucket/key”形式的有效 S3 Uri。

为了解决这个问题,我必须

  • 将函数的 CodeUri 更改为模板中代码的根文件夹
  • 进入AWS控制台,删除我的s3存储桶中的资源,否则sam包不会上传
  • 运行 sam package 上传我更新的代码资源
  • 复制新的 s3 资源密钥
  • 返回我的模板并将 CodeUri 替换为新的 s3 存储桶 uri
  • 运行 sam 部署

这是非常令人讨厌的。

我缺少什么?

{ 
    "Description" : "Serverless backend",
    "Transform" : "AWS::Serverless-2016-10-31",
    "Globals" : {
    },
    "Resources" : {
        "db" : {
            "Type": "AWS::RDS::DBInstance",
            "Properties" : {
                "AllocatedStorage": "20",
                "DBInstanceClass": "db.t2.micro",
                "DBName": "nameforthedb",
                "DeleteAutomatedBackups": true,
                "Engine": "postgres",
                "MasterUsername": "masterUserName",
                "MasterUserPassword": …
Run Code Online (Sandbox Code Playgroud)

aws-lambda aws-sam-cli aws-serverless

9
推荐指数
1
解决办法
9730
查看次数

如何将 PATH 导出到“sam build”命令?

我正在 PyCharm 上开发 AWS Lambda 函数。当我执行“运行”按钮时,出现以下错误消息。

/usr/local/bin/sam build MyFunction --template /Users/miyashiiii/Works/myapp/myapp/template.yaml --build-dir /Users/miyashiiii/Works/myapp/myapp/.aws-sam/build
Building codeuri: myapp/ runtime: python3.7 metadata: {} functions: ['MyFunction']

Build Failed
Error: PythonPipBuilder:Validation - Binary validation failed for python, searched for python in following locations  : ['/usr/bin/python'] which did not satisfy constraints for runtime: python3.7. Do you have python for runtime: python3.7 on your PATH?
Run Code Online (Sandbox Code Playgroud)

python3.7 在我的 PATH 上,其他一些位置在我的 PATH 上,但位置列表仅包含“/usr/bin/python”。

当我在终端上执行相同的命令(/usr/local/bin/sam build ~~)时,它成功了。

如何将 PATH 导出到“sam build”命令?

amazon-web-services pycharm aws-lambda aws-sam-cli aws-toolkit

9
推荐指数
2
解决办法
3890
查看次数

AWS SAM CLI 抛出错误:构建 docker 映像时出错

我正在尝试在我的 M1 Mac 上使用 SAM CLI。

\n

我按照这些文档中概述的步骤进行操作:

\n
sam init\ncd sam-app\nsam build\nsam deploy --guided\n
Run Code Online (Sandbox Code Playgroud)\n

我没有修改代码或 yaml 文件。\n我可以按预期启动本地 Lambda 函数:

\n
\xe2\x9e\x9c  sam-app sam local start-api\nMounting HelloWorldFunction at http://127.0.0.1:3000/hello [GET]\nYou can now browse to the above endpoints to invoke your functions. You do not need to restart/reload SAM CLI while working on your functions, changes will be reflected instantly/automatically. If you used sam build before running local commands, you will need to re-run sam build for the changes …
Run Code Online (Sandbox Code Playgroud)

python docker aws-lambda aws-sam-cli serverless

9
推荐指数
1
解决办法
4486
查看次数

IntelliJ IDEA Config cant find AWS Lambda Handler in Default 'helloworld' Application

When setting the debug configurations for the default IntelliJ IDEA Java helloworld application (created upon making a new AWS Lambda project) the following response is shown:

Error: Cannot find handler 'helloworld.App::handleRequest' in project."

To fix this I've tried editing 'Handler' element inside template.yaml to include a filepath, though there had been no success.

Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: HelloWorldFunction
      Handler: helloworld.App::handleRequest
Run Code Online (Sandbox Code Playgroud)

I noticed the Python AWS Lambda helloworld project (within the PyCharm counterpart) required me to change the root …

java intellij-idea aws-lambda aws-sam-cli aws-toolkit

8
推荐指数
1
解决办法
810
查看次数

Git bash 不会解析“sam”命令

我用的是最新的Win10。安装 AWS-SAM-CLI 并使用以下命令测试安装后:

sam --version
Run Code Online (Sandbox Code Playgroud)

我收到消息

bash: sam: 命令未找到

但是,当我使用 Powershell、cmd 或 ConEmu 时,它们都可以解析“sam”。

路径是“e/Program Files/Amazon/AWSSAMCLI/bin”,但其他命令如“yarn”工作正常,也安装在“e/Program Files/...”

有任何想法吗?谢谢

git-bash aws-sam-cli

8
推荐指数
3
解决办法
3280
查看次数

使用 SAM 时,AWS sam build 和 sam package 有什么区别?

我正在构建一些无服务器应用程序并尝试使用 SAM。我一直在浏览一些教程和一些使用sam build,而其他人使用sam package.

这些命令之间有什么区别?似乎 sam 包更难使用。

amazon-web-services aws-lambda aws-sam-cli aws-serverless aws-sam

8
推荐指数
1
解决办法
2287
查看次数

AWS SAM - 配置 TOML 文件

使用 AWS SAM 在堆栈上进行部署并通过 GitHub 操作进行部署,并尝试使用 Config TOML 文件并在部署命令中指定配置环境,但我遇到了一个问题,它似乎只是忽略了我的情况在部署命令中指定。我只能猜测我做错的唯一一件事是我实际上无法使用这些或者我将它放在错误的位置,但我将非常感谢有关此事的任何帮助。在类似的示例或文档方面没有找到太多内容。

sam deploy --stack-name mySuperAwesomeStuff \
--region ${{ secrets.AWS_REGION }} \
--confirm-changeset \
--config-file ./functions/function1/function1.toml \
--config-env nonprod \
--template-file ./functions/function1/template.yaml
Run Code Online (Sandbox Code Playgroud)

理想情况下,我希望将该区域从那里取出并放入 TOML 文件以及堆栈名称中。

我的 TOML 文件如下所示:

[nonprod.deploy.parameters]
stack_name="super-awesome-stack-name"
region="us-east-2"
confirm_changeset=true
cababilities="CABILITIES_IAM"
Run Code Online (Sandbox Code Playgroud)

再次,似乎完全忽略了我尝试使用配置文件,我不确定我在这里缺少什么。

aws-sam-cli aws-sam

8
推荐指数
1
解决办法
2万
查看次数

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

我正在使用 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
Run Code Online (Sandbox Code Playgroud)

当我跑步时:

> sam build && sam local start-api
Run Code Online (Sandbox Code Playgroud)

我可以看到端点正在工作:

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

lambda_handler但是,当我对内部的函数进行更改时./hello_world/app.py, 的响应curl http://localhost:3000保持不变。不会发生热重载。

我发现的唯一解决方案是针对每个代码更改运行sam build。这极大地减慢了开发时间——由于 内部的一些依赖关系requirements.txt,我必须等待 1-2 分钟来构建每个代码更改。我可以只处理 …

amazon-web-services aws-sam-cli aws-serverless aws-sam

8
推荐指数
2
解决办法
8556
查看次数