簡體   English   中英

不能使用Lambda的SQS

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM