バナーナナブログ

宮城県仙台市より、日々思ったことを綴っていくウェブログです。

AWS料金とEC2の状況を確認して通知するプログラムを作ってLINEで送信してみた

どうも。

前回の記事でLINEのMessaging APIを使ってみましたが、一番シンプルなテキスト形式でした。
smdbanana.hatenablog.com
公式アカウントとかから送られてくるメッセージってもっとこう、、、オシャレですね。

あのオシャレなメッセージも作ろうと思えば作れるんです。

前回Messaging APIを作成したデベロッパーの画面で、左のメニューにある「ツール」を開くと
Flex Message Simulator があるのでこちらを開きます。

f:id:smdbanana:20200202010417p:plain

「Showcase」からベースとするテンプレを選択し、中身をいじっていきます。
整形できたら「View as JSON」でjson形式で内容を確認できます。

f:id:smdbanana:20200202010448p:plain

こんな感じです。

私はよくAWSのEC2インスタンスを停止し忘れて無駄な料金が発生することが多かったので
「定期的にAWS料金とEC2の状況を確認して通知する」プログラムを作ってLINEで結果を送ってみようと思いました。

f:id:smdbanana:20200202010509p:plain
AWSの Lambda -> 関数 -> 関数の作成
を開き、「一から作成」で関数を作成します。(私はPython3.8を選択しました)

関数が作成されたら下部にある「実行ロール」にある
「IAMコンソールで****ロールを表示します。」のリンクを押下し、IAMの設定画面に遷移します。

f:id:smdbanana:20200202010640p:plain

アクセス権限タブにある「ポリシーをアタッチします」を押下。
f:id:smdbanana:20200202010654p:plain

f:id:smdbanana:20200202010712p:plain

ポリシーから「AmazonEC2ReadOnlyAccess」を選択し、「ポリシーのアタッチ」を押下。
これでLambdaからEC2の起動状況がわかるようになります。

次は料金のプロットを有効にするため設定を行います。
マイアカウントから「Billingの設定」を押下し、コスト管理設定の「請求アラートを受け取る」のチェックを有効にします。
これをすることで、CloudWatchのログに料金のプロットが行われるようになります。

f:id:smdbanana:20200202010823p:plain

さて、またLambdaの関数画面に戻ります。
料金を調べるためCloudWatchにアクセスしたり、EC2の状況をみるためEC2へアクセスしたりするので応答時間がそれなりにかかります。
「基本設定」ブロックの「タイムアウト」を適当に伸ばしてあげてください。

f:id:smdbanana:20200202010853p:plain 10秒位あれば多分大丈夫。

プログラムはこんな感じですかね。
AWSのコストとEC2の状況をLINEで報告するLambda

boto3 がキモです。
AWSサービス関連を色々操作できます。
(このプログラムでは「EC2の状態確認」「料金確認」の2つに使ってます。)

プログラムが完成したら、最後に定期実行の設定を行います。 Lambdaの関数画面上部の「Designer」の左側に「+トリガーを追加」があると思います。

トリガーの選択で「CloudWatch Events」を選択します。

f:id:smdbanana:20200202010908p:plain

トリガーの追加をします。適当にスケジュール名や説明を入力し、ルールタイプをスケジュール式にします。

f:id:smdbanana:20200202011007p:plain

cron(00 12 * * ? *)

cronの時間はUTCで指定する必要があるので、JST(日本時間)のためには+9時間が実行タイミングとなります。 (上の例では21時に実行)

これで準備完了。 あとは時間になるのを待つだけです。

f:id:smdbanana:20200202011030p:plain

定期実行されることを確認しました。 料金状況も記載あるし、EC2各インスタンスの状況も見えている。

これでEC2停止忘れで数日後に切ない気持ちになる、ということはなくなりましたとさ。

私からは、以上です。

LINEのMessaging APIを使ってみた

どうも。

もはや生活インフラの一部となったLINE。 そのLINEを使ってメッセージを送れたら、なんて考えたことまりませんか?

「金曜日には週報を出そう」とか、 「月末には作業報告書を出そう」とかとか。

それ、けっこう簡単にできますよ。

ということでやってみました。 例に漏れず自分への備忘録です。

チャネルを作ろう

LINE使っている人ならわかると思いますが、「公式アカウント」これを使います。 (不特定多数の方を相手にする場合は有料になるかと思います。私は技術検証の名のもと個人で利用していますので。)

先ずは「LINE Developersサイト」にアクセスします。

developers.line.biz f:id:smdbanana:20200129021429p:plain
「ログイン」を押下します。

f:id:smdbanana:20200129021532p:plain
LINEのアカウントを使ってログインします。

f:id:smdbanana:20200129021552p:plain
ログインします。

f:id:smdbanana:20200129021714p:plain
Developersサイトのトップページに遷移します。
プロバイダーの作成をしましょう。
適当にプロバイダー名を入力し、作成を押下します。

f:id:smdbanana:20200129021823p:plain
プロバイダーが作成されたので、「Messaging API」を押下します。

