Help us understand the problem. What is going on with this article?

【個人開発】プレゼントキャンペーンを開けるWebサービスをサーバレスで作ってみた

More than 1 year has passed since last update.

まえがき

以前に初心者3人でwebサービス(webアプリ)を作ったので、立ち上げからリリースまでを時系列に書いていくという記事を書かせていただきました。
今回は、前回の失敗を踏まえてサービス作りを考えて実装してみました。
それがTwitterでプレゼントキャンペーンを開ける「プレキャン」というサービスです!

DvlzG2iVsAEa1yq.jpg

今回の記事は雑多な内容になりますので、目次から気になるものだけをつまみ食いしてお読みください。各項目の内容は独立していますので、どこから読んでいただいても大丈夫です。

目次

1、前回の反省点と、プレキャンを作ろうと思ったきっかけ
2、サービス内容
3、試しにプレゼントキャンペーンに応募してみて
4、「RTしたらすぐくる」を実現する技術
5、TwitterAPI制限への対応
6、キャンペーン終了後に再抽選
7、dynamoDB + lambda開発で採用したプラクティス
8、システムの応用
9、最後に

前回の反省点と、プレキャンを作ろうと思ったきっかけ

 前回作ったwebサービスはざっくりというと、「宣伝してくれたらお返しをあげる」というサービスでした。初心者3人でwebサービス(webアプリ)を作ったので、立ち上げからリリースまでを時系列に書いていく20000Viewsと多くの人に見ていただけたのですが、実際にwebサービスにアクセスしてくれたのは約2000人、登録してくれた人が約200人、そして実際に投稿してくれた人は20人ほど、という感じでした。。
 使っていただいた方の声では、「何ができるのか分かりにくい」「使いどきがわからない」「そもそもサービスそのものが悪い」等のご意見をいただき、初めてのwebサービス作りでしたが個人的には失敗だったと思っています。お返しとして用意できるのは画像や文章だけなので、それ欲しさでわざわざ宣伝したいとは思わないですよね。

 そこで私は考えました。じゃあ何が貰えたら人は宣伝をしてくれるだろうか?やっぱりもらって嬉しいお金が必要なのか。でも宣伝してくれた人全員にお金をあげることはできない。じゃあ宣伝してくれた人のうち抽選で何人かにAmazonギフト券をあげることくらいならできるんじゃないだろうか。

ということで生まれたのがプレキャンです。

サービス内容

「RTした人の中から抽選でn名に〇〇が当たる」を個人でも作れるサービスです。このサービスの強みは主に次の4つです。

1、RTしたらすぐに結果が届く(本当にすぐです!)
2、Amazonギフト券の送付まで全部自動
3、当選者、外れた人の一覧が見れて安心!(一言メッセージもつけられる!)
4、不正なアカウントの排除(捨て垢判定機能)

図: 当選者や外れた人の一覧
IMG_2604.JPG
IMG_2605.PNG

最近、企業がRTして応募完了タイプのプレゼントキャンペーンをやることが多くなりました。しかし個人がやるには敷居が高いので、ぜひともうちのシステムを使ってプレゼントキャンペーンを開いてもらえたらなーと思います。
興味がある人は以下のリンクから連絡いただければと思います!
https://adapp9.com

試しにプレゼントキャンペーンに応募してみて

「RTしたらすぐ結果がくるプレゼントキャンペーン」と説明してもイマイチ理解できない人も多いと思うので、聞くよりぜひ体験していただきたいです。下のツイートを「フォローしていいね」をしてみてください(RTよりもいいねの方が気軽でしょ?)。それだけで応募が完了して結果のDMが届くと思います。実際にAmazonギフト券が当たるかもしれないので、やらねば損です!!

ちなみにこのプレゼントキャンペーンの賞品の原資は自分で出しているのですが、すでに3000円くらい配っててつらいので、クラウドファンディングを始めました。どでかいキャンペーンをぶち上げたいので、共感してくださる方、ご協力していただけると幸いです😹

https://polca.jp/projects/xWRzjeyrenx

「RTしたらすぐくる」を実現する技術

 RTをするとすぐにDMが届く機能がこのサービスの目玉になっています。これを実現しているのはTwitter Account Activity APIです。
 Twitter Account Activity APIとは、紐付けたアカウントの全てのアクティビティ(ツイートするとか、リツイートするとか、フォローするとか)の行為をするたびに登録したWebhook URLヘPOSTをしてくれる公式APIです。
 AWSのAPI GatewayLambdaで受け入れ態勢を作れば、サーバレスで実装可能です。詳しい実装方法はこちらを参照してください。
 今回のサービスでは、RTやいいねのアクティビティをキャッチして「そのツイートがキャンペーンツイートか判定」「応募済みでないかチェック」「抽選」「結果の通知」などを行っています。

