Azure DNS の TTL を ARM テンプレートで展開する

ARM リファレンスを見れば載ってるけど、Azure DNS を ARM テンプレートで展開するときに TTL も一緒に設定するテンプレート。
単に NS レコード、SOA レコードで指定してあげればいいけど、name に @ を指定するまでにたどり着くのにちょっと時間が掛かったのでメモしておきます。

尚、ネームサーバーを指定することはあまりお勧めできませんので、別デプロイとして、NS レコードの設定を行います。

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
    },
    "resources": [
        {
            "type": "Microsoft.Network/dnszones",
            "name": "tsunomurdns.contoso.com",
            "apiVersion": "2016-04-01",
            "location": "global",
            "properties": {},
            "resources": [
                {
                    "name": "@",
                    "type": "SOA",
                    "apiVersion": "2018-05-01",
                    "properties": {
                        "metadata": {},
                        "TTL": "123",
                        "SOARecord": {
                            "host": "tsunomurdns.contoso.com",
                            "email": "contoso.com",
                            "serialNumber": "1",
                            "refreshTime": "11",
                            "retryTime": "22",
                            "expireTime": "33",
                            "minimumTTL": "44"
                        }
                    },
                    "dependsOn": [
                        "[resourceId('Microsoft.Network/dnszones/', 'tsunomurdns.contoso.com')]"
                    ]
                }
                
            ]
        },
		{
      "apiVersion": "2015-01-01",
      "type": "Microsoft.Resources/deployments",
      "name": "updateZone",
      "dependsOn": [
          "[resourceId('Microsoft.Network/dnszones/', 'tsunomurdns.contoso.com')]"
      ],
      "properties": {
        "mode": "Incremental",
        "parameters": {},
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "parameters": {},
          "variables": {},
          "resources": [
              		 {
                    "name": "tsunomurdns.contoso.com/@",
                    "type": "Microsoft.Network/dnszones/NS",
                    "apiVersion": "2018-05-01",
                    "properties": {
                        "metadata": {},
                        "TTL": 111111,
                        "NSRecords": "[reference(resourceid('Microsoft.Network/dnszones/NS/','tsunomurdns.contoso.com','@'),'2018-05-01').nsRecords]"
                        ,
                        "targetResource": {}
                    }
                    
                }
          ],
          "outputs": {}
          }
        }
    }
    ],
    "outputs": {
    }
}

Azure Functions を使って、Nature Remo から Mackerel にメトリックを投げる

もう何番煎じのネタかわかりませんが、Nature Remo のデータを Mackerel のサービスメトリックに投げてみたのでそのメモです。

Nature Remo を使っていた以前、iRemocon という同じようなセンシングデバイスを使っていました。

その時は Zabbix から iRemocon に telnet でデータを pull して、それをグラフ化&アラートに投げるというレガシーな方法でアクセスしていたのですが、Nature Remo にしてからその辺できていなかったのでGW の宿題としてやってみることにしました。せっかくなので、クラウドネイティブ的に、サーバーレスでやってみました。

今回使った技術としては、

  • TypeScript
  • Azure Functions
  • Azure DevOps(Pipelines)
  • Mackerel API
  • Nature Remo API

です。

Nature Remo API からのデータ取得と Mackrel API への投稿

ソースコードはこちら。使ってみたかったという理由で TypeScript にしています。
github.com


Nature Remo APIへのアクセスの仕方等はググるといくらでも出てくるのでここでは書きませんが、API はSwagger にあるので、こちらを参考にしました。

Swagger: http://swagger.nature.global/

Cloud API と Local API がありますが、Cloud API を使ってます。必要かどうかはさて置き、iRemocon と違って、湿度が 10 % 単位に丸めないで欲しいなぁと思いました。

Mackrel API への投稿はこちらのドキュメントを参考にしました。
mackerel.io

サービスメトリックの投稿についてはそんなにはまることなくすんなりいきましたが、メトリック名に日本語を使うと 400 が返ってくるので諦めて英語にしました。
あと、Slack からの Slash Commands を使って、例えば /mkr graph とかやったらグラフを取得する、みたいなことをしたかったのですが、グラフ画像を取ってくる API を見つけられていないのでどうしようかなぁと悩み中です。

