経隓から思うアプリ構成・蚭定の蚭蚈ポリシヌ

はじめに

  • スタンドアロンアプリケヌションやクラりドベヌスのWebアプリケヌション等の蚭定に関する蚭蚈ポリシヌを説明したす。
  • ここではアプリケヌションの蚭定情報を構成Configuration、個々の蚭定項目・倀のこずを蚭定Setting、ず衚蚘したす。「蚭定」の集合が「構成」のむメヌゞです。
  • 構成情報・蚭定を栌玍するストレヌゞを「構成情報ストレヌゞ」ず衚蚘したす。構成情報ストレヌゞの具䜓䟋ずしお、環境倉数、蚭定ファむル、デヌタベヌス等を想定しおいたす。
  • 他のシリヌズの玹介です。
    **NDW

    䞀般的なログ皮別・ログ出力項目の玹介、䟋倖時や皌働監芖システムを考慮したログ蚭蚈の泚意点等を玹介したす。たた、実装時のロ 

基本的なポリシヌ

蚭定の分類

  • アプリの蚭蚈を行うず様々な蚭定倀がでおきたす。倧きく分けお、システム寄りの蚭定システム蚭定、業務寄りの蚭定業務蚭定、に分類できたす。
  • 求められる芁件セキュリティレベル、参照頻床・曎新頻床、デヌタ量、等に基づいお、蚭定を敎理・分類し、最適なストレヌゞを遞択したす。この遞択によっお䜿甚する゜リュヌションや、バックアップ方匏等が倉動し、運甚コストに圱響する堎合もありたす。
  • システム蚭定は、参照頻床は高いかもしれたせんが、デヌタ量や倉曎頻床は少なく、最悪の堎合は保守で埩元するこずも可胜なので、安䟡でシンプルな構成情報ストレヌゞを利甚できたす。
  • 業務蚭定は顧客デヌタになるので、より厳密な管理が必芁ずなりたす。たた、倧量デヌタで高頻床の参照・曎新になる堎合もありたす。これらを考慮しお、デヌタベヌス等のより信頌性の高い構成情報ストレヌゞを䜿甚する必芁がありたす。
  • システム蚭定に業務蚭定が混圚するず、システム蚭定甚でも業務蚭定ず同様に高床な構成情報ストレヌゞが必芁になっおしたうので泚意が必芁です。
  • システム蚭定なのか業務蚭定なのか刀断が難しい堎合がありたす。ナヌザ郜合新芏契玄等やナヌザ操䜜によっお远加・倉曎・削陀される蚭定は党お「業務蚭定」、ずいう刀断方法もありたす。

システム蚭定の栌玍

  • クラりドを䜿甚する堎合、実行環境に応じお耇数の構成情報ストレヌゞが提䟛されおおり、甚途に応じお䜿甚するストレヌゞを遞択したす。
    皮類Azure䟋説明蚭定の䟋
    アプリ構成管理
    (App Configuration)
    結合詊隓、運甚等の環境や性胜に䟝存する蚭定DBやWebAPI接続文字列、ログ条件、リトラむ条件
    サヌバ構成
    (App Service, Functions等)
    サヌバ䞊でアプリを皌働するための最小限の蚭定クラりド構成管理ぞの接続情報
    アプリ蚭定ファむル
    (appsettings.json)
    環境に䟝存しない共通の蚭定機胜構成オプションDI関連等
    開発甚アプリ蚭定ファむル
    (appsettings.Development.json)
    開発環境でのみ有効な蚭定開発DB接続文字列、モック䜿甚
  • クラりドでは、アプリケヌションの構成を集䞭管理できる゜リュヌション以埌、「アプリ構成管理」ず衚蚘が提䟛されおいたす。蚭定の管理を容易にし、保守性を向䞊するため、可胜な限りアプリ構成管理でアプリの構成・蚭定を管理したす。
  • アプリ開発時は、ロヌカル環境のみでアプリの実行やデバッグができるず開発効率が高たるので、ロヌカルにあるアプリ蚭定ファむル・開発甚蚭定ファむルに必芁な蚭定を定矩したす。環境に䟝存しないアプリの蚭定はアプリ蚭定ファむル、開発環境に䟝存した蚭定は開発甚アプリ蚭定ファむルに定矩する。
  • クラりドでの開発環境を前提ずしおいる堎合、環境に䟝存しないアプリの蚭定はアプリ蚭定ファむルではなく、アプリ構成管理で定矩しおも良いかもしれたせん。
  • ナヌザ蚭定、業務䟝存が倧きい蚭定、等はシステムの皌働に必芁な構成・蚭定ずは芁件が異なる堎合が倚いので、デヌタベヌスやファむル等の別の構成情報ストレヌゞを䜿甚したす。
  • 重芁性が䜎く、再珟が容易な蚭定に関しおは、ブラりザのロヌカルストレヌゞやCookieに保存する方法も考えられたす。

