1
4

More than 1 year has passed since last update.

AWS日記11 (SQS)

Last updated at Posted at 2020-06-21

はじめに

今回は Amazon SQS (Simple Queue Service)を試します。
サポートされているキュータイプの 「FIFO キュー」 を試します。

今回作成したAmazon SQS のFIFOキュー機能を試すページ

準備

[Lambda , API Gatewayの準備をします。]
(https://qiita.com/tanaka_takurou/items/3f93295de6cff060ec09)
SQSの準備をします。「FIFO キュー」を作成し、キューURLを確認します。

[Amazon SQSの資料]
Amazon Simple Queue Service
【AWS】楽々SQS解説〜5分で理解〜

WEBページ・API作成

GO言語のAWS Lambda関数ハンドラー aws-lambda-go を使用してHTMLやJSONを返す処理を作成します。
また、SQS を使用するため aws-sdk-go を利用します。

[参考資料]
AWS SDK for Go API Reference
aws-sdk-goを使ってGoからAWS SQSを使う

キューにメッセージを送信するには SendMessage を使う。
main.go
func sendMessage(message string) error {
        t := time.Now()
        svc := sqs.New(session.New(), &aws.Config{
                Region: aws.String("ap-northeast-1"),
        })
        params := &sqs.SendMessageInput{
                MessageBody:            aws.String(message),
                QueueUrl:               aws.String(queueUrl),
                MessageGroupId:         aws.String(messageGroupId),
                MessageDeduplicationId: aws.String(t.Format(layout2)),
        }
        _, err := svc.SendMessage(params)
        if err != nil {
                return err
        }
        return nil
}
キューのメッセージ件数を確認するには GetQueueAttributes を使う。
main.go
func getCount()(string, error) {
        svc := sqs.New(session.New(), &aws.Config{
                Region: aws.String("ap-northeast-1"),
        })
        params := &sqs.GetQueueAttributesInput{
                AttributeNames: []*string{aws.String("ApproximateNumberOfMessages")},
                QueueUrl: aws.String(queueUrl),
        }
        res, err := svc.GetQueueAttributes(params)
        if err != nil {
                return "", err
        }
        return aws.StringValue(res.Attributes["ApproximateNumberOfMessages"]), nil
}
キューからメッセージを受信するには ReceiveMessage を使う。
main.go
func receiveMessage()(string, error) {
        svc := sqs.New(session.New(), &aws.Config{
                Region: aws.String("ap-northeast-1"),
        })
        params := &sqs.ReceiveMessageInput{
                QueueUrl: aws.String(queueUrl),
                MaxNumberOfMessages: aws.Int64(1),
                WaitTimeSeconds: aws.Int64(3),
        }
        res, err := svc.ReceiveMessage(params)
        if err != nil {
                return "", err
        }
        if len(res.Messages) == 0 {
                return "Empty.", nil
        }
        var wg sync.WaitGroup
        for _, m := range res.Messages {
                wg.Add(1)
                go func(msg *sqs.Message) {
                        defer wg.Done()
                        if err := deleteMessage(svc, msg); err != nil {
                                log.Println(err)
                        }
                }(m)
        }
        wg.Wait()
        return aws.StringValue(res.Messages[0].Body), nil
}
キューからメッセージを削除するには DeleteMessage を使う。
main.go
func deleteMessage(svc *sqs.SQS, msg *sqs.Message) error {
        params := &sqs.DeleteMessageInput{
                QueueUrl:      aws.String(queueUrl),
                ReceiptHandle: aws.String(*msg.ReceiptHandle),
        }
        _, err := svc.DeleteMessage(params)

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

終わりに

今回はAmazon SQS の「FIFO キュー」を試しました。

1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4