自作ボタン(ESP32) + AWS IoT Core + AWS LambdaでAmazon自動注文ボタンを自作してみた!

DIY
スポンサーリンク

上のようなボタンをクリックしたら、特定の商品がAmazonで自動注文される「Amazon自動注文ボタン」を自作しました。
備忘録として、作成過程をまとめました。

●開発環境
(自作ボタンへのプログラム書込み、自動購入スクリプトの事前検証に使用)
・Windows 10 Home Ver.21H1
・Arduino IDE 1.8.12
・conda 4.10.3
・Python 3.7(Conda仮想環境)
・Selenium 3.141.0(Conda仮想環境)
・Chrome バージョン 96.0.4664.45(Official Build) (64 ビット)
・Chromedriver 96.0.4664.45
●自作ボタン
・ESP32-DevKitC ESP-WROOM-32開発ボード
・MQTT by Joel Gsewiler バージョン 2.5.0
・ArduinoJson by Benoit Blanchon バージョン 6.18.3
●自動購入スクリプト
・Python 3.7
・Selenium 3.141.0
・headless-chromiumのバージョンはv1.0.0-37(chromium 64.0.3282.167)
・chromedriverのバージョンはv2.37(Supports Chrome v64-66)
●AWS Lambda
・Python 3.7

 

  1. 目次
  2. はじめに
  3. AWS IoT CoreでAWS IoT deviceを作成する
    1. 関連情報1 AWSに登録!その後の初期設定を行う!
  4. ボタンを作る (はんだ付けは動作検証後にします)
    1. 関連情報1 Arduinoでボタン動作を検出する方法の調査
    2. 関連情報2 ESP32でボタンクリックを検出する!
    3. 関連情報3 Arduinoでプログラム書込み中に「Failed execute script esptool」エラーが発生
  5. AWS IoT Coreと自作ボタンを接続する
    1. 関連情報1 ESP32とAWS IoT Coreを接続する!
    2. 関連情報2 AWS IoT Coreで動作検証中にアウトバウンドメッセージが多い問題
  6. 自作ボタンをクリックしたら、Lambda関数が実行されるようにする
  7. 自動購入スクリプトを作成する(ローカル環境で)
    1. 関連情報1 Windows10にConda仮想環境を構築する
    2. 関連情報2 Windows PowerShellでConda activateによって仮想環境が切り替わらない
  8. Lambda関数で自動購入スクリプトの準備する
    1. 関連情報1 Amazon LambdaでSeleniumを動かしたいとき どうすればいいか調べてみた。
    2. 関連情報2 chromedriverとheadless-chromiumのバージョンの組み合わせ調査
    3. 関連情報3 AWS Lambda関数でSeleniumを動かす!
    4. 関連情報4 Lamdba上で秘密情報を扱う方法を調べてみた
    5. 関連情報5 Lamdba上で秘密情報を扱ってみる
    6. 関連情報6 SeleniumでChromedriverの実行後に「ERROR: platform_thread_posix.cc(147)] pthread_create: Resource temporarily unavailable (11)」が出た場合の解決方法
    7. 関連情報7 AWS Lambda layerの作成が「Signature expired」エラーで失敗する。
  9. Pythonの自動購入スクリプトをAmazon Lambda上で動作させる
  10. 自作ボタンをクリックしたら、自動購入スクリプトを実行されるようにする
    1. 関連情報1 Amazon自動注文ボタンのAWS側をAWS IoT Coreで実装してみる
  11. 自作ボタンをはんだ付けする
  12. 最終チェック ボタンクリックから自動購入されるか確認する
  13. AWSのお片付け
  14. かかった費用のまとめ
    1. 関連情報1 自作ボタン(ESP32)の費用検討
    2. 関連情報2 「AWS IoT Core」を使った場合の費用検討
  15. 使って感じた改善点

目次

※関連情報は本筋の手順とはずれている内容もあるので、必要なければ読み飛ばしてください。

 


 

はじめに

「Amazon自動注文ボタン」 を作るにあたり、どのように実現する方法があるか、そしてその費用がどれくらいかかるかを検討しました。

 

