Synamon’s Engineer blog

Synamonはリアルとデジタルの融合を加速させるため、メタバース領域で法人向けにサービス提供を行うテックカンパニーです。現在開発を進めている「メタバース総合プラットフォーム」をはじめ、メタバース市場の発展に向けた事業展開を行っています。このブログでは、メタバース技術とその周辺の技術、開発全般に関してエンジニアがお話しします。

SQSとLambdaでGoで書いたワーカーを動かす

ごあいさつ

エンジニアのうぃすきー(@Whisky_shusuky)と申します。弊社ではインフラ・バックエンド・フロントエンドとWeb周りを全般的に対応しております。

今回はワーカーの実装について記載しようと思います。 元々Railsメインでバックエンドの開発を行う機会が多く、その際はsidekiqを使用してワーカーを作成していました。 一方で最近はGoを使ってバックエンドの開発を行なっておりどうやってGoでワーカーを実装するか考える必要がありました。sidekiqのような既存のパッケージは幾つか有りましたがメンテがされていなかったりしたため、今回はSQSとLambdaを使用してマネージドサービスを活用する形で実装することにしました。また検討にあたってはこちらを参考にさせていただきました。

こんな感じでSQSにペイロードを渡してLambdaのコードを実行しSESでのメール送信を行なっております。

サンプルコードを置いたのでこれに則って記載します。 github.com

構成の紹介

sqs/ses/main.goに実際にLambdaで実行するコードを置いています。こんな感じのpayloadを受け取ってSESを使用してメール送信を行うものになっています。

type sesMessageBody struct {
    Region    string `json:"region"`         // aws region
    Subject   string `json:"subject"`       // 件名
    Message   string `json:"message"` // 本文
    Sender    string `json:"sender"`      //  送信者
    Recipient string `json:"reciptient"` // 送信先アドレス
}

こちらのコードをServerless Flameworkを使ってデプロイしています。 serveless.ymlにて先ほどのコードを実行するLambdaとSQSのキューについて定義します

...
// Lambdaの定義
functions:
  sqs:
    name: ses-queue-worker
    handler: bin/sqs/ses/main
    timeout: 30
    memorySize: 256
    reservedConcurrency: 1
    events:
      - sqs:
          arn: "sqsのarnを記載する"
          batchSize: 1

...

// SQSの定義
resources:
 Resources:
   MyQueue:
     Type: "AWS::SQS::Queue"
     Properties:
       QueueName: "ses-queue"

この状態でmake deployを実行するとMakefileの内容が実行されてデプロイされます。

実際はAPIサーバーなどから作成されたキューにペイロードを送信しますが、サンプルクライアントをclient/main.goに置いておきました

...
    // 作成されたSESの Sender アドレスを入力
    queueURL := ""
...

    // Recipient に送信先のメールアドレスを指定
    // Sender に送信元のメールアドレスを指定する(SESであらかじめドメイン認証しておくことが必要)
    data := sesMessageBody{Region: "ap-northeast-1", Subject: "件名", Sender: "", Recipient: "", Message: "test send"}

結び

マネージドサービスを使用してワーカーを構成するのは初めてでしたがやってみると簡単に実装できました。 また料金面についてはSQSは100万リクエストまで無料であり、Lamdaについても100万件あたり0.2ドルなので微々たるものでした。Sidekiqを使用していた場合ワーカーサーバーを運用する必要があるため初期費用を抑えることにも成功しました。割と良い選択ができたかと思います。