teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

質問に沿った内容に改修

2021/12/21 04:43

投稿

miyabi-sun
miyabi-sun

スコア21472

answer CHANGED
@@ -1,32 +1,85 @@
1
- 「何を作りたいのか?」「何の情報を保存するつもりなのか」により
1
+ > AWS Lamda , AWS API Gateway , Node.js
2
- どんなサービスを利用するべきか?等が決まります。
3
2
 
4
- LINE Botという性質を考えると
5
- [非IT系な妻との情報共有、「LINE」を駆使したら超捗ったのでオススメさせてくださ | 男子ハック](https://www.danshihack.com/2018/10/21/junp/line-family-support.html)
3
+ [こうう奴ですよね](https://qiita.com/shinbunbun_/items/ae09364504002d0c25f1)
6
- この記事はLINE Botを使わず「IFTTT」と「LINE Notify」でやりくりしているようですが、
7
- LINE Botがあれば今日の天気や注意報を今の天気は?」でBot聞いり出来るしょう。
4
+ AWS Lambdaって俺やることやったから落ちるわ」で勝手死ぬ奴じゃなかったですっけ?
5
+ Botと相性悪そうですけど。
6
+ なるほど……Webhookで引っ掛けてるだけか。
8
7
 
8
+ これだと確かにStateの保存は出来ませんね。
9
+ 外部に値を保存する仕組みが必要となります。
10
+
11
+ 自分のサービス内で完結するならば一般的に使われるのが永続保存のRDSで、
12
+ 大企業レベルだと大量のデータを捌く為にDynamoDB等のサービスを比較検討する感じになります。
13
+ 小規模で高速にデータを取り出したいケースだとRedis等の高速なものを使うのが適しています。
14
+
15
+ - [Amazon MemoryDB for Redis](https://aws.amazon.com/jp/memorydb/)
16
+ - [Amazon RDS](https://aws.amazon.com/jp/rds/)
17
+
18
+ どちらにしてもやってることのショボさの割に
19
+ 金を取られるのでオススメとは言えません。
20
+
21
+ まぁ、その程度ならVPSなんかで安くてしょぼいLinuxマシン立ち上げて
22
+ そこでちゃんとしたWebサーバとして起動する事を推奨します。
23
+ [Amazon Lightsail](https://aws.amazon.com/jp/lightsail/pricing/)とか
24
+
9
25
  > 時間を指定した関数の実行はcron?cloudfront?
10
26
 
11
27
  関数というのはAWS Lambdaにアップロードして使えるようになったものを指しますか?
12
28
  であれば「AWS スケジュール実行」等で検索したら下記のサービスが出てきました。
13
29
  [スケジュールに従って実行する Amazon EventBridge ルールの作成](https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-create-rule-schedule.html)
14
30
 
15
- このように何でもサービスになっているのがAWSの恐ろしい所、
31
+ ---
16
- 他にもAWS Batchみたいなサービスも見つけることが出来ました。
17
32
 
18
- > ユーザー状態管理どのようにすのでしょか?
33
+ Webhookで引っ掛けたLambdaで出来る内容から次目標決めとい選択肢もあります。
34
+ 例えば[非IT系な妻との情報共有、「LINE」を駆使したら超捗ったのでオススメさせてください | 男子ハック](https://www.danshihack.com/2018/10/21/junp/line-family-support.html)
19
35
 
36
+ こういうのは要するに外部のAPIを叩いているだけなので、
20
- これも何のサービスを作りたかによります
37
+ 状態は向う側が保持してくいます。
21
- AIに高度な解析をさせたいとかならDBどころの騒ぎではなく
22
- イチからシステムを構築する必要があります
23
- AWSが持つ様々なサービスと連結させる事になるでしょう。
24
38
 
39
+ これをDB代わりに使わせて頂くといった作戦となります。
40
+ 私はLambdaを使ってはいませんが、
25
- しかし、TrelloやGoogle ToDoに登録したタスクを確認程度ならば
41
+ 個人的な開発ではGoogle ToDoやTrelloなんかのタスク管理ツールと併用て利用してます。
26
- 知ってる人にHTTPリクエストを飛ばして確認すりゃいいじゃないですか。
27
- [Lambdaなら関数登録時に環境変数とかに指定できる](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-envvars.html)のでトークンをそこに保存すれば解決でしょ。
28
42
 
29
- まぁ、結局必要は発明の母ってわけで、
43
+ ---
44
+
30
- 要望を実現する必要最小限のもの以外不要です。
45
+ これVPS等のLinuxマシンサービスを立ち上げた場合のやり方になります。
46
+
47
+ > ユーザーが「true」と発言したら、そのユーザーのstatusフラグをtrueにして、
48
+ statusフラグがtrueの間、30分おきにBOTからメッセージが送られてくる
49
+ ユーザーが「false」と発言したら、そのユーザーのstatusフラグをfalseにする。
31
- LINE Botで何をしたいのか?
50
+ といったLINE BOTにていきたいと考えています。
51
+
52
+ JavaScript(Node.js)の仕様として
32
- れに立ち返って色々模索してみてください
53
+ 関数で区切らる度「スコープ」を定義する
54
+ スコープは入れ子になっており、現在スコープに該当の変数が無ければ上に取りに行く。
55
+ こういう仕様になっています。
56
+
57
+ [公式チュートリアル](https://developers.line.biz/ja/docs/messaging-api/nodejs-sample/#what-you-will-need)
58
+ に沿った形でコードを書くならばこんな感じ
59
+
60
+ ```js
61
+ const express = require("express")
62
+ const app = express()
63
+
64
+ // グローバル変数スコープにぶら下げとく
65
+ const statusById = {};
66
+
67
+ app.get("/:id", (req, res) => {
68
+ const id = req.params.id;
69
+ res.json(statusById[id]);
70
+ });
71
+ app.put("/:id", (req, res) => {
72
+ const id = req.params.id;
73
+ // express.jsはデフォルトでbodyを解析する仕様にはなってないからミドルウェアを噛ます必要ある
74
+ const status = req.body.status;
75
+
76
+ statusById[id] = status == "true";
77
+ res.sendStatus(200);
78
+ });
79
+ app.listen(80);
80
+ ```
81
+
82
+ > 時間を指定した関数の実行はcron?cloudfront?
83
+
84
+ VPSのルートならば、そこにLinuxのマシンがポンとあるだけなので
85
+ Cronで自動実行のジョブを登録するだけになります。