構成案初期費用
[円]
ランニング
コスト[円/月]
5年分総額
[円]
共有アカウント+バーチャルダッシュ3,000円~408円/月27,500円~
AWS IoT ボタン(AWS の Seeed IoT Button)
+AWS IoT Core+AWS Lambda
9,459円0.0023円/月9,459.138円
AWS IoT ボタン(SORACOM LTE-M Button)
+AWS IoT Core+AWS Lambda
8,778円120.0023円/月14,658.138円 ※1
AWS IoT ボタン(AWS IoT Button Dev)
+AWS IoT Core+AWS Lambda
3,000円~0.0023円/月3,000.138円~
AWS IoT 1-Clickボタン(AWS の Seeed IoT Button)
+AWS Lambda
9,459円27.5015円/月11,109.09円
AWS IoT 1-Clickボタン(SORACOM LTE-M Button)
+AWS Lambda
8,778円147.5015円/月16,308.09円 ※1
自作ボタン+AWS IoT Core+AWS Lambda1,800円0.0023円/月1,800.138円
自作ボタン+ブラウザ アマゾンアカウントで注文1,800円0円/月1,800円
  • 5年使った場合の総額を計算した。
  • ※1: SORACOM LTE-M Buttonの更新手数料は 初回1年間無料のため、その分は引いている。

 

上記の構成案の中で、一番安く、現実的な方法として
「自作ボタン+AWS IoT Core+AWS Lambda」
の方法を採用しました。

 

 

以下に、作成手順の詳細をまとめました。

AWS IoT CoreでAWS IoT deviceを作成する

自作ボタンをAWS IoT Coreに接続するために、モノの作成/設定や証明書の割り付けなどAWS IoT Core側で下準備が必要です。

以下のブログでAWS IoT Coreの下準備の手順をまとめましたので、ご覧ください。

【ESP32でAmazon自動注文ボタン】AWS IoT CoreでAWS IoT deviceを作成する
Amazon自動注文ボタンをESP32で作ろうとしています。 本記事はAWS IoT CoreでESP32をIoTデバイス(モノ)として登録する手順をまとめました。

 

 

### 以下は本手順の関連情報です。不要であれば読み飛ばしてください。###


関連情報1 AWSに登録!その後の初期設定を行う!

AWSへの登録方法やAWSアカウントの初期設定の方法をまとめました。

AWSアカウントの作成!その後の初期設定を行う!
AWSへの登録方法やAWSアカウントの初期設定の方法をまとめました。

 

 

 

ボタンを作る (はんだ付けは動作検証後にします)

次にボタンを作ります。
ボタン側のプログラムは「①ボタンのクリックを検出する機能」、「②AWS IoT Coreと通信する機能」の2つで構成されています。今回は「①のボタンのクリックを検出する機能」の実装および動作検証をします。

以下のブログでボタンを作る手順をまとめましたので、ご覧ください。

【ESP32でAmazon自動注文ボタン】ボタンを作る(はんだ付けはあとで)
Amazon自動注文ボタンをESP32で作ろうとしています。 本記事はESP32で自作ボタンを作る手順をまとめました。

 

 

### 以下は本手順の関連情報です。不要であれば読み飛ばしてください。###


関連情報1 Arduinoでボタン動作を検出する方法の調査

ボタン側のプログラムを作るにあたり、事前に調査しました。
ESP32のサンプルプログラム、チャタリング対策など、、、

Arduinoでボタン動作を検出する方法の調査
Amazon自動注文ボタンのボタン側のプログラムを作るにあたり、事前に調査しました。

 

関連情報2 ESP32でボタンクリックを検出する!

「Amazon自動注文ボタン」のボタン側のプログラム(クリック検出側)のベースを検討しました。

ESP32でボタンクリックを検出する!
ESP32でAmazon自動注文ボタンを作れないかと模索中です。 ボタン側のプログラムのベースとして、ESP32にボタンをつなげて、それをクリックしたら「Button ON!!!」と画面に表示してくれるプログラムをつくりました。

 

関連情報3 Arduinoでプログラム書込み中に「Failed execute script esptool」エラーが発生

Arduinoでプログラム書込み中に「Failed execute script esptool」エラーが発生しました。
原因は非常に単純だったのですが、今後もやらかしそうなので備忘録として残しました。

Arduinoでプログラム書込み中に「Failed execute script esptool」エラーが発生
Arduinoでプログラム書込み中に「Failed execute script esptool」エラーが発生しました。 原因は非常に単純だったのですが、今後もやらかしそうなので備忘録として残しました。

 

 

 

