Настройте aws-sdk-go для взаимодействия с SQS локального стека

Мне нужна помощь в попытке интегрировать aws-sdk-go с localstack для доступа к сервису SQS.

Я попробовал что-то вроде:

result, err := q.Client.SendMessage(&sqs.SendMessageInput{
    MessageAttributes: map[string]*sqs.MessageAttributeValue{
        "JobName": &sqs.MessageAttributeValue{
            DataType:    aws.String("String"),
            StringValue: aws.String(jobName),
        },
    },
    MessageBody: aws.String(messageBody),
    QueueUrl:    &q.URL,
})

if err != nil {
    return "", err
}

С инициализацией вроде:

type Queue struct {
    Client sqsiface.SQSAPI
    URL    string
}

var q Queue

    func init() {
      sess := session.Must(session.NewSessionWithOptions(session.Options{
        SharedConfigState: session.SharedConfigEnable,
    }))

    q = Queue{
        Client: sqs.New(sess),
        URL:    viper.GetString("queue.sqs.url"),
    }
}

Как я могу настроить SDK для доступа к SQS локального стека?

1 ответ

Давайте предположим, что у вас есть localstack и работает с конфигурацией по умолчанию, так что SQS будет работать в порту :4576следовательно, он будет доступен по адресу http://localhost:4576,

Давайте напишем пример, в котором мы отправляем сообщение в SQS после создания сеанса и очереди:

package main

import (

    "encoding/json"
    "log"

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

const (

    // Region represents aws region
    Region      = "eu-central-1"
    // SQSEndpoint represents the sqs endpoint (in this case points to localstack's SQS)
    SQSEndpoint = "http://localhost:4576"
    // QueueName represents queue's name
    QueueName   = "some_queue"
    // QueueURL represents queue's URL. You can also dynamically retrieve it with sqs.GetQueueUrl
    QueueURL    = "http://localhost:4576/queue/some_queue"
)

// Message is an example struct representing a message to be sent
type Message struct {
    SomeParam string `json:"some_param"`
}

func main() {

    // Initialize a new Config
    cfg := new(aws.Config)
    // Setting up region
    cfg.Region = aws.String(Region)
    // Setting up SQS Endpoint
    cfg.Endpoint = aws.String(SQSEndpoint)

    // Initialize new AWS Session
    awsSvc, err := session.NewSession(awsSvc)
    if err != nil {
        log.Fatal(err)
    }

    // Initialize new SQS Session
    sqsSvc := sqs.New(awsSvc)

    // Create a new queue input
    createQIn := new(sqs.CreateQueueInput)
    createQIn = out.SetQueueName(QueueName)

    // Create the queue
    if _, err := sqsSvc.CreateQueue(createQIn); err != nil {
        log.Fatal(err)
    }

    // Message Input
    message := Message {
        SomeParam : "some_val"
    }

    // Build SendMessage Input
    sendMsgIn:= new(sqs.SendMessageInput)

    // Marshal message to json
    b, err:= json.Marshal(input)
    if err != nil {
        log.Fatal(err)
    }

    // Set both Body and URL
    sendMsgIn = sendMsgIn.SetMessageBody(b).SetQueueUrl(QueueURL)

    // Finally send message
    if _, err := sqsSvc.SendMessage(sendMsgIn); err != nil {
        log.Fatal(err)
    }

}

В любом случае, я реализовал небольшую служебную библиотеку для этого SDK с некоторыми полезными методами aws-sdk-go-bindings.

Другие вопросы по тегам