ずっーとよく分かっていなかったSQSの仕組み、請求額を見て、ようやく理解しました!
たいして使っていないはず(1日10メッセージ、月300メッセージ程度)のSQSの使用料が無料枠の100万回を超え、課金対象に…
原因はSQSトリガーで動いているlambdaでした…。
解説していきます。
SQSの料金設定
SQSの料金はこうなっています。
100万リクエストあたり0.40USD
ただ、最初の100万リクエストは無料になっています。
私の↑の場合、125万リクエスト程度使っており、25万リクエスト分の料金がかかっています。
リクエストとは…?
SQSのリクエスト
SQSのリクエストというのは、SQSへのメッセージの送信、SQSからのメッセージの受信などです。
で、そもそもSQSとは何かという話をさせてください。
SNSもSQSもメッセージ配信サービスという意味では同じなのですが、SNSが「筒」なのに対して、SQSは「蓋付きの箱」です。
SNSは筒の前で待っていれば、勝手にメッセージが筒を通ってやって来るのですが、SQSは蓋付きの箱なので、蓋を開けてあげないと中身が見れません。
なので、蓋を開けて中身を確認するんですね。ポーリングと言います。
で、蓋を開けるたびに1リクエストが消費されていきます。
lambdaでSQSをトリガーにすると?
lambdaは1分に15回SQSにメッセージの確認をしています。
確認の度に1リクエストが消費されていきます…。
月で考えると、15回/1分×60分×24時間×30日⇒648000⇒64.8万リクエスト
簡単に言うと、lambdaにSQSのトリガーをセットすると、固定で月64.8万リクエストが消費されます。
無料枠は月100万リクエストしかないので、2個上記の設定をすると、無料枠を超えることになります…
無料枠を考えないと64.8万リクエストは、0.40USD/100万×64.8万リクエスト⇒0.2592USD⇒30円程度
つまり、lambdaにSQSのトリガーをセットすると、固定で月30円程度請求されます。
個人開発には痛い!
私なんか、SQSトリガー20個くらい使おうとしてたから、月600円…
早く気づいてよかった…
確認方法
ちなみに、SQSのキューのモニタリングから、どれだけのリクエストが来ているか確認ができます。
この中のNumberOfEnptyReceives(カウント)というのが、蓋を開けたけど、空だったリクエストの数です。
無駄金の数です…
NumberOfMessageSent(カウント)というのが、実際に来たメッセージの数。
これ、私のメール受信用のlambdaなんですが、もはや空振りリクエストしかないですねww
対策
まず、安易にSQSトリガー⇒lambdaを利用しないこと。
当然、仕事での開発で、30円くらい気にしないよ、どんどん使え!って場合は使って大丈夫ですww
では、SQSトリガー⇒lambdaを利用せずにどうすればいいか?
即時受け取りしたい場合
メッセージを即時受け取りしたい場合は、SNSサブスクリプション⇒lambdaにするといいと思います。
SNSはメッセージを溜めておくことはできません。
なので、常に受信可能な状態にしておく必要はありますが、だいたいの場合、SNSで代用ができるのではないかと思います。
というか、SQS⇒lambdaを使っていて、SNSにしたら困る事なんて、そうないですよね?
SNSはメッセージ数に対して課金されます。
そして、SQSと同じく、100万リクエスト=100万メッセージまで無料です。
なんらかのエラーでメッセージが受け取れなかった場合にメッセージが消えてしまうのが嫌
SNSにはメッセージが溜められません。
なので、受け取れなかったメッセージは消えていく…。
それが嫌なら、SNSサブスクリプションにデッドレターキューを設定しましょう。
送信に失敗した時は、そのデッドレターキューにメッセージが溜まっていき、ロストすることはなくなります。
即時受け取りにこだわらない場合
即時受け取りにこだわらない場合は、lambda⇒SQSや、ECS⇒SQSがいいかなと思います。
トリガーを使わず、自力でポーリングをしに行くって事です。
lambdaの時間実行で、1分起き、5分起きにメッセージを取りに行く
ECSのループで、1分起き、5分起きにメッセージを取りに行く
ってことですね。
1分起きなら、1処理で、月4.32万リクエスト⇒月2円
5分起きなら、1処理で、月8640リクエスト⇒月0.4円
まで節約できます。
手動ポーリングの仕方はこちらにまとめてます。
独り言
awsは毎日毎日新しい学びがありますね…
いつになったら私に任せろ!レベルになれるのやらww
資格の勉強も進めないとなぁ…