はじめに
今回は 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 キュー」を試しました。