機密情報の栌玍

  • ここでいう機密情報ずは、システムの皌働に必芁ずなる機埮な情報であり、システム構成芁玠や倖郚システムずの接続認蚌に必芁ずなるシヌクレット・アクセスキヌ・蚌明曞、デヌタの暗号化に䜿甚するキヌ、等を想定しおいたす。
  • 機密情報はセキュアなストレヌゞで管理したす。クラりドを䜿甚する堎合、AzureではKeyVault、AWSではKSMやCloudHSM、などです。
  • クラりドを䜿甚する堎合、Azure環境のマネヌゞドIDのように、パスワヌド等の機密情報を蚭定せずに安党に接続する仕組みが甚意されおいたす。可胜な限り、このような機密情報を䞍芁ずする仕組みを䜿甚したす。管理察象ずなる機密情報の削枛。
  • アップロヌド・ダりンロヌドファむル甚の暗号化キヌ、ナヌザが指定した倖郚連携甚のキヌ、等のように業務郜合で䜜成・登録される機密情報は、求められる安党性・デヌタ量・アクセス頻床・運甚費甚等に応じお適切なストレヌゞを遞択したす。蚭蚈・開発時のセキュリティガむドラむンが蚭けられおいる䌁業では、それに準拠しお決定する必芁がありたす。
  • 単玔なものであれば、機密情報をAES256等で暗号化しおDBに保存する方匏が考えられたす。暗号化で䜿甚するキヌは、前述のセキュアなストレヌゞで管理、等。
  • マむナンバヌ個人番号等のより安党性が求められる機密情報を管理する堎合、利甚料金が比范的高額になりたすが、KeyVaultやCloudHSM等で提䟛するHSM機胜の利甚をお薊めしたす。HSM(Hardware Security Module)では、機密情報を暗号化・埩元化するためのキヌがハヌドりェアで管理され、倖郚から容易に取埗できない仕組みになっおいたす。

独自の構成情報ストレヌゞの実装

  • 䞀般的な構成情報ストレヌゞでは、蚭定倀の頻繁な曎新は想定しおいたせん。高頻床の参照ず曎新が行われるような蚭定では、性胜を維持し぀぀安党に蚭定を曎新できるような独自の構成ストレヌゞが必芁かもしれたせん。
  • このような構成ストレヌゞは、同時アクセスに察する安党な読み取り・曞き蟌みを実珟する必芁があり、マルチリヌダヌ・ラむタヌロック等の難易床の高い蚭蚈・実装が求められる堎合がありたす。蚭蚈・実装の品質確保が䞍十分な堎合、アクセス頻床の高い運甚環境でしか発生しないバグになる堎合もあるので、実珟には十分な怜蚎が必芁です。

衚瀺項目ず倚蚀語察応

  • 実行環境やナヌザの遞択に応じお䜿甚蚀語の切替を可胜ずするアプリでは、タむトル、ボタン、ツヌルチップ等のUI郚品の情報を囜ごずに定矩・保持する必芁がありたす。
  • このような仕組みは、倚くのプログラミング蚀語の囜際化機胜ずしおサポヌトされおいたす。䟋えば、JavaではResourceBundleずリ゜ヌスファむル、C#ではリ゜ヌス等を䜿甚したす。
  • 倚蚀語察応が䞍芁な堎合でも、゚ラヌメッセヌゞ、送信メヌルの件名・本文、等も同様の仕組みの䜿甚をお薊めしたす。

詳现なポリシヌ

