首页 > 解决方案 > '无服务器调用 -f hello' 给出 KeyError

问题描述

我正在按照教程学习如何使用无服务器框架。目标是部署一个 Django 应用程序。本教程建议将必要的环境变量放在单独的 yml 文件中。不幸的是,按照教程让我得到了一个 KeyError。我有一个 serverless.yml、variables.yml 和一个 handler.py。我将 incert 下面的所有代码以及给定的错误。

无服务器.yml:

service: serverless-django
custom: ${file(./variables.yml)}
provider:
  name: aws
  runtime: python3.8
functions:
  hello:
    environment: 
      - THE_ANSWER: ${self:custom.THE_ANSWER}
    handler: handler.hello

变量.yml:

THE_ANSWER: 42

处理程序.py:

import os

def hello(event, context):
    return {
        "statusCode": 200,
        "body": "The answer is: " + os.environ["THE_ANSWER"]
    }

我的终端中的错误:

{
    "errorMessage": "'THE_ANSWER'",
    "errorType": "KeyError",
    "stackTrace": [
        "  File \"/var/task/handler.py\", line 7, in hello\n    \"body\": \"The answer is: \" + os.environ[\"THE_ANSWER\"]\n",
        "  File \"/var/lang/lib/python3.8/os.py\", line 675, in __getitem__\n    raise KeyError(key) from None\n"
    ]
}
 
  Error --------------------------------------------------
 
  Error: Invoked function failed
      at AwsInvoke.log (/snapshot/serverless/lib/plugins/aws/invoke/index.js:105:31)
      at AwsInvoke.tryCatcher (/snapshot/serverless/node_modules/bluebird/js/release/util.js:16:23)
      at Promise._settlePromiseFromHandler (/snapshot/serverless/node_modules/bluebird/js/release/promise.js:547:31)
      at Promise._settlePromise (/snapshot/serverless/node_modules/bluebird/js/release/promise.js:604:18)
      at Promise._settlePromise0 (/snapshot/serverless/node_modules/bluebird/js/release/promise.js:649:10)
      at Promise._settlePromises (/snapshot/serverless/node_modules/bluebird/js/release/promise.js:729:18)
      at _drainQueueStep (/snapshot/serverless/node_modules/bluebird/js/release/async.js:93:12)
      at _drainQueue (/snapshot/serverless/node_modules/bluebird/js/release/async.js:86:9)
      at Async._drainQueues (/snapshot/serverless/node_modules/bluebird/js/release/async.js:102:5)
      at Immediate._onImmediate (/snapshot/serverless/node_modules/bluebird/js/release/async.js:15:14)
      at processImmediate (internal/timers.js:456:21)
      at process.topLevelDomainCallback (domain.js:137:15)
 
     For debugging logs, run again after setting the "SLS_DEBUG=*" environment variable.
 
  Get Support --------------------------------------------
     Docs:          docs.serverless.com
     Bugs:          github.com/serverless/serverless/issues
     Issues:        forum.serverless.com
 
  Your Environment Information ---------------------------
     Operating System:          linux
     Node Version:              12.18.1
     Framework Version:         2.0.0 (standalone)
     Plugin Version:            4.0.2
     SDK Version:               2.3.1
     Components Version:        3.1.2

我正在尝试的命令是'sls invoke -f hello'。命令“sls deploy”已成功执行。

我是无服务器的新手,所以请让我知道如何解决这个问题,或者是否需要更多信息。

标签: serverless-frameworkserverlessaws-serverless

解决方案


首先yml脚本有错误:

无服务器错误 ----------------------------------------

环境变量 0 中的无效字符

错误是将环境变量定义为数组而不是键值对

然后在部署之后,一切顺利(sls deploy -v

sls 调用 --f 你好

{ "statusCode": 200, "body": "答案是:42" }


无服务器.yml

service: sls-example

custom: ${file(./variables.yml)}

provider:
  name: aws
  runtime: python3.8

functions:
  hello:
    environment:
        THE_ANSWER: ${self:custom.THE_ANSWER}
    handler: handler.hello

变量.yml

THE_ANSWER: 42

推荐阅读