こんにちは、サイオステクノロジーの佐藤 陽です。
今回は、前回書いた C#版 String Template の記事の続きを書きたいと思います。
前回は本当にただ単に使ってみただけなので、今回はもう少し実践的な使い方をご紹介します。
- String Template をもう少し使いこなしたい!
- 実践的な使い方を知りたい!
- Azure のシステムに組み込みたい!
という方は是非最後までご覧ください。
前回の記事はこちら ↓
はじめに
前回の記事では、ソースコード上にテンプレートの文章をハードコードし、
そのテンプレートに対して動的に値を埋め込むことを実装しました。
ただこれだとString Templateを使う意味がやや薄いです。
String Template を使う大きな利点は、アプリケーションとテンプレートを分離することにあります。
具体的には、テンプレートをアプリの外側に置いておくことで、
- 文章を変更するためのアプリのデプロイが不要になる
- コードを触れない人でも文章が更新できる
といったようなメリットが挙げられます。
全体の流れとしては
- 外部のストレージにテンプレートを置いておく
- アプリからそのテンプレートを参照する
- テンプレートに動的に値を埋め込む
- 生成された文章を使ってアクションを起こす(クライアントに返したり、メールで送ったり)
といった流れになるかと思うので、今回はこの流れを Azure 環境上で実際に構築してみます。
環境
今回利用するのは以下 2 つです。
- Azure Storage Account (Blob):テンプレート置き場
- Azure Functions:テンプレートから文章を生成するアプリケーション
構成図としてはこのような形です。
実装
Storage Account
まずは Azure 上に StorageAccount を作成し、テンプレートファイルを配置します。
今回は以下の内容で用意しました。
StorageAccount | ststringtemplate |
Container | template |
Blob | message.txt |
テンプレートのテキストの内容としては、前回と同じものを使います
message.txt
こんにちは <name> さん
私たち SIOS Technology の一員として、まず最初に心から歓迎いたします。
新しい仲間として、SIOS Technology でのキャリアが素晴らしいものになることを楽しみにしています。
Azure Functions
リソース準備
次に Azure Functions の整備を行っていきます。
こちらも以下の設定で Azure 上にさくっとします。
- .NET 6
- Windows
- コードデプロイ
- サーバレス
作成が完了したら、StorageAccount からデータが取得できるよう設定します。
ID ブレードから、システム割り当ての設定をオンにします。
また、その下に「Azure ロールの割り当て」があるので、ここで権限を割り当てていきます。
(恐らくですが、この 「Azure ロールの割り当てボタン」は最近実装された気がします、UX 的に嬉しいポイントです)
そして、今回は「ストレージ BLOB データ閲覧者」の権限を追加します。
これでソースコードで DefaultAzureCredential()を利用したアクセスが可能になります。
接続文字列使ってる方は、是非こちらに切り替えていきましょう!
アプリケーション作成
デプロイするアプリケーションを作成していきます。
まずは新規に HttpTrigger の AzureFunctions を作成し、StringTemplate をインストールします。
func init StringTemplateSample
Use the up/down arrow keys to select a worker runtime:dotnet
Use the up/down arrow keys to select a language:c#
cd StringTemplateSample
func new --name StringTemplate
Use the up/down arrow keys to select a template:HttpTrigger
あとは前回の記事を参考にコードを実装していきます。
テンプレートの<name>に入れる値として、今回はAPIのクエリパラメータとして受け取ります。
using Antlr4.StringTemplate;
using Azure.Identity;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using Microsoft.AspNetCore.Http;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Logging;
using System;
using System.Globalization;
using System.Threading.Tasks;
namespace StringTemplateSample
{
public static class StringTemplate
{
[FunctionName("StringTemplate")]
public static async Task<string> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "templates")] HttpRequest req,
ILogger log)
{
//blobからテンプレートデータを取得
//NOTE:Azureに対するClientは本来使いまわす事が推奨されるため、Singletonで生成するのが望ましいです。
//コンテナを指定してクライアントを生成
BlobContainerClient blobContainerClient = new(new Uri("https://ststringtemplate.blob.core.windows.net/template"), new DefaultAzureCredential());
//Blob名を指定してクライアントを生成
BlobClient blobClient = blobContainerClient.GetBlobClient("message.txt");
BlobDownloadResult downloadedBlob = await blobClient.DownloadContentAsync();
string content = downloadedBlob.Content.ToString();
//テンプレートの<name>に入る部分をクエリパラメータとして受け取る
string name = req.Query["name"];
Template templateBody = new(content); //blobから取得した内容でTemplateを作成
templateBody.Add("name", name); //クエリパラメータから名前を取得
string renderedBody = templateBody.Render(new CultureInfo("ja-JP"));
//ここまでくれば、後はメールを送るなり、レスポンスとして返すなりご自由に!
return renderedBody;
}
}
}
実装が完了したら、先ほど作成したAzure Functionsにデプロイします。
動作確認
デプロイ完了したら早速アクセスしてみましょう
クエリパラメータとしてSIOS 太郎与えます。
GET https://{function-app-name}/api/templates?name=SIOS 太郎
すると、テンプレートにクエリパラメータの値が入った状態の文章が返ってきました。
文章の内容を変更する
では、ここで「メールの文面を変更したい!」という要求があったとしましょう。
新しいメールの文面は以下の通りです。
ウェルカム <name>さん!
私たちSIOS Technologyの一員として歓迎するよ!
新しい仲間として、SIOS Technologyでのキャリアが最高の経験になることを楽しみにしているよ!
ただこの時、アプリケーションをデプロイしなおす必要はなく、Blobのファイルだけ書き直せばOKです。
StorageAccount上のmessage.txtの内容を修正し、再度アクセスします。
すると、修正されたテンプレートによって文章が生成されていることが確認できました。
このように、ソースコードから分離することで、テンプレートの変更が容易になりますし、
StringTemplateを使う事で柔軟な文章生成が可能になります。
わざわざアプリをデプロイしなくていいですし、
各々のスコープで作業できるのは開発者にとっても運用者にとっても嬉しいですね。
まとめ
今回はStringTemplateを実践的に利用し、Azure上に簡単なアプリを構築してみました。
是非StringTemplateを使って、文章の生成やアプリの運用を楽にしてみてください。
ではまた!