AWS / LocalStack:如何 verify/debug (失败)执行 Lambda?
AWS / LocalStack: How to verify/debug (failure of) execution of Lambda?
我正在学习 AWS,而且在我的领域之外,这通常是嵌入式软件。在几天没有牵引力之后,我从软件工程移植这个问题。
Problem/question:在尝试设置文件添加触发 Lambda 的 S3 存储桶时,如何调试或跟踪从文件添加到 SNS 通知到 Lambda 执行的事件序列?
我正在尝试设置以下内容:
- 有人向 S3 存储桶添加内容
- 文件添加会触发 Lambda,它将文件添加到 git 存储库
(更具体地说:文件添加会触发有关订阅 Lambda 的主题的 SNS 通知——我觉得这比 S3 存储桶由于解耦而直接调用 Lambda“更好”)
我对所有内容都使用 AWS CLI
,在不久的将来,我仅限于使用 LocalStack
来替代“真正的”AWS。
到目前为止我做了什么(简体):
- 创建了我的存储桶(
aws s3 mb my-bucket --endpoint-url=http://localhost:4572
)
- 创建了一个带有附加角色策略的“hello-world”Lambda
aws:policy/AWSLambdaFullAccess
- 添加了对 Lambda 的权限 (
aws lambda add-permission --function-name first_lambda --action lambda:InvokeFunction --statement-id sns-invoke-lambda --principal sns.amazonaws.com --endpoint-url=http://localhost:4574
)
- 创建了 SNS 主题(
aws sns create-topic --name my-topic --endpoint-url=http://localhost:4575
)
- 已将我的 Lambda 订阅到该主题 (
aws sns subscribe --topic-arn arn:aws:sns:us-east-1:000000000000:my-topic --protocol lambda --notification-endpoint arn:aws:lambda:us-east-1:000000000000:function:first_lambda --endpoint-url=http://localhost:4575
)
- 配置了一个 put-bucket-notification-configuration (
aws s3api put-bucket-notification-configuration --bucket my-bucket --notification-configuration file://s3-ObjectCreated_notify.json --endpoint-url=http://localhost:4572
)
- 已验证能够上传和下载 to/from 我的存储桶
- 已验证能够手动调用我的 Lambda (
aws lambda invoke --function-name first_lambda outfile.txt --endpoint-url=http://localhost:4574
)
这是我的“hello-world”Lambda 函数,由 here and here:
天真地拼凑而成
import json
def lambda_handler(event, context):
print("Hello from Lambda!")
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
这是我的 put-bucket-notification-configuration 文件:
{
"TopicConfigurations": [
{
"TopicArn": "arn:aws:sns:us-east-1:000000000000:my-topic",
"Events": [
"s3:ObjectCreated:*"
]
}
]
}
我的问题是:我不确定如何测试 我尝试构建的从 S3 Bucket 到 Lambda 调用的“管道”是成功还是失败。
(请纠正误解:)如果我手动调用Lambda函数,“执行上下文”是我发出AWS的shell CLI 请求。但是当“执行上下文”是我从 S3 Bucket 构建到 SNS 通知到 Lambda 的“管道”时,我不明白 Lambda 的 print
语句或 return-status 将被定向到哪里至。 IE。当我手动调用 Lambda 时,我的 shell 获得 return-状态,并且 print
语句似乎被定向到我指定的输出文件;例如:
$ aws lambda invoke --function-name first_lambda outfile.txt --endpoint-url=http://localhost:4574
{
"StatusCode": 200
}
...但是我如何在存储桶对象创建到 SNS 通知到 Lambda 调用之间测试端到端功能或失败,因为没有 print
s 的输出文件被定向到,并且没有 return 状态的“上下文”?
打印语句的输出会清楚地记录在 AWS CloudWatch 上,每个错误也会记录在那里。
因此请务必访问 cloudwatch 并查看幕后发生的情况。
文档:https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/index.html
我正在学习 AWS,而且在我的领域之外,这通常是嵌入式软件。在几天没有牵引力之后,我从软件工程移植这个问题。
Problem/question:在尝试设置文件添加触发 Lambda 的 S3 存储桶时,如何调试或跟踪从文件添加到 SNS 通知到 Lambda 执行的事件序列?
我正在尝试设置以下内容:
- 有人向 S3 存储桶添加内容
- 文件添加会触发 Lambda,它将文件添加到 git 存储库 (更具体地说:文件添加会触发有关订阅 Lambda 的主题的 SNS 通知——我觉得这比 S3 存储桶由于解耦而直接调用 Lambda“更好”)
我对所有内容都使用 AWS CLI
,在不久的将来,我仅限于使用 LocalStack
来替代“真正的”AWS。
到目前为止我做了什么(简体):
- 创建了我的存储桶(
aws s3 mb my-bucket --endpoint-url=http://localhost:4572
) - 创建了一个带有附加角色策略的“hello-world”Lambda
aws:policy/AWSLambdaFullAccess
- 添加了对 Lambda 的权限 (
aws lambda add-permission --function-name first_lambda --action lambda:InvokeFunction --statement-id sns-invoke-lambda --principal sns.amazonaws.com --endpoint-url=http://localhost:4574
) - 创建了 SNS 主题(
aws sns create-topic --name my-topic --endpoint-url=http://localhost:4575
) - 已将我的 Lambda 订阅到该主题 (
aws sns subscribe --topic-arn arn:aws:sns:us-east-1:000000000000:my-topic --protocol lambda --notification-endpoint arn:aws:lambda:us-east-1:000000000000:function:first_lambda --endpoint-url=http://localhost:4575
) - 配置了一个 put-bucket-notification-configuration (
aws s3api put-bucket-notification-configuration --bucket my-bucket --notification-configuration file://s3-ObjectCreated_notify.json --endpoint-url=http://localhost:4572
) - 已验证能够上传和下载 to/from 我的存储桶
- 已验证能够手动调用我的 Lambda (
aws lambda invoke --function-name first_lambda outfile.txt --endpoint-url=http://localhost:4574
)
这是我的“hello-world”Lambda 函数,由 here and here:
天真地拼凑而成import json
def lambda_handler(event, context):
print("Hello from Lambda!")
return {
'statusCode': 200,
'body': json.dumps('Hello from Lambda!')
}
这是我的 put-bucket-notification-configuration 文件:
{
"TopicConfigurations": [
{
"TopicArn": "arn:aws:sns:us-east-1:000000000000:my-topic",
"Events": [
"s3:ObjectCreated:*"
]
}
]
}
我的问题是:我不确定如何测试 我尝试构建的从 S3 Bucket 到 Lambda 调用的“管道”是成功还是失败。
(请纠正误解:)如果我手动调用Lambda函数,“执行上下文”是我发出AWS的shell CLI 请求。但是当“执行上下文”是我从 S3 Bucket 构建到 SNS 通知到 Lambda 的“管道”时,我不明白 Lambda 的 print
语句或 return-status 将被定向到哪里至。 IE。当我手动调用 Lambda 时,我的 shell 获得 return-状态,并且 print
语句似乎被定向到我指定的输出文件;例如:
$ aws lambda invoke --function-name first_lambda outfile.txt --endpoint-url=http://localhost:4574
{
"StatusCode": 200
}
...但是我如何在存储桶对象创建到 SNS 通知到 Lambda 调用之间测试端到端功能或失败,因为没有 print
s 的输出文件被定向到,并且没有 return 状态的“上下文”?
打印语句的输出会清楚地记录在 AWS CloudWatch 上,每个错误也会记录在那里。
因此请务必访问 cloudwatch 并查看幕后发生的情况。
文档:https://docs.aws.amazon.com/cli/latest/reference/cloudwatch/index.html