f:id:smdbanana:20200129022017p:plain
Messaging APIのチャネルトップ画面に遷移しました。
「アイコン」「チャネル説明」「大業種」「小業種」「メールアドレス」あたりを入力し、規約に合意して「作成」を押下します。

チャネルを設定しよう

「Messaging API」の項目があるので、こちらを開いて上記のように編集します。
ポイントは以下の通り。

  • Webhookの利用をONにする。
  • Webhook URLを設定し、対象サーバでPOST内容を確認できるようにする。
  • グループ・複数人チャットへの参加を許可する は私はONにした。
  • 応答メッセージ は私はOFFにした。
  • あいさつメッセージ は私はOFFにした。
  • QRコードを控えておく。(友達登録に必要)
  • チャネルアクセストークンを発行しておく。

ここでは試しにWebhook URLのphpを書きます。

// Webhook用のページを用意
# vi /usr/share/nginx/html/post.php

// jsonリクエストをログに出力
<?php
error_log(print_r(file_get_contents("php://input"),true));

これで結果をログファイルに出力することができます。
以下は友達登録した場合のWebhook例。

// ログ内容を追従する
# tail -f /var/log/php-fpm/7.3/www-error.log

// 友達登録したよの通知。userIdの値が必要になります。
[28-Jan-2020 17:38:35 UTC] {"events":[{"type":"follow","replyToken":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX","source":{"userId":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX","type":"user"},"timestamp":1580233115449,"mode":"active"}],"destination":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"}

このように、Webhookを設定していたら逐次「どんなことがされたか」が取得できます。
今回は友達登録をしたユーザのIDを取得することができました。
同じように、グループにこのチャネルユーザ(公式アカウント)を入れても同様に「groupId」を取得することが可能です。

チャネルアクセストークンとuserId(またはgroupId)が揃ったら、Messaging APIは利用可能です。

送信してみる

一番簡単なcurlを使っての送信。

# curl -X POST -H 'Content-Type:application/json' -H 'Authorization:Bearer XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' -d '{"to":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX","messages":[{"type":"text","text":"This is a message."}]}' https://api.line.me/v2/bot/message/push

Authorizationに使うのがチャネルアクセストークン。 jsonのtoに使うのがuserId(またはgroupId)となっています。

curlではなく、AWS Lambdaで用意しておけば後々CloudWatch Eventsなどで活用できるので、それも作っておきましょう。

gisted9a1e6be46a52246024bc72819a627c

こんな感じです。
テストイベントはこんな感じに。

{
  "messages": [
    {
      "type": "text",
      "text": "AWS Lambdaでメッセージを送るテスト"
    }
  ]
}

さて、送信結果は・・・

f:id:smdbanana:20200129030911p:plain

うん。送信できています。

ね、簡単でしょう?

ということで、私からは以上です。

ポケモンの動作自動化にチャレンジしてみた

どうも。

年末年始でレイド乱数を実践してみましたが、乱数消費がやはり大変でした。
特定のコマンドを打ち続けること数時間。

これが自動でできたらどんなに楽だろう。

会社の後輩きしべはマクロコンを購入してトーナメント周回を自動化していましたが、当該のコントローラは「Homeボタンがマクロ登録できない」らしい。

↑マクロコントローラ確かこれ。これもだし、これ以外のコントローラどれもHomeはマクロ登録できない、らしい。

それに、マクロコンは記録させられるコマンド数に限りがある。。

何かいい方法ないかなー。とネットの記事を漁っていたらこんな記事見つけました。

error-astray.hatenablog.com

Arduino っていうラズベリーパイみたいな電子回路を使ってUSBコントローラ制御をしてやるぜ、というもの。
githubで色々な方が派生させており、動作するhexファイルをArduinoに書き込むだけで使える。
便利な世の中になりました。

今回も、自分への備忘録として残します。


装備

私の環境はこのようになっています

  • Windows10マシン : プログラムをArduinoに書き込むため使用
  • Arduino Uno : Amazonでスイッチサイエンスから出てるやつ(UNO R3 ATmega328P ATMEGA16U2)。今は販売されてない?
  • USBケーブル : タイプA-Bのもの。ドンキで購入。
  • USB変換コネクタ : タイプA to タイプC のもの。ダイソーで購入。
  • AWS : プログラムの待ち時間を変更したり、自分でプログラム内容を書き換えたかったのでubuntuのマシンを作成。

AWSについては、もちろんローカルで環境作っても問題ありません。
ローカルを汚したくなかったので簡単に作成できるAWSを選択したのです。

Arduinoに書き込む

書き込むプログラムは色々なところでアップされているので、それをArduinoに書き込むだけの簡単なお仕事。
私はWindows10マシンを使って書き込むことを選択しました。

Arduinoをマシンに接続し、ArduinoをDFUモードにします。 f:id:smdbanana:20200127131240j:plain ↑の赤枠の2本をショートさせてやる必要があります。
(通電さえできればいい。決してUSB変換コネクタなんかで通電させるべきではない。)