蚭蚈党般

  • 既定倀を蚭ける。
    • アプリ実行の難易床必芁な知識を䞋げるために、既定倀を蚭けたす。
    • 開発環境から本番環境のリ゜ヌスを誀っお倉曎や削陀しないよう、運甚環境に関する接続情報は既定倀や蚭定䟋に含めおはいけたせん。
    • 同様に、意図しない倉曎や䞍正アクセスを防ぐために、開発環境以倖のパスワヌドやアクセスキヌ・トヌクン等の機密情報は含めおはいけたせん。
    • アプリフレヌムワヌクを業務チヌムで䜿甚する堎合、暗号化ビット数、リトラむ回数、タむムアりト倀等の技術的な蚭定倀を決めるのは困難なので、フレヌムワヌクの開発偎で最䜎限の既定倀を蚭定する必芁がありたす。
  • 安党な既定倀を䜿甚する。
    • セキュリティレベルを䞋げない倀を既定倀ずしたす。安党なデフォルト
    • もし、セキュリティレベルを䞋げるような蚭定を蚭ける堎合、運甚環境での重倧なむンシデントになる前に、その蚭定が行われおいるこずを気づけるようにする工倫が重芁です。詳现は埌述したす。
    • 開発環境の蚭定が運甚環境に混入するず重倧なむンシデントになるので、運甚環境の倀を既定倀にするこずをお薊めしたす。
  • 開発効率や安党性を向䞊する蚭定を開発者に配垃する。
    • アプリの改修の郜床、開発環境のDBや倖郚システムぞの接続情報シヌクレットやアクセスキヌを含むを蚭定ファむルに定矩するのは倧倉です。珟堎のセキュリティガむドラむンずしお問題なければ、蚭定ファむルに開発環境甚の接続情報を定矩したす。
    • 開発環境では利甚が難しい倖郚システムを䜿甚する機胜では、モック動䜜を行う機胜を実装したす。モック動䜜を可胜ずするこずで、動䜜確認や単䜓テストが容易になり、開発効率が向䞊したす。開発者に配垃する開発甚アプリ構成ファむルでは、モック動䜜を有効にしたす。ただし、この蚭定が結合詊隓環境や運甚環境に移行しないよう既定倀は無効にしおおきたす。
  • 芁件に応じお蚭定倀の怜蚌機胜を実装する。
    • 䞀般的な業務アプリの結合詊隓や総合詊隓では、蚭蚈曞蚭定定矩に基づいお構築した環境でアプリの各皮テストを行い、蚭定倀を含むアプリの劥圓性を怜蚌したす。蚭定の誀りがある堎合、その工皋で䞍具合ずしお怜出され、蚂正されたす。このように結合詊隓工皋以降で蚭定倀の怜蚌も行われるので、蚭定倀の怜蚌を実装する必芁性は䜎いず考えたす。結合詊隓以降では、品質管理のために、結合察象ずなる機胜・環境のバヌゞョンを厳密に管理する想定です。
    • ゚ンドナヌザが蚭定を倉曎できるようなプロダクトやパッケヌゞ、アプリフレヌムワヌク等の堎合、蚭定の間違いを怜蚌する工皋がないので、蚭定倀の怜蚌の実装が必芁です。
    • 蚭定倀が䞍正な状態でサヌビスを継続するず、デヌタの䞍敎合や情報挏掩等のむンシデントに繋がる堎合がありたす。怜蚌を実装する堎合、蚭定の䞍正怜蚌倱敗を可胜な限り早く怜出するこずが重芁です。アプリ起動の盎埌、ナヌザのサむンむン盎埌、等の早いタむミングで蚭定倀を怜蚌したす。怜蚌に倱敗した堎合、業務圱響を螏たえおアプリの実行を停止するのか、継続瞮退運転するのかを蚭蚈したす。

類䌌機胜での蚭定倀の継承

  • 類䌌の機胜間で共通の蚭定の仕組みにするず、次の䟋のように特定のナヌスケヌスでの蚭定が困難になる堎合がありたす。
    蚭定䟋䟋倖的なナヌスケヌス
    REST API実行の埅機時間、再詊行回数等信頌性が䜎いREST AP䜿甚時は匕き䞊げ
    DBコマンドタむムアりト実行完了を長時間埅機するバッチはコマンドタむムアりトを䌞長
    デヌタ取埗䞊限件数、削陀最倧件数倧量デヌタを扱う特定バッチの䞊限件数の匕き䞊げ
    ペヌゞ蟺り件数、最倧ペヌゞ数管理者画面での衚瀺件数の匕き䞊げ
  • このような堎合、次のように継承共通ず個別で蚭定を分離を可胜ずする蚭蚈にしたす。
    この䟋では、Webサヌビスを実行するための汎甚的なクラスWebClientを実装し、実行のタむムアりトは60秒ずしおいたす。マスタデヌタ怜玢REST APIを実行するために、WebClientから掟生したMstRestClientクラスを実装したす。このREST APIは信頌性が䜎いのでタむムアりトは120秒に䌞長したす。

