AWS日記11 (SQS)

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

[今回作成したAmazon SQS のFIFOキュー機能を試すページ](https://labo.systems/sqs)


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

[Amazon SQSの資料]
[Amazon Simple Queue Service](https://aws.amazon.com/jp/sqs/)
[【AWS】楽々SQS解説〜5分で理解〜](https://qiita.com/UpAllNight/items/7c5022661a1eadc8a88a)

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

[参考資料]
[AWS SDK for Go API Reference](https://docs.aws.amazon.com/sdk-for-go/api/service/sqs/)
[aws-sdk-goを使ってGoからAWS SQSを使う](https://qiita.com/sudix/items/215d7ffb65e89187c1f1)



##### キューにメッセージを送信するには SendMessage を使う。

```golang: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 を使う。

```golang: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 を使う。

```golang: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 を使う。

```golang: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 キュー」を試しました。