Tag: aws lambda

在Lambda – > CloudWatch中,多行日志记录如何工作?

我的多行日志记录事件最终都是多事件 – 每行一个事件。 根据文件 : 每次调用LambdaLogger.log()都会导致CloudWatch Logs事件… 但是之后: 但是请注意,AWS Lambda会将System.out和System.err返回的每一行视为一个单独的事件。 看看LambdaAppender的源代码 ,看来它仍然会将事件记录到System.out 。 那么这是否意味着多线消息将总是被分解成多个事件? 我已经阅读了有关配置multi_line_start_pattern的内容 ,但似乎只适用于部署日志代理,而这在Lambda中是不可访问的。 [编辑] LambdaAppender记录到记录到System.out LambdaLogger 。 [编辑]我find了一些建议解决方法的post – 在打印邮件时使用“\ r”作为eol。 这似乎适用于我的代码产生的消息。 堆栈跟踪记录到处都是一个问题。 [编辑] 我一直在使用两种解决方法 : 在JSON中记录复杂的数据结构(例如相当大的地图)。 CloudWatch实际上可以识别日志事件中的JSON字符串,并将其打印出来。 用’\ r’替换’\ n’。 对于堆栈跟踪,我创建了一个实用程序方法(这是在Kotlin中,但是这个方法足够通用): fun formatThrowable(t: Throwable): String { val buffer = StringWriter() t.printStackTrace(PrintWriter(buffer)) return buffer.toString().replace(“\n”, “\r”) } 我认为从长远来看,一个更理想的解决方案将是装饰ConsoleAppender的Appender实现,它将对所有通过的消息进行替换。

AWS Lambda出现意外的行为

我做了什么 我使用aws-kotlin-jvm-maven模板创建了一个使用无服务器cli的项目。 之后,我用这种方式编辑了我的serverless.yml模板: service: test provider: name: aws runtime: java8 region: eu-west-1 package: artifact: target/test-1.0.0.jar functions: hello: handler: com.example.Handler events: – schedule: rate(2 minutes) 我已经这样编辑我的Handler: class Handler:RequestHandler<Map, ApiGatewayResponse> { override fun handleRequest(input:Map, context:Context):ApiGatewayResponse { BasicConfigurator.configure() LOG.info(“Hello, World!”) return ApiGatewayResponse() } companion object { private val LOG = Logger.getLogger(Handler::class.java) } } 我期待着我的Lambda每两分钟运行一次,记录一个“Hello,World!” 在CloudWatch上,每2分钟一次。 我的问题 我在cloudWatch日志中find的是以下内容: 第一轮:“你好,世界!” […]

不能使用来自Lambda的SQS

我做了什么: 我正在创建一个计划的lambda示例,需要从SQS队列中取消消息。 我已经使用无服务器框架和Kotlin创建了以下配置: service: example provider: name: aws runtime: java8 region: eu-west-1 memorySize: 128 environment: sqs_url: Ref: MessagesQueue iamRoleStatements: – Effect: Allow Action: – sqs:* Resource: Fn::GetAtt: [ MessagesQueue, Arn ] package: artifact: target/example-1.0.0.jar functions: dequeue: handler: com.example.Handler events: – schedule: rate(2 minutes) resources: Resources: MessagesQueue: Type: AWS::SQS::Queue Properties: QueueName: ${self:service}-queue 这是Handler类: package com.example import […]

AWS Lambda Java / Kotlin发送消息给SQS

我一直在使用Kotlin创建一个AWS Lambda函数。 该函数运行良好,但似乎无法发送SQS消息到FIFO队列。 我在Cloudwatch中收到以下消息: REPORT RequestId: 9119da93-e775-11e7-820a-5bbbb7403f93 Duration: 10010.16 ms Billed Duration: 10000 ms Memory Size: 128 MB Max Memory Used: 54 MB 2017-12-23T00:09:49.483Z 9119da93-e775-11e7-820a-5bbbb7403f93 Task timed out after 10.01 seconds 我已经重写了我的代码使用节点JS,它执行良好,我有相关的权限设置的lambda函数,通过控制台权限模拟器测试好措施,把消息放在指定的队列。 由于它在Node中完全正常工作,所以我不得不假定我的Java / Kotlin版本有问题。 如果我删除下面的代码,该function到达结束,并返回正常。 我已经尝试了各种方法来创建客户端(包括不推荐使用的选项)和EnvironmentVariableCredentialsProvider和DefaultAWSCredentialsProviderChain 。 我也尝试增加超时到20秒,但是这也没有任何区别。 任何想法,将不胜感激! val sqs = AmazonSQSClientBuilder.standard() .withRegion(Regions.US_WEST_2) .withCredentials(DefaultAWSCredentialsProviderChain()) .build() val sendMessageRequest = SendMessageRequest() .withMessageDeduplicationId(“deduplicationId”) .withMessageGroupId(“test”) .withQueueUrl(“https://sqs.us-west-2.amazonaws.com/00000000/test.fifo”) .withMessageBody(“test”) […]

我可以异步地通过Amazon API网关启动长时间运行的AWS Lambda流程吗?

我需要启动一个长时间运行的AWS Lambda作业(几分钟),将其输出写入S3。 它将用Java编写(实际上是Kotlin,但这不重要)。 我正在调查Amazon API网关作为此AWSLambda作业与其他AWS Lambda作业之间的接口以及与之通信的iOS移动应用程序。 是否有可能异步调用这种长时间运行的Lambda进程,无论是直接从API网关还是从另一个Lambda函数?