SIOS Tech. Lab
  • Azure
  • OSS
  • コンテナ
  • 認証
  • シリーズ
  • ホーム
  • クラウド
  • Azure

C#でStringTemplate【実践編】

2023-09-15

SHARE

  • ポスト
  • シェア
  • はてブ
  • LINE

こんにちは、サイオステクノロジーの佐藤 陽です。
今回は、前回書いた C#版 String Template の記事の続きを書きたいと思います。

前回は本当にただ単に使ってみただけなので、今回はもう少し実践的な使い方をご紹介します。

  • String Template をもう少し使いこなしたい!
  • 実践的な使い方を知りたい!
  • Azure のシステムに組み込みたい!

という方は是非最後までご覧ください。

前回の記事はこちら ↓

C#でStringTemplate【導入編】

目次
  • 1 はじめに
  • 2 環境
  • 3 実装
    • 3.1 Storage Account
    • 3.2 Azure Functions
      • 3.2.1 リソース準備
      • 3.2.2 アプリケーション作成
    • 3.3 動作確認
      • 3.3.1 文章の内容を変更する
  • 4 まとめ

はじめに

前回の記事では、ソースコード上にテンプレートの文章をハードコードし、
そのテンプレートに対して動的に値を埋め込むことを実装しました。

ただこれだとString Templateを使う意味がやや薄いです。
String Template を使う大きな利点は、アプリケーションとテンプレートを分離することにあります。

具体的には、テンプレートをアプリの外側に置いておくことで、

  • 文章を変更するためのアプリのデプロイが不要になる
  • コードを触れない人でも文章が更新できる

といったようなメリットが挙げられます。

全体の流れとしては

  1. 外部のストレージにテンプレートを置いておく
  2. アプリからそのテンプレートを参照する
  3. テンプレートに動的に値を埋め込む
  4. 生成された文章を使ってアクションを起こす(クライアントに返したり、メールで送ったり)

といった流れになるかと思うので、今回はこの流れを 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を使って、文章の生成やアプリの運用を楽にしてみてください。

ではまた!

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。
SHARE
  • ポスト
  • シェア
  • はてブ
  • LINE

CATEGORY :

  • Azure
  • その他

TAGS :

  • Azure Functions
  • Azure
  • Azure Storage Account
  • StringTemplate
  • テンプレートエンジン
  • Azureの気になるサービスの紹介

    Azureの気になるサービスの紹介

  • OSS on Azure 非公式コミュニティ ミートアップ 第3回 開催報告

    OSS on Azure 非公式コミュニティ ミートアップ 第3回 開催報告

  • OSS on Azureことはじめ 【連載第2回】 – Linuxのお話# more

    OSS on Azureことはじめ 【連載第2回】 – Linuxのお話# more

  • Microsoft365管理センターのTeamsの制御が効かない!?

    Microsoft365管理センターのTeamsの制御が効かない!?

  • OSS on Azureことはじめ 【連載第9回】 ー SSHをmore

    OSS on Azureことはじめ 【連載第9回】 ー SSHをmore

  • 【初心者】Neo4jをMicrosoft Azure上で動かしてみました

    【初心者】Neo4jをMicrosoft Azure上で動かしてみました

この記事を書いた人
アバター画像
佐藤 陽

ロードバイクやランニングなど、走ることが好きなサーバーサイドエンジニア。組み込み系からWeb系へとジョブチェンジし、現在はAzureを使ったWebアプリの開発や、DevOpsの構築を行っています。

X YouTube

コメントを残す コメントをキャンセル

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

前の記事

Azure: VMのカスタムのスクリプト拡張機能をARMテンプ…

次の記事

【Stripe】既存のSubscriptionにSchedul…
  • OSS
  • 認証
  • クラウド
  • コンテナ
  • 生成AI
  • トレンド
    • Web3
    • IoT
    • SBOM
  • その他
    • フロントエンド
    • バックエンド
    • データーベース
    • ミドルウェア
    • os
    • 監視
    • API
  • シリーズ
    • 世界一わかりみ深いシリーズ
    • 便利なコマンドシリーズ

Contact

  • About
  • ブラウザで購読する
  • 執筆依頼
  • カジュアル面談
  • お問い合わせ
  • エントリー
  • X
  • Facebook
  • YouTube
HOME
  • サイオステクノロジー株式会社

© 2025 SIOS Tech. Lab All rights reserved.