はじめに
こんばんは、ACS事業部の髙井です。
毎度おなじみのMicrosoft Build、はじまりました~。こうやって速報記事を書くのもだいぶ恒例になってきました。
真夜中ですが、一応これでもAzureで飯を食っているのでアプデ情報はちゃんとチェックします。
Azure Cosmos DB Integration with Vercel
どうやらVercelに簡単にCosmos DBが統合できるようになったようです。
もちろん別に統合されてなくてもNext.jsと組み合わせれば好きなDBが使えるわけなんですけど、まー、リソースやらSDKのセットアップが地味に面倒なのは間違いないです。
そういうとき、こういう公式で準備してくれてるやつがあると助かりますね。
(ちなみに今回Vercel統合に対応してるのは、Cosmos DB for NOSQLまたはCosmos DB for MongoDBのアカウントだけみたいです)
ってことで実際に立ててきましたが、Vercel文脈から入った人だとAzureよくわからんで少し戸惑うかもです。
※上記の利用人数はここで見ました。
公式のチュートリアル
上記は公式のチュートリアルですが、まあ作るだけならこれ見るだけで普通にいけると思います。
で、個人的に「先に言ってくれたらよかったのに」と思いそうなポイントだけまとめます。
無料のCosmos DBアカウントが発行できるが「プロビジョニングされたスループット」モードになる
まず、Try CosmosDBという名前の無料サブスクリプションでCosmos DBを発行できるモードがあります。
これは無料なのであんまり気にしなくてもいいんですが、勝手に「プロビジョニングされたスループット」というモードでデプロイされます。
これはある程度のスループットを確保する前提でデプロイするモードなので、体験版から自腹デプロイに移行する際には気を付けましょう。
そんなにサービスにアクセスがないのなら「サーバレス」モードという、使ってないときに料金が発生しないモードを大抵は選ぶことになるかと思います。
データベースとコンテナーを用意して環境変数に設定しろと書いてあるけど、自分で作らなくていい
これ、罠でした。
ちなみに公式チュートリアルでは以下のように書いてあります(引用ですが、太字装飾は私が付けています)。
- COSMOSDB_CONNECTION_STRING - Cosmos DB 接続文字列が必要です。 これらは、Azure portal のキー セクションで見つけることができます。
- COSMOSDB_DATABASE_NAME - 使用しようとしているデータベースの名前。 これは、Azure Cosmos DB アカウントに既に存在している必要があります。
- COSMOSDB_CONTAINER_NAME - 使用しようとしているコンテナーの名前。 これは、上記のデータベースに既に存在している必要があります。
こんなん書いてあったら自分で作ろうとするやーん。
まあ一応ね、たしかに「マーケットプレース テンプレートを使用して Cosmos DB を Vercel と統合する」というセクションとは別の場所に上記は書いてあるので、ちゃんと読めば「既に存在している必要」があるとは限らないんでしょうけども、まあ真夜中に流し読みしたら余裕で気付きません。
実際は、環境変数に名前を設定するだけでデータベースとコンテナは勝手に作ってくれます。
リポジトリを先に読んでれば気付ける
上記がスターターのありかですが、apiハンドラの中でCosmosにアクセスさせるのにcosmosSingleton
ってシングルトンが使いまわされてます。
で、そのシングルトンのコンストラクタを読みに行くと、createIfNotExists
してるのがわかります。
await client.databases.createIfNotExists({ id: databaseName, }); await database.containers.createIfNotExists({ id: containerName, partitionKey: "/id" });
ちなみに
自分は普通にミスってデータベース名とコンテナー名を入れ違いに設定しており、それでCosmos DBのデータエクスプローラーにテレコのコンテナーができてたことで、勝手に作られるんだということに気付けました。
あと、シングルトンを作ってるファイルの隣にNGワードフィルタが鎮座しているのを見つけました。
var Filter = require("bad-words"); const filter = new Filter(); export function clean(obj) { const str = JSON.stringify(obj); const cleaned = filter.clean(str); return JSON.parse(cleaned); }
公式スターターに強制でフィルタが入っててウケました。あとでNGワードっぽいの入れて試してみようと思います。
まとめ
Buildのアップデート情報を追っていると、めっちゃAI!!!!!って感じでそろそろAIを本格的に活用するために自分を鍛える必要があるか……とか思い始めました。
このあともPaaSのアップデートとかも気が向くままに手元で試してみて、いいのがあれば記事として投稿しようと思います。
今回は以上です!
私達ACS事業部はAzure・AKSを活用した内製化のご支援をしております。ご相談等ありましたらぜひご連絡ください。
また、一緒に働いていただける仲間も募集中です!
切磋琢磨しながらスキルを向上できる、エンジニアには良い環境だと思います。ご興味を持っていただけたら嬉しく思います。
ちなみに、私の所属するApplication Engineeringチームでは、Vercelではないですが、Azure Container Apps上にホストするNext.jsアプリケーションの開発なども行っています!