AWS IoT Coreと自作ボタンを接続する

次に、ボタン側のプログラムの 「②AWS IoT Coreと通信する機能」の実装および動作検証をします。

以下のブログでボタンを作る手順をまとめましたので、ご覧ください。

【ESP32でAmazon自動注文ボタン】AWS IoT Coreと自作ボタンを接続する
Amazon自動注文ボタンをESP32で作ろうとしています。 本記事はAWS IoT Coreと自作ボタンを接続する手順をまとめました。

 

 

### 以下は本手順の関連情報です。不要であれば読み飛ばしてください。###


関連情報1 ESP32とAWS IoT Coreを接続する!

ボタン側のプログラム(AWSとの接続側)を作るにあたり、事前に構成やプログラムの動作検証しました。

ESP32とAWS IoT Coreを接続する!
ESP32をAWS IoT Coreに接続し、MQTTで通信することができたので、備忘録としてまとめました。

 

関連情報2 AWS IoT Coreで動作検証中にアウトバウンドメッセージが多い問題

AWS IoT Coreと自作ボタンの接続検証中に、メトリックス内でアウトバンドメッセージが多くカウントされていることが分かりました。
その原因と解決方法をまとめたので、よろしかったらご覧ください。

AWS IoT Coreで動作検証中にアウトバウンドメッセージが多い問題
AWS IoT Coreで動作検証中にメトリックス内でアウトバンドメッセージが多くカウントされていることが分かりました。 その原因と解決方法をまとめたので、よろしかったらご覧ください。

 

 

 

自作ボタンをクリックしたら、Lambda関数が実行されるようにする

ボタンが押されたときにAWS IoT Coreから発行されたイベントにより、AWS Lambda関数が実行されるように設定します。

【ESP32でAmazon自動注文ボタン】自作ボタンをクリックしたら、Lambda関数が実行されるようにする
Amazon自動注文ボタンをESP32で作ろうとしています。 本記事は自作ボタンをクリックしたら、Lambda関数が実行する手順をまとめました。

 

 

 

自動購入スクリプトを作成する(ローカル環境で)

最終的には自動購入スクリプトをAWS Lambda関数内で実行することになるのですが、事前にローカル環境(Windows10 PC)上で自動購入スクリプトを作成し、動作検証を行うことにします。
# 購入したい商品に応じて、Amazonのボタンの配置などが変わる可能性があるため、事前に動作検証はしっかりしましょう

【ESP32でAmazon自動注文ボタン】自動購入スクリプトを作成する(ローカル環境で)
Amazon自動注文ボタンをESP32で作ろうとしています。 本記事はローカル環境で自動購入スクリプトを作成する手順をまとめました。

 

 

### 以下は本手順の関連情報です。不要であれば読み飛ばしてください。###


関連情報1 Windows10にConda仮想環境を構築する

Windows10にConda仮想環境を構築する
Windows10にConda仮想環境を構築する方法をまとめました。

 

関連情報2 Windows PowerShellでConda activateによって仮想環境が切り替わらない

Windows PowerShellでConda activateによって仮想環境が切り替わらないときの解決方法
Windows10でConda仮想環境を構築するときにConda activateで仮想環境が切り替わりませんでした。 解決できたので、その方法を備忘録としてまとめました。

 

 

 

Lambda関数で自動購入スクリプトの準備する

前章で作成した自動購入スクリプトをLambda関数に書き込んだだけではうまく動作しません。
Lambda関数はランタイムとして標準的な実行環境しか準備されていないため、外部のPythonスクリプトやChromeドライバなどは自前で準備する必要があります。
また、Lambda関数上で秘密情報を直接扱うのはAWSベストエフォートとして問題ありそうなので、秘密情報は「AWS Systems Managerのパラメータストア」を利用することにします。

【ESP32でAmazon自動注文ボタン】Lambda関数で自動注文スクリプトの準備する
Amazon自動注文ボタンをESP32で作ろうとしています。 本記事はLambda関数で自動購入スクリプトの準備する手順をまとめました。

 

 

### 以下は本手順の関連情報です。不要であれば読み飛ばしてください。###


関連情報1 Amazon LambdaでSeleniumを動かしたいとき どうすればいいか調べてみた。

やり方が分からなかったので、事前に調査しました。