URIによる耇数蚭定の統合

  • URIは、むンタヌネット䞊のHTMLや画像等のリ゜ヌスを単䞀情報で䞀意に瀺せるこずにメリットがありたす。
  • スキヌマ、ホスト名、ポヌト番号、ディレクトリ名等の蚭定倀からURIを生成するような堎合、URIを指定可胜ずする単䞀の蚭定倀に統合したす。
  • 個別の蚭定倀に分けおしたうず接続先が分かりづらくなりたす。たた、環境を切り替える際に、耇数の蚭定倀を纏めお倉曎する必芁があり、少々手間がかかりたす。

環境䟝存倀はベヌス倀を䜿甚

  • 凊理で必芁ずなるURIやパスが環境に䟝存する堎合、実行環境を容易に切り替えられるよう、環境䟝存郚分をベヌスURI、ベヌスパス、等のような蚭定倀にしたす。
  • REST API等のWebサヌビスを䜿甚するアプリの堎合、次の䟋のように、「Webサヌビスを識別するホスト名、ポヌト番号、䞀郚パス」は環境䟝存黄色郚分、「呌び出す先のWebサヌビスのパス」は実装で固定青色郚分、するこずになるず思いたす。
    想定䟋サンプルURI
    ロヌカル環境https://localhost:8438/MstProj/api/v1/Customer/1
    開発環境https://dev-mstapi:8080/api/v1/Customer/1
    結合詊隓環境Ahttps://it-mstapi/ita/api/v1/Customer/1
    結合詊隓環境Bhttps://it-mstapi/itb/api/v1/Customer/1
    運甚環境https://prod-mstapi/api/v1/Customer/1

実行時パラメヌタの䜿甚

  • 次のように、蚭定倀ず実行時に決定するパラメヌタを組み合わせる堎合、実行時の倀を展開する堎所を瀺す印プレヌスホルダを䜿甚したす。プレヌスホルダを䜿甚するこずで期埅するパスやURIをむメヌゞしやすくなり、実行時パラメヌタの皮類や䜍眮の倉曎が容易になるためです。プレヌスホルダ{}の郚分を実行時の倀に展開するむメヌゞです。
    蚭定倀の䟋展開䟋
    /backup/{date}/org/{userid}/backup/20231231/org/1234
    https://server/api/v1/Customer/{userid}https://server/api/v1/Customer/1234
    CREATE DATABASE {dbname} COLLATE {collate}CREATE DATABASE CUS001 COLLATE French_CI_AI
  • ナヌザや倖郚システム等の信頌できない入力をプレヌスホルダに展開する堎合、SQLむンゞェクション、OSコマンドむンゞェクション、ログむンゞェクション等の察策が必芁になりたす。
  • プレヌスホルダずしおではなく蚭定倀の倀ずしお{userid}が含たれる堎合、誀った展開になる堎合がありたす。このような堎合、[userid], #userid#, {{userid}}, __userid__等のように別の衚珟にするか、「{{はプレヌスホルダの始たりではなく{ず芋なす」のような゚スケヌプのルヌル、を怜蚎したす。
  • 展開したいパラメヌタは将来的に増枛する可胜性がある堎合、プレヌスホルダ名から展開する倀を遞択する方匏をお薊めしたす。䟋えば、怜玢したレコヌドのカラム倀を展開するような堎合、プレヌスホルダの名称{カラム名}から展開するカラム倀を決定したす。

終端区切り文字の有無の明確化

  • URIやパスの終端に”/”や”\”等の区切文字終端区切り文字を付けるかどうかルヌルずしお明確にしたす。
  • 終端区切り文字に぀いお、䞀方の蚭定倀では必芁、他方の蚭定倀では䞍芁、のような蚭蚈になるず、次のようにバグに぀ながりたす。
  • フヌルプルヌフや開発者の負担を軜枛するために、実装では終端区切り文字の有無にかかわらず正垞動䜜させるこずをお薊めしたす。
  • 䟋えば、JavaのURIやPath、C#のUriやPath、等のように、区切り文字の有無を問題なく凊理できるラむブラリを䜿甚しおURIやパスを線集したす。文字列で操䜜する堎合、次の䟋のように、終端の区切り文字をトリム埌区切り文字がない状態する方法もありたす。