Azure Functions

今回は、定期的にデータを取得して投稿する、ということをしたかったので、Azure Functions の Timer Trigger を使いました。
docs.microsoft.com

function.json に cron 式を書くことができます。
こんな感じ。*NIX 出身者的には分りやすくていい記法ですね。

"schedule": "0 */1 * * * *"

CI/CD

ソースコードGitHub にありますが、CI/CD の方法として Azure DevOps の Pipelines を使いました。
Azure Functions のデプロイセンターに Local Git を設定する方法も考えたのですが、TypeScript からトランスパイルをしないといけなかったので、Pipelines を使うことにしました。
Push があった場合、自動ビルドして、リリースはマニュアルとしました。

といってもやることはほとんどなく、ビルドは Azure Functions for Node.js というテンプレートがあったのでそのまま使えました。
テンプレート
f:id:mitsuki0820:20190429024835p:plain
設定後
f:id:mitsuki0820:20190429024918p:plain

リリースも、Azure Functions へのリリースがテンプレートとしてあったのでこれもそのまま使います。
テンプレート
f:id:mitsuki0820:20190429025038p:plain
設定後
f:id:mitsuki0820:20190429025203p:plain

まとめ

これまで Azure Functions を使う時は適当な JavaScript をポータルからそのまま入力する方法で何となく使ってましたが、今回初めて VS Code + TypeScript という開発環境でやってみました。

Functions + TypeScript + VS Code + Pipelines の組み合わせ、めちゃめちゃ楽ですね。
特に VS Code を使っていて、F5 → Functions のデバッグがコーディングを中断させず、ブレークポイントも手軽に張れるのはすごく便利。

Storage Account の静的 Web サイト ホスティング + Azure Functions with TypeScript で(開発生産性の観点でも)十分動的サイト作れそうですね。


次は Durable Functions やってみようと思います。

Microsoft の OpenHack に行ってきた

最初は特にブログに書くつもりもなかったのですが、あまりに素晴らしいイベントで、さすがにインプットをそのまま肥やしにするのはもったいないと思いましたので書くことにしました。

OpenHack とは?

Microsoft が主催する 3 日間の開発イベントです。全世界で開催されており、東京は(MSの)今期3回目、過去機械学習 や サーバーレス をテーマにした回があったようです。
今回のテーマは"Intelligent Bots"でした。

イベントカレンダーがこちらにあります。
openhack.microsoft.com


イベントの雰囲気はこんな感じです。
www.youtube.com

動画の様な感じで、100人くらいの参加者を 20 くらいのテーブルに分けて、4~5人 + コーチ1人が集まってテーブルごとに課題を進めていくような形です。

このコーチは世界各国から集められており、私のテーブルには韓国から来たエンジニアでした。
初日、受付が終わった後やたらと英語のスピーカーがいて、最初はやってしまった感がありましたが、参加者はほとんど日本人でホッとしました。。
ただ、コーチは英語しか話せないので基本的に英語でやり取りする必要があります。一応通訳者もいましたがいちいち通す時間ももったいないので、私含め皆さん自力で頑張っていました。

なぜかひどい英語を話す私が通訳するようなこともあり、こういう時やっぱり普段英語にある程度触れているのと全く触れていないのは違うなぁというのは感じつつ、(もう何度思ったかわかりませんが)改めて英語ちゃんとやろうと思いましたね。。

どんな感じで進めるの?

進め方としては、コーチから課題を出されて、それを1つずつ解いていくような形です。たぶんコーチによる部分もあると思いますが私のテーブルでは、こういう課題があります、では皆さん頑張って、という感じでかなりスパルタでした。

ただ、そこからみんなでワイワイガヤガヤやりながら、分からないところはコーチにアドバイスを求めて、という感じで、すごく楽しい雰囲気ですすめられました。

同じテーブルになった方は開発経験があまりない or JavaScript/Git のような Web 開発をやったことがない or Azure をあまりご存知でない、というスキルセットだったので、MS からの参加者という負い目(?)もあり、私は結構フォローに回っていました。
そういう意味で、チーム開発のようなものも久しぶりに味わえたので楽しかったですね。

課題の内容は?