Amazon LambdaでSeleniumを動かしたいとき どうすればいいか調べてみた。
Amazon LambdaでSeleniumを動かすために、やり方を調べました。

 

関連情報2 chromedriverとheadless-chromiumのバージョンの組み合わせ調査

AWS lambda上でheadless-chromiumを動かすときに、chromedriverとheadless-chromiumの組み合わせによっては動作しなかったので、いろいろなバージョンの組み合わせで動作するか調査しました。

AWS Lambda上でheadless-chromiumを動かすときのchromedriverとheadless-chromiumのバージョンの組み合わせ調査
AWS Lambda上でheadless-chromiumを動かすときに、chromedriverとheadless-chromiumの組み合わせによっては動作しなかったので、いろいろなバージョンの組み合わせで動作するか調査しました。

 

関連情報3 AWS Lambda関数でSeleniumを動かす!

「Amazon自動注文ボタン」のAWS側のプログラムのベースを検討しました。

AWS Lambda関数でSeleniumを動かす!
AWS Lambda関数でSeleniumを動かすのに非常に苦労しました。どうにか動作することができたので、備忘録をまとめておきます。

 

関連情報4 Lamdba上で秘密情報を扱う方法を調べてみた

AWS Lambda関数で秘密情報を取り扱う方法を調べました。

Lamdba上で秘密情報を扱う方法を調べてみた
AWS Lambda関数で秘密情報を取り扱う方法を調べました。

 

関連情報5 Lamdba上で秘密情報を扱ってみる

Lamdba上で秘密情報を扱うために、事前に検証をしました。

Lamdba上で秘密情報を扱ってみる
AWS Lambda関数で秘密情報を取り扱う方法をまとめました。

 

関連情報6 SeleniumでChromedriverの実行後に「ERROR: platform_thread_posix.cc(147)] pthread_create: Resource temporarily unavailable (11)」が出た場合の解決方法

いろいろ検証中に出たエラーです、解決できたので参考に記事にしました。

SeleniumでChromedriverの実行後に「ERROR: platform_thread_posix.cc(147)] pthread_create: Resource temporarily unavailable (11)」が出た場合の解決方法
SeleniumでChromedriverを動かすときにエラーが出ました。解決方法を備忘録としてまとめておきます。

 

関連情報7 AWS Lambda layerの作成が「Signature expired」エラーで失敗する。

AWS Lambda layerを作成時にエラーがでました。解決できたので以下の記事にまとめました。

AWS Lambda layerの作成が「Signature expired」エラーで失敗する。
AWS Lambda layerを作成時にエラーがでました。解決できたので備忘録をまとめておきます。

 

 

 

Pythonの自動購入スクリプトをAmazon Lambda上で動作させる

事前準備ができたら、自動購入スクリプトをLambda関数に登録し、動作検証をします。

【ESP32でAmazon自動注文ボタン】Pythonの自動注文スクリプトをAmazon Lambda上で動作させる
Amazon自動注文ボタンをESP32で作ろうとしています。 本記事はLambda関数で自動購入スクリプトを実行する手順をまとめました。

 

 

 

自作ボタンをクリックしたら、自動購入スクリプトを実行されるようにする

自作ボタンクリック ⇒ AWS IoT Core実行 ⇒ Lambda関数の起動までは、「自作ボタンをクリックしたら、Lambda関数が実行されるようにする」の章で確認できているので、AWS IoT Coreが起動するLambda関数を前章までの自動購入スクリプトに変更すれば動くはずです。
AWS IoT Coreでの上記設定とボタンクリック⇒自動購入スクリプトの実行までの動作確認をします。

【ESP32でAmazon自動注文ボタン】自作ボタンをクリックしたら、自動購入スクリプトが実行されるようにする
Amazon自動注文ボタンをESP32で作ろうとしています。 本記事は自作ボタンをクリックしたら、自動購入スクリプトが実行されるようにする手順をまとめました。

 

 

### 以下は本手順の関連情報です。不要であれば読み飛ばしてください。###


関連情報1 Amazon自動注文ボタンのAWS側をAWS IoT Coreで実装してみる

Amazon自動注文ボタンを実装するにあたり、ボタン側はいろいろなやり方がありますが、AWS IoT Coreを使ったAWS側は共通化できるので、以下に別記事として作成しました。

