Raspberry Pi 3+Gmail APIでメールを受信して音声合成してみた #raspberrypi #gmail #golang
メールで
仕事では殆どメールを見る機会はないのですが、通知系のメールに気が付かなかったという経験をしたことがある人は多いはず。
今回はGmail のAPI を使ってメールを定期的に受信して、条件に合うメールの場合は音声で通知できる仕組みを Raspberry Pi 3
とGamil API
を利用して作ってみたいと思います。
Gamil API
利用を開始するまでにはいくつかステップがあって、いろいろなBlogで書かれていますが上記の公式サイトにあるQuickstart
で、利用する言語毎に書かれているドキュメントの通りに進めるのをおすすめします。公式ドキュメントが充実しているのと最新の情報が記載されているため、手戻りすることなく進めることができます。
今回は当然大好きなgolang
を利用するので以下に沿って進めていきます
Go Quickstart | Gmail API | Google Developers
https://developers.google.com/gmail/api/quickstart/go
準備
Google Developers Console
まずはGoogle Developers Console
にアクセスして
Google API Console
に移動します。
表示されたAPIの一覧からGmail API
を選択します。
プロジェクトが存在しないとAPIを有効化できないので、先にプロジェクトを作成します。
既存のプロジェクトでAPIを有効かする場合には、当然ですが新規にプロジェクトを作成する必要はありません。
APIを有効化しただけでは利用ができません。認証情報を作成する必要があります。
OAuth クライアントIDを取得するのですが、先に同意画面の設定が必要になります。
クライアントIDのアプリケーションの種類はその他を選択します。
設定が完了すると認証に必要な情報をJSONファイルとしてダウンロードすることができるので、ダウンロードして保存します。
詳細は以下の公式ドキュメントに書かれています
Authorizing Your App with Gmail | Gmail API | Google Developers
https://developers.google.com/gmail/api/auth/about-auth
Implementing Server-Side Authorization | Gmail API | Google Developers
https://developers.google.com/gmail/api/auth/web-server
Choose Auth Scopes | Gmail API | Google Developers
https://developers.google.com/gmail/api/auth/scopes
golang packages
次にgolangで必要になるパッケージを以下のコマンドを実行して取得します
$ go get -u google.golang.org/api/gmail/v1 $ go get -u golang.org/x/oauth2/...
実際に取得されるのは以下のパッケージになります。
パッケージの利用方法は、それぞれのパッケージに用意されているドキュメントを確認してください。 サンプルについてもパッケージのリポジトリにあるので参考になるかと思います。
動作確認
続けて動作と認可の確認を行います。
Go Quickstart | Gmail API | Google Developers
https://developers.google.com/gmail/api/quickstart/go#step_3_set_up_the_sample
上記のサンプルコードをそのまま利用するのですが、最初の工程でダウンロードしたGmail APIのクライアントIDのJSONファイルが必要になります。
サンプルコードをビルドして実行すると、コンソールに
Go to the following link in your browser then type the authorization code:
のメッセージと一緒にURLが表示されます。このURLが認可ページのURLになるのでブラウザにコピペしてページを表示します。
ブラウザに表示したら認可を与えるアカウントを選択します
認可の内容を確認します。今回は読み取りのみを指定しています。
問題がなければ許可をして、その後の画面に表示されるコードをターミナルに貼り付けます
これで次回の動作からはクライアント側に保存されたtokenを利用してアクセスすることができるようになります。
作ったもの
実際に作ってみたものは以下の写真のような感じに
使ったのは
- Raspberry Pi 3 MODEL B
- USB電源スピーカー(MS-UP201BK)
- USB電源LEDライト(100円ショップ)
ぐらいで、ラズパイはAmazon Echoもどきで遊んだ時のやつを再設定して利用しましたし、LEDライトは100円ショップで適当に買ったやつですし、唯一スピーカーが手元になかったので700円ぐらいのものを買った感じですね。
ラズパイだと情報も多いですし、選択肢もいろいろとあるんですが手間もかけずに適当に作れるのはいいですねー
Raspberry Pi 3 MODEL B
特別なことは何もしておらず、普通にRaspbianのLITEをインストールしてsshで接続できるように設定しました。
hub-ctrl
USBの電源をON/OFFするために、以下を参考して
Raspberry Pi B+ turn usb power off - Raspberry Pi Forums
https://www.raspberrypi.org/forums/viewtopic.php?f=29&t=93463
hub-ctrl をインストールしてあります。
ラズパイ3だとUSBの個別ポートで電源のON/OFFができると記載されている 記事も目にしましたが、手元のラズパイだと
pi@raspberrypi:~ $ hub-ctrl Hub #0 at 001:000 INFO: ganged switching. WARN: Port indicators are NOT supported. Hub #1 at 001:000 INFO: ganged switching. WARN: Port indicators are NOT supported.
pi@raspberrypi:~ $ lsusb -v Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter Couldn't open device, some information will be missing Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 255 Vendor Specific Class bDeviceSubClass 0 bDeviceProtocol 1 bMaxPacketSize0 64 idVendor 0x0424 Standard Microsystems Corp. idProduct 0xec00 SMSC9512/9514 Fast Ethernet Adapter bcdDevice 2.00 iManufacturer 0 iProduct 0 iSerial 0 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 39 bNumInterfaces 1 bConfigurationValue 1 iConfiguration 0 bmAttributes 0xe0 Self Powered Remote Wakeup MaxPower 2mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 3 bInterfaceClass 255 Vendor Specific Class bInterfaceSubClass 0 bInterfaceProtocol 255 iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0200 1x 512 bytes bInterval 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x02 EP 2 OUT bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0200 1x 512 bytes bInterval 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x83 EP 3 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0010 1x 16 bytes bInterval 4 Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. Couldn't open device, some information will be missing Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 9 Hub bDeviceSubClass 0 Unused bDeviceProtocol 2 TT per port bMaxPacketSize0 64 idVendor 0x0424 Standard Microsystems Corp. idProduct 0x9514 bcdDevice 2.00 iManufacturer 0 iProduct 0 iSerial 0 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 41 bNumInterfaces 1 bConfigurationValue 1 iConfiguration 0 bmAttributes 0xe0 Self Powered Remote Wakeup MaxPower 2mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 9 Hub bInterfaceSubClass 0 Unused bInterfaceProtocol 1 Single TT iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0001 1x 1 bytes bInterval 12 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 1 bNumEndpoints 1 bInterfaceClass 9 Hub bInterfaceSubClass 0 Unused bInterfaceProtocol 2 TT per port iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0001 1x 1 bytes bInterval 12 Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Couldn't open device, some information will be missing Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 9 Hub bDeviceSubClass 0 Unused bDeviceProtocol 1 Single TT bMaxPacketSize0 64 idVendor 0x1d6b Linux Foundation idProduct 0x0002 2.0 root hub bcdDevice 4.09 iManufacturer 3 iProduct 2 iSerial 1 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 25 bNumInterfaces 1 bConfigurationValue 1 iConfiguration 0 bmAttributes 0xe0 Self Powered Remote Wakeup MaxPower 0mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 9 Hub bInterfaceSubClass 0 Unused bInterfaceProtocol 0 Full speed (or root) hub iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0004 1x 4 bytes bInterval 12
な感じなんですが、個別のON/OFFは残念ながらできませんでした。
USBの規格としてPer-port power switching
というのに対応していると個別のON/OFFが可能みたいです。調べた限りだと
スゴイハブ USB2-HUB4Xシリーズ 製品情報
http://www.system-talks.co.jp/product/sgc-4x.htm
が動作実績がありそうな感じでした。
AquesTalk Pi
日本語を音声合成するためのTTSとして、以下のAquesTalk Piをインストールしてあります
AquesTalk Pi - Raspberry Pi用の音声合成
https://www.a-quest.com/products/aquestalkpi.html
今回はなるべく手軽に実現したかったのでAquesTalk Piを選択しましたが、他にも
Open JTalk
http://open-jtalk.sourceforge.net/
なんかを利用している人が多いようです。
また、クラウドサービスを使って音声合成をすることももちろん可能なのですが、今後家のネットワーク以外の例えばSORACOM Air
なんかを利用したい場合を考えると、ラズパイ側で処理できるなら処理した方が良いかなーと。
クラウド側で処理する場合は
あたりが定番でしょうか?
意外だったのはGoogleにはTTSのAPIがなさそということでしょうか・・・音声認識はあるので、内部的には当然あるんでしょうけど。
あとは、crontabで作ったプログラムの定期実行と起動時のUSBのコントロールを行っているぐらいです
pi@raspberrypi:~ $ crontab -l # Edit this file to introduce tasks to be run by cron. # # Each task to run has to be defined through a single line # indicating with different fields when the task will be run # and what command to run for the task # # To define the time you can provide concrete values for # minute (m), hour (h), day of month (dom), month (mon), # and day of week (dow) or use '*' in these fields (for 'any').# # Notice that tasks will be started based on the cron's system # daemon's notion of time and timezones. # # Output of the crontab jobs (including errors) is sent through # email to the user the crontab file belongs to (unless redirected). # # For example, you can run a backup of all your user accounts # at 5 a.m every week with: # 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/ # # For more information see the manual pages of crontab(5) and cron(8) # # m h dom mon dow command # ggm */3 * * * * /home/pi/ggm/ggm #set init @reboot amixer set PCM 100% @reboot sudo hub-ctrl -h 0 -P 2 -p 0
golang program
やっていることはGmailをAPI直接ではなく、golangのSDKを利用して受信しているだけです。
特に変わったこともしていないので、何の参考にもならないかもしれませんが・・・
動作の設定で記述が必要なのは.ggm/user_config.json
ファイルだけです。
{ "LastDate": 1504243346130, "LastTotal": 749, "UserEmail": "test@example.com", "SpeakCommands": [["/home/pi/aquestalkpi/AquesTalkPi", "-s", "120", "%s"],["aplay"]], "UsbCommands": [["sudo", "hub-ctrl", "-h", "0", "-P", "2", "-p", "%d"]], "Filters": [ { "From": "user1@example.com", "Subjects": ["test","user1"] }, { "From": "user2@example.com", "Subjects": null } ] }
SpeakCommands
には音声合成するためのコマンドを記載しますが、配列で1つのコマンドを表して、配列を配列に入れることでパイプでつないで実行します。なので、上記の例だと
$ /home/pi/aquestalkpi/AquesTalkPi -s 120 %s | aplay
のコマンドを実行していることになります。コマンド中の%s
にはGmailの受信した内容が入ります。
UsbCommands
にはUSB電源管理するためのコマンドを記載します。形式は前述の通りです。コマンド中の%d
はON/OFFの数値が入ります。
Filters
には音声合成対象のメール条件を記載します。From
には送信元のメールアドレスを、Subjects
には配列で件名を記載します。特に指定がされていない場合にはすべてのメールが対象となります。
cross compile
Raspberry Pi 3 用にgolangをコンパイルする際には
Installing Go from source - The Go Programming Language
https://golang.org/doc/install/source#environment
を参考にして環境変数を指定するわけですが、$GOARM
に指定する値はラズパイ上で以下のコマンドを実行すると確認できます。
pi@raspberrypi:~ $ uname -m
armv7l
どうやらv7らしいので
$ GOOS=linux GOARCH=arm GOARM=7 go build -v
とすれば、今回の利用するライズパイ上で動作するバイナリがビルドできることになります。
動作デモ
で、実際に動作するとどうなるのか?というと・・・
twitter.com音声合成できたー楽しい pic.twitter.com/ZRDM7dXPoG
— Manabu Uchida (@uchimanajet7) 2017年9月6日
な、感じになりました。思ったよりちゃんと音声合成できていて個人的には十分かなぁーと思いました。
まとめ
- Raspberry Pi 3 は結構サクサク動く
- これだけ動けばgolangでちょっとしたことは余裕そう
- 今回は簡単にやってみたかったので複雑なのは却下した
- Gmailだとpush通知を利用した方が良いかもしれない
Push Notifications | Gmail API | Google Developers
https://developers.google.com/gmail/api/guides/push
- SORACOM Airを利用したい場合、USBドングルを使うことになるのでUSB電源をOFFにする動作が微妙
- 前述した
Per-port power switching
に対応したUSBハブを導入して回避する - USBをON/OFFしている理由は、雑音が聞こえることがあるのとUSBライトを受信時にだけに光らせたいから
- 予算や手間を気にしないならCrystal Signal Pi みたいなのを導入するのもありかもしれない
- 雑に扱っても大丈夫というのが1つの目的だったので自作はなるべくなし
- golangはいろいろできて楽しい
- 急に喋り出すので若干びっくりする
- 特に夜中とか怖いw
- 要望は叶えられたので便利にはなった
- また機会があればぜひなんかやってみたい
以上になります。
Cloud Automator のAPI に後処理が追加されたのでCLIにも追加した件 #cloudautomator #golang #swx
気がついたら
Cloud Automator
のAPIが後処理に対応していました。
Cloud Automator API | /post_processes
https://cloudautomator.com/api_docs/v1/api.html#後処理
APIの詳細は上記の公式サイトを確認してもらうとして、数も多くなさそうなので作ったCLIにも追加しようと思います。
追加した
というわけでv0.1.1
でCloud Automator
APIの後処理に対応するコマンドを追加しました。
下記のようなコマンドでsqs
の後処理を新規に追加することができます。
$ ./ca post-process create \ --name "後処理テスト" \ --service sqs \ --parameters sqs_aws_account_id=1\ ,sqs_queue="example-queue"\ ,sqs_region=ap-northeast-1
--parameters
はobject
型ですので、他のobject
型と同様に
“APIのパラメータ名=値” の形で指定して、パラメータ同士は",“で繋いで表現してください。また、配列を表現する場合は”APIのパラメータ名=値,値,値“のように値を”,“で繋いで表現してください。
まとめ
- 数が多くないので手作業でもなんとかなったが、やっぱりAPI定義から自動で作れるような仕組みは必要
- 今回もAPIドキュメントにTypoがあり、コピペしてそのまま使ったら404で少しハマった・・・
- APIドキュメントのどの部分が更新されたのかわからないので、とりあえず全部目を通して変更点を探す必要があった
- 新規追加はわかりやすいが、既存のAPIにパラメータの追加とかは数が多くなったら見て確認するのは難しい
- テストがないので既存のコード変更後の確認が大変だった
- 足りないところやできていないところを何とかしたい
以上になります。
OneTab のTabリストを整理するCLI をgolang で作ってみた #golang #onetab
便利な
みんな知ってるGoogle Chrome 拡張機能のOneTab
ちょー便利なのでよく使うんですが、気軽に使えすぎてOneTab
のリストがどんどん膨れ上がってきませんか?
・・・と、こんな感じでどんどん増えて行くわけですが
OneTab
に同じURLが登録されているOneTab
側にリストを整理するような個別な機能がない- UI上でマウスを使って移動や削除はできる
- 数が多くなるとこの操作も大変
- リストの登録件数が多くなると重くなる
- PCのスペックにもよるが手元だと2,000件ぐらいから重い
- 登録や削除が重くなる
というわけで、他に需要があるとは思えないCLIを作ってみました。 自分でも使ったのも1回きりというね・・・
作ったのは
使い方は簡単でOneTab
からURLの書き出しで出力されるリストをファイルに保存して
コマンドラインで保存したファイルを指定してコマンドを実行するだけ
$ ./tlc run "your_file_path" -w
-w
オプションでHTTPリクエストでURLがアクセス可能かどうかをチェックします。
やってること
すごい単純なことしかやってませんが
OneTab
から書き出したURLリストを保存したファイルを読み込む- 読み込んだファイルからURLをキーにして
URL文字列が完全一致
するものを削除 - URLで削除したリストを今度は
名称文字列が完全一致
するものを削除 -w
オプションが指定されていた場合、URLがアクセス可能か(status == 200)かどうかチェックする
だけなので、当然ですが
- URL文字列が異なり同じWebページだった場合は違うとみなされる
- 例えばSNSからのリンクがわかるようなパラメータ付きとパラメータ無しのページなど
- 名称文字列が同一でURLが異なる場合は、同一とみなさせる
- すべてのページで同じ名称がつけられているページなど
- URLのアクセスチェックでステータス200以外の場合はアクセスできないとみなされる
- ブラウザと同等の判定はしていないため、ブラウザで見れるのNGと判定される場合がある
という制限?問題点?はあります。
ダメだったこと
簡単にできそうで、できなかったことを書いておこうかと。
- URLからHTMLの内容を取得して、取得した内容をハッシュ値で比較
- セッションIDや広告IDなどのアクセスするたびに異なる値がHTMLに含まれることがある
- これによりハッシュ値が同一のページでも毎回異なる
- URLにアクセスできるかをブラウザと同等の判断で行う
- ブラザと同等となるとブラザそのものでチェックした方が早い
- 現状ではCDNでJSを使ったリダイレクトなどしていると上手く判定できない
- リダイレクト回数が多い場合に上手く判定できない
そもそもよく考えたら、どれもダメだよねーとw
まとめ
- とりあえず動くところまでは出来ている
- golangって便利ですなぁ
- リストの重複を除く仕組みをもうちょっと考える必要がある
- 今ならGoogle Chromeのヘッドレスモードを利用できるならした方が良さそう
- CLIにしたけどWebでできた方が手軽そう
- というか
OneTab
側になんか整理する機能があってもいい気がする - そもそもこんな使い方している人が他にいないかもしれないw
以上になります。
GitHub のREADME にgif 画像を表示する1番簡単な方法 #github #gif
画像を
GitHubのREADMEにgif画像を貼り付けたいってことってありますよね。今回作ってみたこれ↓でも1枚だけ貼り付けたい感じになりました。
当然Google先生でgithub readme gif
とか入力して調べてみるわけですが
github readme gif
https://www.google.co.jp/search?q=github+readme+gif
どーやら↓の2つの方法が主流っぽい感じ?
1
の方法は確かに手軽だけど、それだけのためにbranchが残り続けるのが個人的には好きじゃないので却下。これするなら素直にmaster branchに画像ファイル追加するなぁ
2
の方法は利用したこともあるし、Wiki使ってドキュメント書くならアリだと思うんですが・・・今回はファイル1個なのが迷うところ。
2
と似てるけどGitHub Pages
でも同じようなことは出来ますよね。こっちもページ公開するならアリだと思うけど、今回はファイル1個・・・
もっと手軽に
画像1個で画像自体のバージョン管理が必要ないので、もっと簡単に出来ないかなぁーと。そこで思いついたのが以下の方法になります。
- GitHubのリポジトリにissueを起こして、そのissueに画像を貼り付ける
- issueの画像はMarkdown記法でリンクが記述されているのでそれをコピー
- 画像を貼りたいREADMEにこのリンクを張り付ければOK
今回はこの方法を利用しているので、実際にissueに貼った画像を使ってREADMEに画像を貼り付けています
この方法の良いところ
- issueを作って画像を貼り付けるだけなので手軽
- 余計なbranchが残り続けることもない
- issueなので、そのissueのためにbranch切ってpull request起こせば、なんでこうなってるのかがあとからもわかる
- そもそもREADMEを更新するのでpull requestを起こすはず
- issueなので対応が終わったらcloseしちゃえば良い
- 画像を差し替えたい場合も、差し変えるためのissueを起こせば同様の手順でOK
- issueの画像リンクがMarkdown記法なので、そのままコピペできる
- 何と言っても手軽
ということで、手軽で良い感じかと。 何かの参考になれば。
以上になります。
日経Linux2017年9月号にちょっとだけ載った件 #ITpro #swx #aws
きっかけは
先日↓退職Blogをアップしていたおねーさんが
社内Slackで
「Amazon AIネタで雑誌に書いてみませんかー?締め切り近いけどw」
的な募集をかけていました。なんてゆるいw 素敵すぎる!
Amazon Pollyなら以前にアドベントカレンダーでネタにしたこともあるのでワンチャン!と思いとりあえず手を挙げてみました。
そしたらありがたいことに執筆させてもらえることになりました。
書いたのは
記事を書いたのは↓の「日経Linux2017年9月号」で、内容はAWSのAIサービスについてになります。
実際にはAmazon PollyとAWSの概要についてを担当しました。
書いてみて
- 書くのにあたってAWSサイトを色々見たけど、ドキュメントが多くてしっかり書いてあるのを再認識
- というか、これWebが見らえる環境ならわざわざ紙にする必要があるのかどうか気にするレベル
- 規定の文字数にまとめるのは大変
- 雑誌という限定される中で、編集の方がいろいろ工夫されているのがわかった
- どの業界でもユーザーにどうやって価値を届けるのか?に違いはないんだなぁーと
- こちらが雑誌という媒体に慣れてないため、何度か手間を取らせてしまった
- 次回からもうちょっと色々考えてこちらから提案できるようにしたい
- 知ってるつもりでも、まとめたり再度調べなおしたりすると色々と発見もあり自分でも大変勉強になった
- とにかく良い機会だった
まとめ
- 気になったら是非お手にとっていただければ!
- 日経Linuxに小さいけど自分の名前が載るとかテンション上がる!
- おねーさんと最後にお仕事っぽいことが出来てよかった!
- 雑誌編集の人の雑誌に対する姿勢にいろいろ学べた
- 雑誌だろうと、Webサービスだろうとやっぱりユーザー視点ってすげー大事だなと
- もっと他の業種の人とも一緒に仕事できると、こういう気づきがありそうなので機会があれば積極的にやっていきたい
- 文章書くのに慣れてないから時間がかかった
- けど楽しいので文章書くのも機会があれば積極的にやっていきたい
- こういう良い機会に関われてよかった
- ↑少しですがちゃんと
Cloud Automator
の宣伝もしておりますw
以上になります。
Cloud Automator のAPI を呼び出すCLI をgolang で作ってみた #cloudautomator #golang #swx
知ってますか?
Cloud Automator
というサービスがあるんですが・・・知ってますか?
簡単に言うと 画面からのカンタン操作でAWSの運用を自動化 することが出来るサービスかなーと。画面から操作できるのは大変便利なのですが、大量の定型処理を行う場合にはやっぱりしんどいですよね・・・
しかし、最近Cloud Automator
のAPIが公開されました。
Cloud Automator API
https://cloudautomator.com/api_docs/v1/api.html
APIはあるけど・・・
APIが公開されていれば、プログラムの中から使えるから画面からの操作じゃなくてもなんとかなる!と、現実はそんなに簡単ではないのでなかなか難しいところもありますよね。
じゃーターミナルでcurlを使って頑張ればいいじゃないか!と、思うじゃないですかー
・・・黒い画面大好きな国の人でもちょっと大変という感想がっ!
SDKとかCLI何かがあれば多少は違うのかなぁーと思いつつ、Cloud Automator
のサービススタンスとしては、CLIは難しいラインなのかなぁーとも思いつつ
そこで
仕事で考えるからややこしい話になるんだなぁーと気がついた & 最近議事録や予定調整などしていて、コードも書いてなければAWSも触れてないと気がついたので、せっかくだから公開されているAPIドキュメントを見ながらCLIを作ってみることにしました。
CLIを作るにあたって、身近なCLIを参考にするのが良さそうなので以下の2つを色々見てみました。
自分が使うだけなので、手元のMacとAmazon Linuxで動けばいいのでPythonって選択肢もアリでしたが、やっぱりここは仕事では書く機会がありそうもない大好きな言語であるgolangで作ってみようかと。
golangにはcobraというちょー便利なパッケージがあるので、もちろんこれを利用して作っています。
他にも色々と便利なパッケージがあり、今回は
なんかを利用しています。
また、上記のようにgolangのパッケージをまとめているサイトがいくつかあるので、こういうサイトを利用して必要なパッケージを検索出来るのはありがたいです。
とりあえず
自分用ということで作っていて、とりあえず動くところまではできた感じです↓
golangのクロスコンパイルでMac/Linux/Windows用のバイナリファイルは作りましたが・・・MacとLinuxは動くのは確認しています。Windowsは動かなかったらゴメンなさいw
インストールとか操作については、README.md&ヘルプコマンドの表示で何とかしていただければ・・・
分かりにくいところ
Create Job のAPIで受け取るパラメータのrule_valueとaction_valueが直感的ではないので、少々分かりにくいかもしれません。
Cloud Automator API
https://cloudautomator.com/api_docs/v1/api.html#ジョブ-post
上記のAPIドキュメントを確認すると、rule_valueとaction_valueについてはobject型の値を渡さないといけないようです。
object型はJSONになるのですが、CLIでJSONは結構大変なので今回は以下の例のように対応しています。
$ ./ca job create \ --name "ca job create exsample" \ --aws-account-id 1 \ --rule-type cron \ --rule-value hour=2,minutes=0,schedule_type=weekly,weekly_schedule=monday,friday \ --action-type create_image \ --action-value region=ap-northeast-1\ ,specify_image_instance=identifier\ ,instance_id=i-xxxxxxxxxxxxxxxxx\ ,generation=1\ ,image_name=exsample-ami\ ,description="Job Create Exsample Cloud Automator CLI"\ ,reboot_instance=true\ ,additional_tag_key=name\ ,additional_tag_value=exsample\ ,add_same_tag_to_snapshot=true\ ,trace_status=true\ ,recreate_image_if_ami_status_failed=true
–rule-value hour=2,minutes=0,schedule_type=weekly,weekly_schedule=monday,friday
“APIのパラメータ名=値” の形で指定して、パラメータ同士は",“で繋いで表現してください。また、配列を表現する場合は”APIのパラメータ名=値,値,値“のように値を”,“で繋いで表現してください。
作ってみて
- golang はやっぱり楽しいねーもっと使えるようになりたい
- 各種パッケージで色々できるのは楽でいい
- SORACOMさんのCLIはAPI定義からSDKなんかと一緒に自動生成みたい
- 手で組んでも作れるけど、同じようなコードになっていくから自動生成は幸せになれそうで素敵
Cloud Automator
のAPIも確か API Blueprintを使っていたはずなのでワンチャンあるかも?
API Blueprint | API Blueprint
https://apiblueprint.org/
- object型をCLIで表現するのに困った
- AWS CLIの引数指定の仕方を参考にしてみたが、APIパラメータを知らないと使えない感じもするので悩ましい
- 自分用に作ったのでテストがなかったり、コメントだらけのソースだったりすのでなんとかしたい
- Circleci2.0を使ってみれたのはよかった。速くてすばらしい
- Codeshipも気になるので時間があるときに使ってみたい
- golangで作られたツールのリポジトリを見ると、AppVeyorを利用してWindows環境でテストとビルドをしているところも多いみたいなので気になる
- 使ってみたかったslideshipをやっと使えた
- Markdownでサクサク書けるのは便利
- 簡単に作れるので使っていきたい
- APIドキュメントが間違っている可能性?
Cloud Automator API
https://cloudautomator.com/api_docs/v1/api.html#ジョブ-patch
- API定義からAPIとドキュメントが生成されていない?
- ドキュメントだけ間違っている場合は、このドキュメントを元に作っているので間違った仕様になってしまう
- 上記の場合だとedit処理なのに、id意外も必須とされている・・・
まとめ
- 楽しいのはやっぱり大事だよね
- 手を動かして作っていかないと知らないことも多くなってる
- 自分用でもちゃんと最初からテスト書こう
- もうちょっと頑張ろうと思った
以上になります
Microsoft Azureオンライントレーニングをやってみた #microsoft #azure #mooc
AWSは好きで触る機会も多いのですがここのところ他のサービスやプロダクトはなかなか触る機会がありませんでした。
これではイカン!と思い今回は時間を作って Microsoft Azure
を触ってみました。
なぜAzureか?
先日のGoogle Cloud Nextに参加して、時間があるときに触るならGCPだなーと思っていたんですが・・・
みんな大好きガートナーのマジッククアドラント2017年版のIaaSでAWSに続き2位がAzureだと。
加えて、AWS技術者のためと記載があるオンライントレーニングがあるとのことだったので触ってみる事にしました。
オンライントレーニング
Microsoft Azure
を触ってみるとは言っても、何か急いでやることがあるわけではないので今回はマイクロソフト社が用意している無料のオンライントレーニングを利用してみました。
Azure Training Courses | Microsoft Learning
https://www.microsoft.com/ja-jp/learning/azure-skills-training.aspx
たくさんあるオンライントレーニングの中から、
AWS の専門家のための Microsoft Azure
というわかりやすい名前のものにチャレンジしてみました。AWSはSAアソシエイトしか持ってないので全然専門家ではないのですが・・・
AWS の専門家のための Microsoft Azure | Microsoft Learning
https://openedx.microsoft.com/courses/course-v1:Microsoft+AZURE213x_JPN+2017_T2/about
当然この他にも無料で受講できる多数のオンライントレーニングがあり、今回利用したオンライントレーニングと同様に日本語化されているものも多いので、ご興味ある方は一度見てみることをおすすめします!
次はオンライントレーニングを受講するために必要なアカウントを取得していきたいと思います。
microsoft learning accountの取得
AWS の専門家のための Microsoft Azure | Microsoft Learning
https://openedx.microsoft.com/courses/course-v1:Microsoft+AZURE213x_JPN+2017_T2/about
上記オンライントレーニングサイトで利用するアカウントになります。登録はもちろん無料で入力項目も多くないのですぐに登録できると思います。
登録が完了したら今回受講するコースのAWS の専門家のための Microsoft Azure
を選択して受講ができるようにします。
このトレーニングサイトはOSSで提供されているOpen edX
というプラットフォームを利用してAzure上で動かしているようですねー
無料のAzureアカウントの取得
上記のサイトから登録すると
- ¥20,500の無料クレジット付与
- 30日間の完全無料期間
- 無料期間中の支払いはなし
の状態でAzureを使い始めることができるようです。 クレジットの付与とか期間限定での全サービス無料はすごく良いですねー
30日間の期間が終了しても無料枠が設定されているサービスは複数あるので、継続利用ができるのは助かりますね。
登録するにはクレジットカード
が必要になります。これはサイト上にも記載がありますが課金のためではなく、ID認証に使用されるようです。
また、登録確認のコードがSMSで送られてくるためSMSを利用できる電話番号が必要となります。
もしMicrosoftアカウントを持っていない場合には、まずMicrosoftアカウントの取得が必要となります。
ホーム - Microsoft アカウント
https://www.microsoft.com/ja-jp/msaccount/default.aspx
登録が終了してAzureポータルにログインすると、クレジットが付与されていることを確認することができます。
以上でアカウント関係の準備が終わったので、次はいよいよ本題であるオンライントレーニングを進めていきたいと思います。
オンライントレーニング 実践編
オンライントレーニングサイトにログインして、今回受講するAWS の専門家のための Microsoft Azure
を選択します。
あとはCourseタブを選択して、ドキュメントを順番に読み進めていくことでトレーニングを進めることができます。 ドキュメントはモジュールと言われる単位で章に分けられていて、各モジュールごとに1つのテーマを学習できるようになっています。
取得したAzureアカウントを利用するような部分はラボと呼ばれていて、基本的にはドキュメントに沿って自習していく形になります。
また、説明の動画が用意されていることがあり、動画自体は英語ですが動画横に字幕として日本が表示されているので、個人的に英語に弱いのでとても助かりました。
オンライントレーニングの最後には最終評価
として、これまでのトレーニングで得た知識をチェックする選択式の質問があります。
すべての質問に回答すると、最後にスコアが表示されます。 オンライントレーニングの終わりに任意回答のアンケートがあり、それですべてのオンライントレーニングが終了となります。
オンライントレーニングの詳細な内容については、受講して体験してもらうのが良いと思うので、ぜひチャレンジしてみてください。
まとめ
個人的によかったところと、もうちょっとカイゼンしてもらえたら嬉しいなーと思ったところを記載してみました。
よかったところ
- ドキュメントが細かいところまで詳しく書いてある
- 関連するドキュメントなどにリンクされている
- モジュール単位で分割されているので、知りたい情報や学習したい部分がわかりやすい
- 最後に理解度を試せるのは良い
- Azure Active DirectoryやAzure Resource Managerなど、知らないことも多く勉強になった
- Azure Resource Managerが便利で素敵
- AWSとAzureの比較があることで理解しやすい部分もあった
もうちょっとカイゼン希望
- アカウント取得がちょっと面倒くさい
- オンライントレーニングならSandbox的なところで出来ると嬉しい
- 日本語化がおかしなところがある
- Azureのアイコンとサービス名を覚えるまで大変
- 最終評価で間違った問題だけを見られるとか工夫が欲しい
- もっと言うと間違った問題の正解がわからない
- 間違った問題の正解を表示するか、モジュールのどの部分を学習しなおしするのかリンクなりで案内してほしい
- 復習を行うときに便利だと思う
- CLIの実行がWindows OS前提っぽい?のはちょっと残念
- Linux仮想マシンへの接続は、Windowsより若干面倒に感じる
- Windowsと同じぐらい簡単に出来ると嬉しい
とにかくドキュメント量が多く質も素晴らしいので、丁寧に読んだりリンクされている先まで読んだりしているとなかなかの時間がかかります。
このコースを最大限に活用するため、各モジュールの学習に平均 3 ~ 4 時間をかけることをお勧めします。
と、最初に書かれていたので平均合計時間は 3 ~ 4 時間×6モジュールで18~24時間
かかる想定のようです。
で、実際にはどのぐらい時間がかかったのか?という所ですが・・・今回は細かく計測してないので正確ではないのですが、だいたい20時間前後ではないかと思います。
最初の方は細かくドキュメントを追っていたので思ったより時間がかかった印象で、慣れてきた中盤は引っかかる部分だけ読み込む形になり、Azure Active DirectoryやAzure Resource Managerなどの全然知らなかった項目で、また時間を使った感じになりました。
進め方は人それぞれかと思いますが、AWSの考え方と似ている部分があったり、以下のようにAWSとの比較をしてくれている資料が出てくる部分があったりとしますが、比較で覚えるのではなくAzureが持っている特徴を理解していくのがいいのかなぁーと感じました。
自分のペースで進めていけるので、トータル時間はそこそこ必要ですが無目的にAzureを触るよりは断然お勧めできます。私個人としてはAzure Active DirectoryやAzure Resource Managerのモジュールは大変勉強になりました。
もしAzureアカウントを取得するのが面倒であれば、一旦オンライントレーニングのアカウントだけでも良いので取得して、まとめられた豊富なドキュメントを読んでみるのがいいのではないかと思いますので、ぜひお試しください!
以上になります。