AWS Academy Learner Lab 是提供一个帐号让学生可以自行使用 AWS 的服务,让学生可以在 100 USD的金额下,自行练习所要使用的 AWS 服务,如何进入 Learner Lab 请参考 使用 Learner Lab - 学生,而这篇文章是使用 CloudWatch 进行排错,搭配 API Gateway 与 Lambda,透过 API Gateway 接收 GET 请求,而 Lambda 接收到请求后,取得请求字串并以 JSON 的格式回传。
在 AWS 网页控制台 上方的搜寻图示中输入 Lambda ,单击 Lambda 服务,如下图所示。
图 1. AWS 网页控制台中找寻 Lambda 服务
单击 创建函数 服务,如下图所示。
图 2. 创建 Lambda 函数
设定 Lambda 函数如下
图 3. 设定 Lambda 函数
因为这次代码的功能为读取用户透过 HTTP GET 请求所传递过来的参数列,代码如下:
import json
def lambda_handler(event, context):
# 请求为 GET
if event['httpMethod']=='GET':
result = event['queryStringParameters']
else:
result = "method not allowed"
# TODO implement
return {
'statusCode': 200,
'body': json.dump(result) # 故意打错字,应该是dumps
}
修改完毕后单击 Deploy (布署),必须要先布署才算是将代码布署到云计算中。这次故意在代码中写错,因为只是布署,没有运行也不会发现错误所在。
在 Lambda 主画面上方找到添加触发器按钮,如下图所示。
图 4. 在 Lambda 主画面中进行添加触发器
进入添加触发器画面,配置如下:
添加触发器
图 5. 在添加触发器画面中进行 API Gateway 配置
添加触发器后可以在配置中查看触发器的结果,如下图所示。
图 6. 在配置中查看触发器
复制上图中的 API endpoint,开启一个空白网页,贴上网址并输入要传递的参数 ?name=叶 ,得到的画面如下所示,显示了一个内部错误。
图 7. 使用浏览器观看运行结果
但是很遗憾的是这个代码是 API Gateway 收到用户的请求后,将数据透过 Lambda 中的 lambda_handler(event, context) 函数的 event 这个参数来传递,所以 Lambda 开发者也没办法透过测试来找出代码中的错误,于是我们需要借助 CloudWatch 来检视 Lambda 的执行状况。
在 AWS 网页控制台 上方的搜寻图示中输入 CloudWatch ,单击 CloudWatch 服务,如下图所示。
图 8. AWS 网页控制台中找寻 CloudWatch 服务
在 CloudWatch 主画面左边的导航栏中找到日志组 (logs),接著找到对应的 lambda 函数日志组。
图 9. 在 CloudWatch 主画面中找到日志组 (logs)
在日誌組下方的日志流找到相对应的时间,单击该日志流。
图 10. 在日志流找到时间相对应的纪录
找到引发错误的日志记录,可以单击来打开看详细信息,以本例来说在 2022-12-04T14:28:50.938 这个时间点, lambda_function.py 这只程式的第 12 行出现了错误信息,主要是由 dump 这个方法所引起。
图 11. 在日志流找到时间相对应的纪录
于是回到步骤 2. 将原来的 Lambda 函数中的第 12 行代码修改,重新布署(Deploy)一次。
# 原先的
'body': json.dump(result)
# 修改后
'body': json.dumps(result)
再次使用浏览器观看运行结果,就可以得到预期的结果,如下图所示。
图 12. 使用浏览器观看运行结果
感谢亚马逊云科技王向炜 Alan Wang 提供的协助。