内容については公開されていないので具体的には伏せますが、イベントをやるのでお客様はFAQを自動化したいと考えてます、という背景説明があり、まずは開発環境を整えてエコーボットを作ってください、というざっくりした内容で、あとは参考リンクが載っているくらいです。そのあとの課題も、ボットに会話させましょう、フィードバックを得られるようにしましょう、という感じで、課題というか追加の要件が書かれているような内容でした。

ざっくりどんな感じかはこちらの登録ページを見ると分かると思います。
www.microsoftevents.com

マニュアルが用意されていて上から順番にやっていけば一通りの環境ができます、という感じのセミナー形式ではないので、個人の技量がかなり試されるのは間違いない内容でしたね。

まぁ実際の現場では背景や要件も違いますし、当然ながら順番に手順が用意されているわけでは無いので、今回の内容はかなり実践向きと思います。
他のテーブルでは、そういうセミナータイプのものを期待されて来た方が初日の午前でお帰りになったというのを聞いて、もったいないなぁと思いつつ、結構人を選ぶスタイルだよなぁと思いました。

特にガチガチの日本企業に新卒入社して社外の勉強会やカンファレンスに行ったことが無いタイプの人には厳しいんじゃないかなと思います。

豪華なケータリング&ランチ

本筋とはずれますが、、、とにかく食べ物&飲み物が十分に用意されていて、とても無料とは思えないメニューでした。
こんな感じ。

■ 初日
今半(写真無し)

■ 2日目
崎陽軒
f:id:mitsuki0820:20190425224745p:plain

■ 3日目
なだ万
f:id:mitsuki0820:20190425224742p:plain

ランチのお弁当以外にも、コーヒー・お茶・ジュース各種、ドーナツ、お菓子各種等海外のカンファレンスでよくある様なケータリングの豊富さで、2日目の最後は懇親会でお酒も出てくるという抜かりないフォーメーション。

さすがに一緒のテーブルにいた人も、これヤバくないですか。。後で請求されませんよね。。と心配していました。

どういう機能を使ったの?

技術的な観点でざっくりと今回触ってみたものと所感です。

JavaScript
他の人をフォローしつつ思ったのですが、やっぱり型が無いのはしんどい。。大文字小文字間違えてるのに実行するまでわからないとか、ブロックスコープがないみたいなJS特有の仕様とか、慣れてない人 or 大規模開発には結構きついんじゃないかと思います。手軽な反面、他の言語を知っている人からすると逆にはまる言語だなと思いました。

■ Azure Bot Service
ボットをフレームワーク化した SDK + ツール群を指します。ボットのフレームワーク、というのが慣れないので、ダイアログとかターンコンテキストとか、概念を理解するのに初日は苦労しました。
まぁ書いていればそのうち慣れるかなとは思います。今は v4 が最新らしいです。

この3日間はとにかくドキュメントを読み込んでました。
docs.microsoft.com

■ Cosmos DB
Azure の NoSQL データベースです。
これは仕事でも触ったことがあるのでサクサクできました。

Cosmos DB ではまることは無かったですが、Bot Service からうまく保存ができない(なぜか会話ごとに保存されるのではなく、コンテキスト単位で上書きされていく)ので、もうちょっと悩んでみようと思います。

■ Azure Search
これも Azure の、フルテキスト検索サービスです。
データをインポートして、ポータルから検索してみるくらいはやったことはありましたが、JavaScript から、検索してボットに返すというのは初めてだったので、axios で REST 叩いて、ボットがレスポンスした時はちょっと感動しましたね。

公式の Node.js の SDK が無いのはちょっと厳しかったです。
※たどり着けなかっただけかなぁ。。これっぽい気もしていつつ理解するより axios 叩いた方が早いと判断しました。

非公式のライブラリも見つけましたが、何となくaxiosで叩いたら動いたのでもういいやと思って使いませんでした。

この後にも自然言語処理やら認証やらありますが、残念ながらそこまでたどり着けませんでした。

まとめ

MS のエンジニアがコーチングしてくれて、3日間みっちりコードを書けて、ご飯も食べられて、しかも無料、とここまでやってくれる学習イベントって義務教育以来参加したことが無いので(義務教育も給食費掛かりますしw)、間違いなくお勧めのイベントです。

次回あったらぜひまた参加したいと思います。