簡體   English   中英

從 lambda 事件或上下文中動態檢索 SQS 隊列 URL

[英]Retrieve the SQS Queue URL dynamically from the lambda event or context

我有一個 lambda function 響應調用它的兩個不同的 SQS 隊列(第二個是退避隊列),所以我想動態確定消息來自哪個隊列,以便我可以在它被刪除后刪除它處理。

我能夠創建 EventSourceMapping 以從兩個隊列觸發 lambda,但我看不到我如何干凈地檢索執行DeleteMessage調用所需的 QueueURL。 我正在使用 AWS Golang SDK。

事件消息的正文中有 EventSourceArn,看來我可以使用GetQueueURL ,但這將是一個額外的 API 調用。

避免這種情況(我能想到)的唯一方法是將兩個隊列 URL 作為環境變量傳遞,並使用 EventSourceArn 中的隊列名稱來查找它。

有沒有更好的方法呢? 上下文中是否隱藏了未記錄的內容?

如果您正在使用 lambda、SQS 和事件源映射,那么您不必手動從 sqs 中刪除對象:當您的 function 成功處理批次時,Lambda 將從隊列中刪除其消息

只需返回一個成功碼,消息就會自動從相關的SQS隊列中刪除

您可以從事件中作為EventSourceARN擁有的 ARN 重建隊列 URL。

package main

import (
    "context"
    "fmt"

    "github.com/aws/aws-lambda-go/events"
    "github.com/aws/aws-lambda-go/lambda"
    "github.com/aws/aws-sdk-go/aws/arn"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/sqs"
)

var client *sqs.SQS

func main() {
  client = sqs.New(session.Must(session.NewSessionWithOptions(session.Options{
        SharedConfigState: session.SharedConfigEnable,
    })))
    lambda.Start(Handle)
}

func Handle(ctx context.Context, event events.SQSEvent) {  
    for _, record := range event.Records {
        // Process message
        fmt.Printf(record.Body)

        // Rebuild Queue URL from ARN 
        queueArn, _ := arn.Parse(record.EventSourceARN)
        queueUrl := fmt.Sprintf("https://sqs.%v.amazonaws.com/%v/%v", queueArn.Region, queueArn.AccountID, queueArn.Resource)

        // Delete message from queue
        client.DeleteMessage(&sqs.DeleteMessageInput{
            QueueUrl:      &queueUrl,
            ReceiptHandle: &record.ReceiptHandle,
        })
    }
}

如果您使用的是非標准 AWS 分區(例如中國),您還需要更改 URL 的根域以匹配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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