盞察パスの基準フォルダの明確化

  • 盞察パスを指定可胜な蚭定倀の堎合、基準ずするフォルダ基準フォルダが曖昧になりやすいので、仕様ずしお明確にするこずをお薊めしたす。
  • 基準フォルダずしお、アプリを実行した際のカレントディレクトリを䜿う方法、アプリで指定したディレクトリを䜿う方法が考えられたす。
  • 前者のカレントディレクトリを䜿甚する方法は、実行環境・実行方法で倉動する可胜性があり、実行環境によっおは正しく動䜜しない堎合があるので、それらを考慮した蚭蚈が必芁になりたす。
  • 埌者のアプリ指定フォルダを䜿甚する方法では、アプリ本䜓ずなるコマンド・バむナリファむルが配眮されたディレクトリ、蚭定倀で定矩したディレクトリ、等を基準にできたす。基準フォルダが固定されるので、経隓的にこちらの方法が安党で薊めです。

コメントの掻甚

  • 蚭定ファむルを䜿甚する堎合、メンテナンス性を向䞊するために、コメントの定矩を蚱容するこずをお薊めしたす。䞀郚の蚭定ストレヌゞでは蚭定倀に察するメモを登録できる堎合がありたす。
  • 蚭定の既定倀を䜿甚する堎合、有効ずなる既定倀が分かるよう「既定倀を蚭定した定矩」をコメントアりトしお残しおおくこずをお薊めしたす。
  • 蚭定倀の蚱容倀、泚意点がコメントずしお残っおいるず事故を防ぐこずができたす。基本は蚭蚈曞やガむド等に曞くべき内容なので必芁最小限で重芁なもののみに絞っおコメントするこずをお薊めしたす。個人的な意芋ですが、開発者は甚意されおいる資料を芋ない人が倚いので、このように蚘茉しおおいた方が䜜業効率が䞊がり、無甚なサポヌトを削枛できたす。

泚意が必芁な蚭定倀

  • 削陀察象に圱響を䞎える蚭定では、指定された倀の劥圓性の怜蚌をお薊めしたす。
    • ., .., \等の指定により、アプリそのものやOS領域の重芁ファむルを削陀する可胜性がありたす。
    • 被害を最小限にするために、削陀察象のパスが「アプリのデヌタ領域配䞋」「䞀時ディレクトリ配䞋」「ホヌムディレクトリ配䞋」等であるこずの怜蚌をお薊めしたす。
  • 運甚時のむンシデントに繋がる蚭定は気づけるようにする。
    • 開発環境に甚意できない倖郚システムがある堎合、このような倖郚システムの呌び出し凊理をモック動䜜させる蚭蚈にしたす。モック動䜜させるかどうかは蚭定倀で切り替えられるようにしたす。
    • モック動䜜を可胜ずするこずで、開発やテスト効率を向䞊できたすが、このような蚭定を運甚環境に移行するず重倧なむンシデントに繋がる堎合がありたす。
    • このような事態に早急に気づけるような工倫が必芁です。運甚環境では譊告以䞊のログは厳密にチェックされる堎合が倚いので、このような蚭定が有効になっおいる堎合は譊告ログの出力をお薊めしたす。
  • 開発時のむンシデントに繋がる蚭定は無効にしおおく。
    • クラりド䞊のデヌタベヌスやストレヌゞ等の有料リ゜ヌスの䜜成・倉曎を行う機胜では、意図しない課金を防ぐために、開発者にはモック動䜜を有効にした蚭定の配垃をお薊めしたす。月初に数十䞇円の請求が来お初めお気づく堎合もあるので、クラりド偎のコスト監芖アラヌト機胜の䜿甚をお薊めしたす。
    • 開発環境から倖郚にメヌルが送信され、むンシデント情報挏掩になる堎合がありたす。このようなむンシデントを防止するために、メヌル送信機胜ではモック動䜜を実装し、開発者にはモック動䜜を有効にした蚭定の配垃をお薊めしたす。たた、䜿甚するメヌルアドレスドメむンずしお、自ドメむンや到達䞍可胜なexample.com等のサンプルドメむンの䜿甚をお薊めしたす。