APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

【Microsoft Build 2024速報】Cosmos DBがVercelに簡単に統合できるようになったらしいので試す

はじめに

こんばんは、ACS事業部の髙井です。

毎度おなじみのMicrosoft Build、はじまりました~。こうやって速報記事を書くのもだいぶ恒例になってきました。

build.microsoft.com

真夜中ですが、一応これでもAzureで飯を食っているのでアプデ情報はちゃんとチェックします。

news.microsoft.com

Azure Cosmos DB Integration with Vercel

devblogs.microsoft.com

どうやらVercelに簡単にCosmos DBが統合できるようになったようです。

もちろん別に統合されてなくてもNext.jsと組み合わせれば好きなDBが使えるわけなんですけど、まー、リソースやらSDKのセットアップが地味に面倒なのは間違いないです。

そういうとき、こういう公式で準備してくれてるやつがあると助かりますね。
(ちなみに今回Vercel統合に対応してるのは、Cosmos DB for NOSQLまたはCosmos DB for MongoDBのアカウントだけみたいです)

ってことで実際に立ててきましたが、Vercel文脈から入った人だとAzureよくわからんで少し戸惑うかもです。

まだ100人も使ってないっぽい

※上記の利用人数はここで見ました。

公式のチュートリアル

learn.microsoft.com

上記は公式のチュートリアルですが、まあ作るだけならこれ見るだけで普通にいけると思います。

で、個人的に「先に言ってくれたらよかったのに」と思いそうなポイントだけまとめます。

無料のCosmos DBアカウントが発行できるが「プロビジョニングされたスループット」モードになる

Web画面に従うだけで無料体験版の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 と統合する」というセクションとは別の場所に上記は書いてあるので、ちゃんと読めば「既に存在している必要」があるとは限らないんでしょうけども、まあ真夜中に流し読みしたら余裕で気付きません。

実際は、環境変数に名前を設定するだけでデータベースとコンテナは勝手に作ってくれます。

リポジトリを先に読んでれば気付ける

github.com

上記がスターターのありかですが、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を活用した内製化のご支援をしております。ご相談等ありましたらぜひご連絡ください。

www.ap-com.co.jp

また、一緒に働いていただける仲間も募集中です!
切磋琢磨しながらスキルを向上できる、エンジニアには良い環境だと思います。ご興味を持っていただけたら嬉しく思います。

ちなみに、私の所属するApplication Engineeringチームでは、Vercelではないですが、Azure Container Apps上にホストするNext.jsアプリケーションの開発なども行っています!

www.ap-com.co.jp

本記事の投稿者: 髙井 比文
AKSをメインにしたインフラとアプリの領域際をご支援することが多いです。
Azureは11冠です。更新を怠って10冠になってしまいました。
Hifumi Takai - Credly