ASP.​NET Core から透過的に SSM パラメータストアを利用出来る AWS .NET Configuration Extension for Systems Manager を使ってみました

2023.01.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

いわさです。

AWS では .NET アプリケーション向けに様々なライブラリやツールが提供されていますが、本日はその中のひとつ「AWS .NET Configuration Extension for Systems Manager」をご紹介します。

ASP.NET Core では appsettings.json などの構成ファイルへ設定情報を保存し Configuration クラスを使ってコード上で設定値の取得を行うことが出来ます。

この機能は Configuration ミドルウェアで様々な外部ソースを注入出来るのですが、AWS からは SSM パラメータを埋め込む拡張クラスが提供されています。
これを使うとアプリケーションの設定情報を AWS 上の Systems Manager パラメータストアで管理することが出来るようになります。

Configuration の基本的な使い方

まずはライブラリ導入前に基本的な利用方法を確認します。
以下の公式ドキュメントを参考に実装しました。

appsettings.json

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "HogeSetting": "Hoge Fuga Piyo",
  "AllowedHosts": "*"
}

上記設定値をコードから取得して画面に表示させるだけです。

Index.cshtml.cs

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace hoge0130asp.Pages;

public class IndexModel : PageModel
{
    private readonly ILogger<IndexModel> _logger;
    private readonly IConfiguration _configuration;

    public IndexModel(ILogger<IndexModel> logger, IConfiguration configuration)
    {
        _logger = logger;
        _configuration = configuration;
    }

    public string HogeParam1 { get; set; } = "default";

    public void OnGet()
    {
        HogeParam1 = _configuration["HogeParam1"];
    }
}

Index.cshtml

@page
@model IndexModel
@{
    ViewData["Title"] = "Home page";
}

<div class="text-center">
    <h1 class="display-4">Welcome</h1>
    <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
    <p>HogeParam1: @Model.HogeParam1</p>
</div>

表示されていますね。

SSM パラメータストアを利用する

では、以下のように定義した SSM パラメータを利用してみましょう。

ライブラリを導入

導入方法としては、NuGet パッケージを追加し、Program.cs でミドルウェアコンポーネントとして追加します。
外部ライブラリを導入する度に毎度思うのですが、この ASP.NET Core のミドルウェアコンポーネントの仕組みよく出来てるなぁといつも関心しています。

% dotnet add package Amazon.Extensions.Configuration.SystemsManager --version 4.0.0
  Determining projects to restore...
  Writing /var/folders/4d/nhd1bp3d161crsn900wjrprm0000gp/T/tmppiYUME.tmp
info : X.509 certificate chain validation will use the fallback certificate bundle at '/usr/local/share/dotnet/sdk/7.0.101/trustedroots/codesignctl.pem'.

:

info : Writing assets file to disk. Path: /Users/iwasa.takahito/work/hoge0130asp/obj/project.assets.json
log  : Restored /Users/iwasa.takahito/work/hoge0130asp/hoge0130asp.csproj (in 3.28 sec).

ちなみに、検証環境は .NET 7 です。
以下でAddSystemsManagerで追加しつつ、対象パラメータのパスを指定します。

Program.cs

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();

builder.Configuration.AddSystemsManager("/hoge/fuga/");

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
}
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();

app.Run();

パラメータを取得する

パラメータの取得方法は SSM だからと言って特殊なことは不要です。
次のように Configuration 経由でアクセスするだけで、利用するコード側からするとどこから取得しているのか意識する必要はありません。

Index.cshtml.cs

:

public class IndexModel : PageModel
{

:

    public string HogeParam1 { get; set; } = "default";
    public string HogeParam2 { get; set; } = "default";

    public void OnGet()
    {
        HogeParam1 = _configuration["HogeParam1"];
        HogeParam2 = _configuration["hoge0130param"];
    }
}

ページを表示すると次のように SSM パラメータで設定した内容が画面に表示されています。
とても良くないですか?

パラメータ変更時の挙動

デフォルトでは SSM パラメータストアからの取得タイミングはアプリケーションの起動時のみです。
そのため、以下のようにパラメータを変更した場合はデフォルトではアプリケーションの再起動が必要になります。

再起動するまでは変更しても反映されませんでしたが、再起動後は以下のように反映されました。

ReloadAfter で自動更新も可能

ただし、ミドルウェアコンポーネント追加時のオプションでReloadAfterを設定すると、バックグラウンドスレッドで一定間隔で SSM パラメータの最新値を取得するようにも構成出来ます。
試してみましょう。

次のように 10 秒を設定してみました。

Program.cs

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddRazorPages();

builder.Configuration.AddSystemsManager("/hoge/fuga/", TimeSpan.FromSeconds(10));

var app = builder.Build();

:

パラメータを変更します。

ここでは Get リクエスト時に画面へ値を描画しているので何度か画面をリロードさせます。
アプリケーションの再起動はなしです。

画面に描画される値が更新されました。
SSM パラメータストアから最新情報が取得されています。

ssm:GetParameters が必要

AWS SDK for .NET ベースで実行されるので実行環境に適用されている IAM ポリシーが必要です。
SSM パラメータストアへアクセスする場合は対象パラメータへのssm:GetParametersが許可されている必要があります。

さいごに

本日は ASP.NET Core から透過的に SSM パラメータストアを利用出来る AWS .NET Configuration Extension for Systems Manager を使ってみました。

クラウドでアプリケーションホスティングすると設定値を外部で管理したいシーン多いと思うのですが、このライブラリを使うとアプリケーション上では通常の IConfiguration インターフェース経由でアクセス出来るので、実装コストも低くお勧めです。

Lambda でも利用出来ますし、SSM パラメータ以外にも AppConfig もサポートしています。
特に AppConfig を使ったフィーチャーフラグ制御を ASP.NET Core アプリケーションに実装する際にはとても役立ちそうな気がします。
次回以降フィーチャーフラグ使ってみたいと思います。