Amazon Web Services (AWS) Lambda 是一种基于使用情况的计算服务,可以运行 Python 3 代码。在您运行应用程序的任何环境中都可能发生错误,因此有必要进行可靠的监控,以便在出现问题时能够看到。
在这篇文章中,我们将安装和配置 Sentry 的应用程序监控服务,该服务专门用于在 AWS Lambda 上运行的代码。
应用依赖
学习本教程不需要本地开发环境,因为所有编码和配置都可以通过 AWS 控制台在 Web 浏览器中进行。
示例代码可以从这篇博文中复制和粘贴,或者您可以在 GitHub 上的 monitor-python-aws-lambda-sentry 目录中的 Full Stack Python blog-post-examples 存储库下访问它。
访问 AWS Lambda 服务
登录您现有的 AWS 账户或注册一个新账户。 Lambdag 为您免费提供前 100 万个请求,以便您可以免费或以低成本执行基本应用程序。
当您登录到您的帐户时,使用搜索框输入“lambda”并在出现正确页面时选择“Lambda”。
如果您之前已经使用过 Lambda,您将在可搜索的表格中看到您现有的 Lambda 函数。我们将创建一个新函数,因此请单击“创建函数”按钮。
创建函数页面将为您提供多个启动新 Lambda 函数的选项。
单击“浏览无服务器应用程序存储库”选择框,然后从“公共应用程序”部分中选择“hello-world-python3”启动应用程序。
hello-world-python3 入门应用程序详细信息页面应类似于以下屏幕:
在IdentityNameParameter
下填写一些示例文本,例如“test”,然后单击“Deploy”按钮:
现在将部署函数。一旦准备就绪,我们就可以对其进行自定义并进行测试,然后再添加 Sentry 以捕获执行期间发生的任何错误。
测试入门 Python 应用
返回 Lambda 函数主页并从列表中选择您新部署的启动器应用程序。
如下图所示,找到旁边带有向下箭头的橙色“测试”按钮,然后单击向下箭头。选择“配置测试事件”。
将事件名称填写为“FirstTest”或类似名称,然后按模式窗口底部的“创建”按钮。
单击“测试”按钮,它将使用来自该新测试事件的参数运行 Lambda 函数。您应该会看到类似于以下输出的内容:
Response "value1" Function Logs START RequestId: 62fa2f25-669c-47b7-b4e7-47353b0bd914 Version: $LATEST value1 = value1 value2 = value2 value3 = value3 END RequestId: 62fa2f25-669c-47b7-b4e7-47353b0bd914 REPORT RequestId: 62fa2f25-669c-47b7-b4e7-47353b0bd914 Duration: 0.30 ms Billed Duration: 1 ms Memory Size: 128 MB Max Memory Used: 43 MB Init Duration: 1.34 ms Request ID 62fa2f25-669c-47b7-b4e7-47353b0bd914
这意味着测试用例是成功的,但是即使代码中存在直接错误(例如尝试访问未声明的变量)会发生什么情况?
进入代码编辑器,您应该会看到像这样的起始代码:
使用新突出显示的行更新代码,该行尝试访问第四个变量,我们尝试运行它的测试配置中不存在该变量。
import json print('Loading function') def lambda_handler(event, context): #print("Received event: " + json.dumps(event, indent=2)) print("value1 = " + event['key1']) print("value2 = " + event['key2']) print("value3 = " + event['key3']) print("value4 = " + event['key4']) return event['key1'] # Echo back the first key value #raise Exception('Something went wrong')
添加一行新代码后,点击“部署”按钮,然后点击“测试”按钮。您应该会看到一些错误输出:
Response { "errorMessage": "'key4'", "errorType": "KeyError", "stackTrace": [ [ "/var/task/lambda_function.py", 11, "lambda_handler", "print(\"value4 = \" + event['key4'])" ] ] } Function Logs START RequestId: a4e956bd-cce4-403e-b5e7-e95bc3ffa2cb Version: $LATEST value1 = value1 value2 = value2 value3 = value3 'key4': KeyError Traceback (most recent call last): File "/var/task/lambda_function.py", line 11, in lambda_handler print("value4 = " + event['key4']) KeyError: 'key4' END RequestId: a4e956bd-cce4-403e-b5e7-e95bc3ffa2cb REPORT RequestId: a4e956bd-cce4-403e-b5e7-e95bc3ffa2cb Duration: 0.81 ms Billed Duration: 1 ms Memory Size: 128 MB Max Memory Used: 43 MB Init Duration: 1.61 ms Request ID a4e956bd-cce4-403e-b5e7-e95bc3ffa2cb
当我们在控制台中工作时,很明显发生了一个错误。然而,在大多数情况下,错误会偶尔发生,这就是为什么我们需要一个监控系统来捕获和报告这些异常。
使用 Sentry 监控 AWS Lambda 功能
为此应用程序将 Sentry 添加到 Lambda 的最简单方法是配置一个 AWS Lambda 层,其中包含 Sentry 的必要依赖项。 Sentry 有关于通过 Lambda 层添加的简明文档,所以我们将通过这种方式来配置它并进行测试。
首先,在您的 Lambda 函数配置中向下滚动到“层”部分。单击“添加层”按钮“:
在“添加层”屏幕中,选择“指定 ARN”选项。
现在要指定 Amazon 资源名称 (ARN),我们需要使用 Sentry 文档来获取正确的配置字符串。
US-East-1 是最古老和最常用的区域,因此我将在本教程中使用它,但如果您不确定,您应该检查您所在的区域。
将该值复制到 Lambda 层配置中,如下所示:
然后按“添加”按钮。现在您的环境中有了 Sentry 依赖项,因此可以在 Lambda 函数中使用依赖于该库的代码。
接下来我们需要进入 Sentry 仪表板创建一个项目,获取我们的唯一标识符,并将其连接到我们的 Lambda 函数。
Sentry 可以通过 Sentry.io 自托管或用作云服务。我们将使用云托管版本,因为它比设置您自己的服务器更快,而且对于较小的项目是免费的。
转到 Sentry.io 的主页。
登录您的帐户或注册一个新的免费帐户。登录或完成 Sentry 注册过程后,您将进入主帐户仪表板。
我们的帐户控制面板上还没有记录任何错误,这符合预期,因为我们尚未将我们的帐户连接到我们的 Lambda 函数。
点击左侧导航栏的“项目”,然后点击右上角的“创建项目”。
在“选择平台”下,选择“无服务器”,然后选择“AWS Lambda (Python)”,如下所示:
决定它应该根据什么标准从 Lambda 中发送错误信息。对于本教程,我们将让它发送每个异常。然后单击“创建项目”。按钮。
您可以让 Sentry 自动处理检测,但我们将为我们的函数手动处理。在下一个屏幕上,Sentry 将为您提供您唯一的 DSN 字符串,我们的功能将需要它。
通常,您会希望在 AWS Lambda 上使用环境变量来存储和访问 Sentry 密钥等值。
复制 Sentry DSN 字符串的内容,进入 Lambda 控制台创建一个新的环境变量。为此,请单击 Lambda 中的“配置”选项卡,如下所示:
然后单击“编辑”并使用 SENTRY_DSN
键和您从 Sentry 屏幕复制的 DSN 字符串的值添加一个新的环境变量。
单击“保存”按钮并返回到您的 Lambda 函数代码。
使用以下突出显示的新代码行更新您的 Lambda 函数,以将错误发送到 Sentry。
import json import os import sentry_sdk from sentry_sdk.integrations.aws_lambda import AwsLambdaIntegration SENTRY_DSN = os.environ.get('SENTRY_DSN') sentry_sdk.init( dsn=SENTRY_DSN, integrations=[AwsLambdaIntegration()] ) print('Loading function') def lambda_handler(event, context): #print("Received event: " + json.dumps(event, indent=2)) print("value1 = " + event['key1']) print("value2 = " + event['key2']) print("value3 = " + event['key3']) print("value4 = " + event['key4']) return event['key1'] # Echo back the first key value #raise Exception('Something went wrong')
单击“部署”按钮,然后单击“测试”。该代码将抛出错误,当我们返回到 Sentry 仪表板时,我们将看到它被捕获并可以查看以供进一步检查。
有效!接下来,您可能希望调整异常报告标准,以确保在您不想看到所有异常时收到正确数量的异常警报。
下一步是什么?
我们刚刚在 AWS Lambda 上编写并执行了一个 Python 3 函数,然后将异常消息捕获到 Sentry 日志中。您现在可以继续构建您的 Python 代码,因为您知道当出现问题时您将完全了解发生了什么。
查看 AWS Lambda 部分,了解其他开发人员提供的更多教程。
还有问题吗?在 Twitter@fullstackpython 或@mattmakai 上联系我。我也在 GitHub 上,用户名是 mattmakai。
这篇文章有问题吗?在 GitHub 上创建此页面的源代码并提交拉取请求。