DFUモードにすると、不明なデバイスとして認識されます。
バイスマネージャを開いてみましょう。 f:id:smdbanana:20200127130258p:plain 「不明なデバイス」とありますね。

ドライバが必要となるので、以下のサイトにアクセス。 dfu-programmer.github.io 「Downloads」にある「project files page.」のリンクを辿り、「dfu-programmer-win-0.7.0.zip」をダウンロードして展開します。
展開したフォルダはC:\tools とか適当なフォルダに置いておきます。

バイスマネージャに戻り、「不明なデバイス」を右クリックして「ドライバーの更新」を押下。 f:id:smdbanana:20200127132029p:plain

検索方法を問われます。 f:id:smdbanana:20200127132058p:plain
下の「コンピューターを参照してドライバーソフトウェアを検索」を指定。

f:id:smdbanana:20200127132152p:plain
先ほど配置したフォルダを指定して「次へ」を押下。

f:id:smdbanana:20200127132240p:plain
ドライバが見つかるので、インストールします。

f:id:smdbanana:20200127132305p:plain
インストール完了。

f:id:smdbanana:20200127132330p:plain
バイスマネージャで反映が確認できます。
(一度反映されたら、以降はドライバインストールは不要です。)

書き込みのための準備が整いました。

では、試しにマジカル交換を自動で行うプログラム(見よう見まねで自分で作成してみた)を書き込みます。 github.com ここからMagicalTrade_1_box.hexをダウンロードし、dfu-programmer.exeと同じフォルダに配置します。 配置したら、PowerShellを起動し、以下の通りコマンドを叩きます。

> cd C:\tools\dfu-programmer-win-0.7.0 (配置場所は適宜置き換えてください)
> .\dfu-programmer.exe ATmega16U2 erase
> .\dfu-programmer.exe ATmega16U2 flash .\MagicalTrade_1_box.hex

画面キャプチャはこんな感じ。 f:id:smdbanana:20200127133700p:plain
(ERRORとか出てるけど知らん。)
書き込みが完了したらUSBを抜いて、switchに接続したら操作が開始されます。

f:id:smdbanana:20200127134036j:plain 自動化成功。

やったぜ。


AWSでプログラムのビルド環境を作る

AWSに関する詳細はここでは省くので、「AWSってなに?」って人は他の記事を見て勉強してください。

では、ビルド用のEC2を作成します。

f:id:smdbanana:20200127135106p:plain
インスタンスの作成」を押下。

f:id:smdbanana:20200127135159p:plain
ubuntuを選択する。

f:id:smdbanana:20200127135253p:plain
当然ながら無料枠。

f:id:smdbanana:20200127135321p:plain
確認画面に進んだら、「インスタンスの詳細の編集」を押下。

f:id:smdbanana:20200127135448p:plain
下の方に「高度な詳細-ユーザーデータ」があるので、以下を記載します。

#!/bin/bash
apt-get update
apt-get upgrade
apt-get install -y git make gcc-avr avr-libc apache2
rm -f /var/www/html/index.html

※ ↑ファイルダウンロードは何でもいいですが、今回はwebサーバを立てて公開する手法を選択しています。
※ 別にユーザーデータ使わなくても自分で上記手順を実行すれば同じことはできます。

f:id:smdbanana:20200127135636p:plain
問題なければ「起動」を押下。

f:id:smdbanana:20200127135704p:plain
キーペアは好きにしてください。とりあえずここでは新規で発行。
ダウンロードできたら「インスタンスの作成」を実行。

作成が完了したら、セキュリティグループの編集をします。(webサーバ公開&ssh制限) f:id:smdbanana:20200127135924p:plain
作成したインスタンスのセキュリティグループ名を押下。

f:id:smdbanana:20200127140232p:plain
インバウンドルールを編集し、「HTTP」を選択。
あとSSHはマイIPなど特定のIPだけ許可するよう変更します。

インスタンス設定はここまで。

次にサーバにsshでアクセスします。

以下のコマンドを実行。

$ mkdir poke
$ cd poke/
$ git clone https://github.com/smd877/Switch-Fightstick
$ cd Switch-Fightstick/
$ git clone https://github.com/abcminiuser/lufa
$ make magical-trade
$ sudo cp *.hex /var/www/html/.

makeの箇所は使うリポジトリによって指定方法が変わってくると思うので読み替えてください。
hexファイルをwebサーバ公開領域にコピーしてダウンロード可能な状態にしています。

あとはインスタンスのパブリックIPにアクセスすれば、ファイルをダウンロードすることができます。

f:id:smdbanana:20200127140705p:plain

ホラ、とっても簡単。

ちなみにwebサーバ立てなくてもscp等連携の方法は何でもいいです。
私はslackで連携していたりします。
(slack連携は1つ前に記事にしたのでそっちも見てみてね。)
smdbanana.hatenablog.com

私からは、以上です。