TwitterAPI制限への対応

 企業が行なっているプレゼントキャンペーンのツイートを見ると、数万から数十万のRTがされているものを見つけることができます。このサービスは応募してくれた人全員に結果の通知をするため、一度に大量の応募があった際にTwitterからAPI制限を受けてしまいます。API制限になると結果の通知ができないので、「おいおい、応募したけど全く反応がないぞ」となってしまい信頼を失ってしまいます
 そこで本サービスでは結果の通知がAPI制限で失敗した際には、AWSのSQSというキューイングサービスを利用しています。キューイングサービスとは、あのデータ構造でおなじみに「キュー」をクラウドで実現しているサービスです。時間のかかる処理や、失敗した処理を一旦このキューに投げておき、非同期で処理したりあとで処理したいときなどに使えます。
 なので、API制限で失敗したメッセージは一旦「送信先」と「メッセージ」をSQSに投げています。そして10分おきにSQSを監視するLambdaがもし送信できていないメッセージが見つかったら時間をおいて再送信するようにしています。それも失敗したらまたSQSへ投げます。
 

キャンペーン終了後に再抽選

 プレゼントキャンペーンには締め切りがあります。しかし思ったほど応募者が現れなかった時にはプレゼントが余ってしまうこともあります。余ったプレゼントは外れてしまった人たちから再抽選するのが道理でしょう。
 本サービスでは常にDBを監視するLambdaを用意しておき、終了したキャンペーンを見つけたら再抽選を行う処理を用意しています。
 特に書くことがなくて申し訳ありませんが、全てDynamoDBとLambdaで実現しています。AWS最高!

dynamoDB + lambda開発で採用したプラクティス

 本サービスを開発するにあたって使用しているのはAWSのDynamoDBとLambda(とAPIGatewayとS3)です。

DynamoDB : 2テーブル(応募者を管理するテーブルとキャンペーンを管理するテービル)
Lambda : 7つ

7つのLambdaは共通して利用するロジックが多数あるため全てを1つのフォルダにまとめました。7つのlambdaを一気に更新するシェルスクリプトを使うことで開発がとても楽になりました。

function_name="FUNCTION_NAME"
zip -r /tmp/${function_name}.zip *
aws lambda \
update-function-code \
--function-name ${function_name} \
--zip-file fileb:///tmp/${function_name}.zip \
--publish

これを7つ用意

また、DynamoDBとのやりとりが多かったので次のような構成で開発をしてみました。

スクリーンショット 2019-01-02 21.43.34.png

1、DynamoDB操作系の共通クラス(図の1段目)
DynamoDBはハッシュキーとレンジキーを使ったアクセスが基本なので、SQLのように複雑な問い合わせはしません。なのでDB操作はテーブルごとに共通化しやすいです。python+boto3を使用して作った実際のコードが以下です。 (冗長になるため省略しました)

2、各テーブルのレポジトリ(図の2段目)
上記の共通クラスを継承して、共通クラスにはない特殊な問い合わせをここに書いています。

3、各テーブルのユースケース(図の3段目)
上記のレポジトリに依存しながら、ロジックをこのクラスに集約しました。各ファンクションが共通して利用できるのでとても再利用性が高くなりました

システムの応用

 このプレゼントキャンペーンのシステムは他にも色々な応用が可能です
「RTしてくれた人全員に過去に書いた絵を送りつける」「いいねしてくれた人におみくじ結果を送る」などをテスト的にやらせてもらったのですが、それぞれ100人近く参加してもらえて、皆さんに楽しんでもらえました。
 プレゼントキャンペーン用に作ったシステムですが、色々な使い方ができるのはカスタマイズを前提にしたコーディングをしたからです。どうしてもベタ書きが多かったり、仕様が固まってしまうと考えていなかった使い方に対応できないシステムになってしまいがちです。柔軟性を持たせたコーディングをすることが(個人開発では)大事だなと思いました。

最後に

まとめますと、「RTしたらすぐに結果がくるプレゼントキャンペーン」が作れるサービスを作りました!!
プレゼントキャンペーンを開いてみると結構フォロワーも増えますので、興味ある人は以下のリンクから連絡くれたら嬉しいです。タイトルで有料と銘を打っていますが、最初のうちは無料でOKです。数が増えてくるとTwitter Account Activity APIの無料枠が終わってしまうので、そうなったらどうしても有料になってしまいますが。。

https://adapp9.com

また、記事中に書きましたがデカい賞金のキャンペーンを開いてみたいのでクラウドファンディングで募集中です(乞食)

https://polca.jp/projects/xWRzjeyrenx

yuno_miyako
TypeScript 好き。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした