[英]Can't use SQS from Lambda
我做了什么:
我正在創建一個示例計划的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 com.amazonaws.services.lambda.runtime.Context
import com.amazonaws.services.lambda.runtime.RequestHandler
import org.slf4j.LoggerFactory
import com.amazonaws.services.sqs.AmazonSQSClientBuilder
class Handler:RequestHandler<Map<String, Any>, Any> {
override fun handleRequest(input:Map<String, Any>, context:Context):Any {
LOG.info("Initializing SQS Client...")
val sqs = AmazonSQSClientBuilder.defaultClient()
LOG.info("SQS Client Initialized!")
return Any()
}
companion object {
private val LOG = LoggerFactory.getLogger(Handler::class.java)
}
}
我在我的POM上使用以下AWS依賴項:
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-sqs</artifactId>
<version>1.11.251</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-lambda-java-core</artifactId>
<version>1.1.0</version>
</dependency>
我的問題:
我的lambda記錄如下:
START RequestId: ac75e49e-e56e-11e7-ba03-39085056ac2f Version: $LATEST
[2017-12-20 10:15:18.015] ac75e49e-e56e-11e7-ba03-39085056ac2f INFO c.p.Handler - Initializing SQS Client...
END RequestId: ac75e49e-e56e-11e7-ba03-39085056ac2f
REPORT RequestId: ac75e49e-e56e-11e7-ba03-39085056ac2f Duration: 6006.13 ms Billed Duration: 6000 ms Memory Size: 128 MB Max Memory Used: 60 MB
2017-12-20T10:15:23.185Z ac75e49e-e56e-11e7-ba03-39085056ac2f Task timed out after 6.01 seconds
因此,當我嘗試初始化SQS客戶端時,基本上會發生一些不好的事情,因為我看不到“完成”日志,導致Lambda超時。
我已經搜索了一些使用java作為一個出列的簡單lambda的工作示例,但我找不到任何有價值的東西,只有沒有lambdas的SQS SDK示例。
難道我做錯了什么? 是否可能需要在Lambda中使用另一個SDK?
問題的答案已在問題的評論部分中討論過。 但我想強調如何解決這樣的問題,如果面臨這樣的問題,那么這個問題將得到答案,它也可能有助於社區。
當面臨Lambda終止而不執行代碼的某一部分的問題時,可能是由於以下原因。
原因1 :Lambda超時,甚至在它完成處理之前。 Lambda是一種無服務器架構,可用於小型任務。 如果要運行需要一直運行的進程,我建議使用EC2實例。 因此,每個Lambda函數都有一個超時來完成該過程。 因此,增加Lambda函數的超時可以解決這個問題。 (始終不要將超時設置為最多5分鍾,因為它可能會因為意外的功能超時而花費很多) - 這就是這個問題的答案 。
原因2 :如果函數使用NodeJS中的異步調用,則lambda可以在您仍在執行異步調用時終止。 因此,有一種機制,在所有異步調用返回其值之前,lambda不會終止。 解決此問題的最佳方法是使用同步調用庫而不是異步調用。
原因3 :最明顯的原因是代碼中存在錯誤。 這將終止Lambda,您可以在其中查看錯誤並相應地修復它。
原因4 :由於缺乏像內存這樣的適當資源分配,也可能發生這種情況。 如果您的函數需要執行某個內存,請事先通過估計在測試環境中運行該函數所需的正確值來預先分配它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.