Amazon自動注文ボタンのAWS側をAWS IoT Coreで実装してみる
AWS IoT Coreを使ってAmazon 自動注文ボタンを作る方法をまとめました。(ボタン→AWS IoT Coreのところは対象外です。)

 

 

 

自作ボタンをはんだ付けする

自作ボタンからAWSまで動作検証ができたので、自作ボタンをはんだ付けします。
はんだ付け後にも再度検証しましょう。

【ESP32でAmazon自動注文ボタン】自作ボタンをはんだ付けする
Amazon自動注文ボタンをESP32で作ろうとしています。 本記事は自作ボタンのはんだ付けについてまとめました。

 

 

 

最終チェック ボタンクリックから自動購入されるか確認する

AWS Lambda関数の制限を解除して、購入手続きまでされるか確認します。

【ESP32でAmazon自動注文ボタン】ボタンクリックから自動購入されるか確認する
Amazon自動注文ボタンをESP32で作ろうとしています。 本記事は自作ボタンをクリックしたら、購入されるところまでを最終チェックする手順をまとめました。

 

 

 

 

AWSのお片付け

課金されてしまうので、不要なAWSのサービスは削除します。

【ESP32でAmazon自動注文ボタン】AWSのお片付け
Amazon自動注文ボタンをESP32で作ろうとしています。 本記事はAWS関連の片付けについてまとめました。

 

 

 

かかった費用のまとめ

かかった費用をまとめました。

【ESP32でAmazon自動注文ボタン】かかった費用のまとめ
Amazon自動注文ボタンをESP32で作ろうとしています。 本記事はかかったコストをまとめました。

 

 

 

### 以下は本手順の関連情報です。不要であれば読み飛ばしてください。###


関連情報1 自作ボタン(ESP32)の費用検討

ESP32を使って自作ボタンを使った場合の費用の見積もりをしました。

Amazon自動注文ボタン 自作ボタン(ESP32)の費用検討
Amazon自動注文ボタンをESP32で作ろうとしています。 本記事は自作ボタンのコストを概算しました。

 

関連情報2 「AWS IoT Core」を使った場合の費用検討

AWS側を「AWS IoT Core」を使って実装した場合の費用の見積もりをしました。

Amazon自動注文ボタン 「AWS IoT Core」を使った場合の費用検討
Amazon自動注文ボタンをESP32で作ろうとしています。 本記事はAWS側のコストを概算しました。

 

 

 

使って感じた改善点

実際に使ってみて感じた改善点を以下にまとめました。
修正は気が向いたらします。。。

  • ボタンを押した後に、実際に注文完了するまで2分くらい時間がかかるため、ボタンクリックでほんとに注文されたかわかりにくい。
    ⇒ Lambda関数の最初のところで受付メールを出すようにすればいいのでないか。
  • そもそもボタンのクリックがきちんと認識されたかわかりにくい。
    ⇒ LEDをつけて、ボタンが押されたことをわかるようにするとか?
  • 1クリック=1注文のため、複数注文すると配送処理が個別に行われ、まとめて送ってくれない。
    ⇒ クリックを一定期間集計して、まとめて注文するようにする。現時点のクリック数を表示する「7セグメントLED」をつける。長押しで注文確定とかにする。
  • 1000ミリ秒以上長く押した場合、2回押したことになる
    チャタリング対策として、1000ミリ秒以内の割り込みは無視しているため、1秒以内のクリックなら問題ないが、1秒以上押した場合、①押したとき、②離したときのチャタリング割り込みが発生し、2回割り込みが発生したとみなされる。
    attachInterrupt(digitalPinToInterrupt(INPUT_PIN), switchON, FALLING); でHIGH⇒LOWとなった場合に割り込みが上がるようにしている。
    ⇒ チャタリング対策をより強化する必要がある。クリック割り込みがあったとき、xmsタイマーを張り、タイマー満了後に再度ボタンの状態をチェック。状態がOFF(ボタン押された状態)ならば、ONと判断するとか。離したときの割り込みは別に設定できるようなので、押したときと離したときの組み合わせを設定すれば、長押しを検知できそう。
  • 自作ボタンがフリーズしているのかわからない。
    ⇒ 自作ボタンのプログラムにLEDを一つ追加して、フリーズしていないときは点滅させるようにして外からわかるようにするとか、、、7セグメントLEDをぐるぐる点灯させるとか?

 

 

 

以上!

コメント

タイトルとURLをコピーしました