【2026年最新】DynamoDBで作る共通ユーザー認証!3段階プラン判定ロジックと環境変数IS_AWSによる最安SaaSデータベース構築術

業務自動化・ツール

こんにちは、てつです!

ビジネスにおいて圧倒的な成功を目指し、有象無象 of 社会人で終わるのではなく、何かに特化した「アンバランスで圧倒的な人材」を目指して日々読書や技術習得に励んでいるあなたへ。最高にエキサイティングな連載第3回の話を始めましょう。

前回(水曜日公開)は、既存のブログ資産を守りながら、新設するアプリ用の通信を安全に逃がす「DNS戦略」と「ミニマリズムな画面設計」について徹底解説しました。美しい「操作画面」という頑丈な器が完成した今、木曜日の今日私たちがやるべきことは、システムへの命の吹き込みです。

いくら見た目がプロ仕様で美しくても、中身のロジックが伴っていなければ、それはただの「動かないハリボテ」です。

結論から言います。どれだけデザインが美しくても、裏側の制御ロジックが脆弱であればWebサービス(SaaS)として成立しません。

今回は、複数ツールでアカウントを共通化してユーザーデータを守るためのデータベース構造、本番環境とローカル環境を自動で切り替えるスマートな仕組み、推して無料枠や利用制限を裏側で厳格にコントロールする判定アルゴリズムを完全公開します。

これは実際の開発現場や自動化ビジネスでも広く使われているモダンな手法であり、個人開発でもプロと同じ堅牢な環境が作れます。

あなたのツールを本物のSaaSへと進化させる「脳みそ」の構築手順を、ステップバイステップで解説していきます。

1. バックエンド・ロジック構築の全体像

まずは、今回実装するバックエンドの処理ロジックとデータベース構造の全体像を、日本語の箇条書きで把握しておきましょう。

  • アカウント・プラン情報のデータ構造化(DynamoDB ユーザー認証)
    • ユーザーIDを主キーとして、ハッシュ化パスワード、プラン、当月の利用回数を1つのテーブルで管理します。
  • 環境変数 IS_AWS によるデータベースの接続先自動切り替え
    • 環境変数 IS_AWS(AWS_EXECUTION_ENV)の有無を判定し、ローカル環境(JSONファイル)と本番環境(AWS DynamoDB)をコードの書き換えなしで自動でスイッチします。
  • フリーミアム制限ガードとプラン判定 ロジックの構築
    • ユーザーが記事生成を行う際、現在のプラン設定と月間利用上限を照合し、制限を超えている場合や未解放の高級モデルを選択した場合は Python 制限ロジックが処理を安全に割り込み中断(ガード)します。

2. ステップバイステップの解説(データベース & ロジック構築)

複数ツールでアカウントを共通化!SaaSの土台を作る「DynamoDB ユーザー認証」データ構造

個人開発でWebアプリを構築する際、多くの人が「サーバーの中にテキストファイルや簡易なデータベース(SQLiteなど)でユーザー情報を保存すればいいや」と考えてしまいがちです。しかし、将来的にビジネスを横展開していくつもの自動化ツールを販売・運営する未来を見据えるなら、それは悪手となります。

なぜなら、サーバー内にデータを閉じ込めてしまうと、新しいツールを作るたびにユーザーに新しいアカウント登録を強いることになり、管理コストもツールごとに倍増してしまうからです。

この課題を根本から解決するために、私たちはAWSの独立したデータベースサービスであるDynamoDBを採用し、「DynamoDB ユーザー認証」の基盤を完全に外部へ切り離します。これにより、将来あなたが第2、第3の自動化ツールを開発した際にも、全く同じDynamoDBテーブルを参照させるだけで、ユーザーのアカウント情報や契約プランを一瞬で共通化・横展開できるようになります。

DynamoDBは「単一責任の原則(SRP原則)」に基づき、シンプルで極限まで洗練された以下のデータ構造(1テーブル)で管理します。

属性名(フィールド)データ型役割(初心者向けの解説)
user_id文字列(String)主キー(プライマリキー)。ユーザーを一意に識別するID
password文字列(String)安全にハッシュ化(暗号化)されたログインパスワード
plan文字列(String)現在の会員プラン(free / premium_single / premium_all)
current_usage数値(Number)今月、システムを使って記事を生成した累積回数
config_dataマップ(Map)ユーザーが個別設定したプロンプトテンプレートなどのカスタマイズデータ

ここで重要なセキュリティの最低限の嗜みとして、ユーザーのパスワードは絶対にそのままの文字列(プレーンテキスト)でデータベースに保存してはいけません。万が一のデータ流出に備え、後述するロジック内で「SHA-256」という不可逆な数式を用いてハッシュ化(復元不可能な文字列に変換)した上で保存する設計を徹底します。

開発スピードを最大化する!「環境変数 IS_AWS」による本番DBとローカルJSONモックの自動切り替え術

インフラをAWS上に構築したからといって、コードを数行書き換えるたびに毎回AWSにプログラムをデプロイ(配備)して動作確認を行うのは、開発効率が悪すぎます。数分かかるデプロイ待ちの時間は、あなたの貴重な副業時間を奪う最大の敵です。

かといって、ローカルPCでテストするためにコード内の接続先を localhost に書き換え、本番に上げる前に手動で AWS DynamoDB に書き戻す、といった運用は「書き換え忘れによる本番環境の破壊」を引き起こす原因になります。

そこで導入するのが、「環境変数 IS_AWS」(AWSのコンテナ環境に自動で注入される AWS_EXECUTION_ENV の有無)をトリガーとした、本番データベースとローカルJSONモックの自動切り替えロジックです。

プログラムは起動した瞬間、自分が今「ローカルPC(自分のパソコン)」と「AWS(クラウド上)」のどちらで動いているかを自動で検知します。ローカルであればPC内のJSONファイルにデータを読み書きし、AWS環境であれば自動的に本番のDynamoDBテーブルへと接続先をスマートに繋ぎ変えます。これにより、開発者は環境の差分を1ミリも意識することなく、ローカルで爆速でテストを回し、完成したらそのまま本番へデプロイすることが可能になります。

実際のデータアクセス層として新設した src/database.py の完全なコードを以下に掲載します。1行ごとに何をしているか、初心者向けに解説を添えました。

フリーミアムの命綱!無料枠とモデル制限を冷徹にコントロールする「プラン判定 ロジック」の裏側

SaaSビジネスにおいて、無料枠や機能制限の制御は「サービスの利益」に直結する最も重要な命綱です。

もしこの制限ロジックを「無料プランは30回まで」のようにプログラム内に直接数値を書き込んでしまう(ハードコーディングする)と、将来的に「有料の竹プラン(Proプラン)」「プロ用の松プラン(Studioプラン)」といったプランの多角化・変更を行う際、システムが複雑化してあっという間に破綻してしまいます。

これを防ぐため、今回のアップデートではアプリの冒頭に PLAN_CONFIG という設定を明確に定義し、拡張性を持たせた「プラン判定 ロジック」へと全面刷新しました。

裏側の 「Python 制限」ロジックは、ユーザーが「生成開始」ボタンを押した瞬間に、冷徹かつ確実に作動します。現在のプランが持つ月間上限(monthly_limit)とデータベースから取得した現在の利用回数(current_usage)を照合し、制限を超えている場合や未解放の高級モデルを選択した場合は、生成処理の関数を呼び出す前に「安全に割り込み中断(ガード)」をかけます。

また、操作画面(フロントエンド)におけるモデル選択のUI表現にも、徹底的なこだわりを込めています。

有料モデルの横に絵文字を付けて誤魔化すようなチープな装飾は一切排除しました。代わりに、モデル名のすぐ横に [free / pro / studio] のような洗練されたテキストブラケット表記をシンプルに添える設計にしています。

画面全体のミニマルでプレミアムな質感を完璧に維持しつつ、ユーザーに対して「どのプランにアップグレードすればこの機能が解放されるのか」をスマートかつ明確に認識させることができます。

以下に、アプリケーション(src/app.py)のコアとなるプラン判定ガードレールの完全な実装コードを掲載します。

3. 専門家・現役エンジニアの視点

システム運用監視のプロが語る!個人開発だからこそ実装すべき「暗号化とアトミック操作」のセキュリティ思想

日々の実務として、24時間365日、大規模なネットワークセキュリティやシステムの安定稼働を最前線で支え続けているインフラエンジニアの視点から、少し批評的な目線で言わせてください。

個人開発のコードで最も頻繁に見落とされ、そして最も致命的なバグや事故事象を引き起こすのが、「データの暗号化」と「同時アクセスによる数値の不整合」の2点です。

「自分しか使わないツールだから」という甘い見通しで、ユーザーの大切な外部APIキーをデータベースにそのままの状態で保存するような設計は、プロの世界では絶対に許されません。

今回のシステムでは、ユーザーが個別に入力した大切な外部APIキーをデータベースに保存する際、そのままではなく「XOR(排他的論理和)+ Base64」を施した簡易暗号化関数(encrypt_key)を必ず経由させてDBに書き込む「マスター設定」の設計思想を徹底しています。

これにより、万が一データベースの生データが第三者に盗見されるような事態が起きても、大切なAPIキーの漏洩を水際で防ぐことができます。

さらに、利用回数の加算(increment_usage_count)の実装において、私が本番環境にDynamoDBの「アトミック加算(ADD操作)」をわざわざ採用したのには、深い技術的理由(Why)があります。

一般的なプログラムでは、「1. 現在の回数をDBから読み出す」→「2. プログラム側で数値を+1する」→「3. 新しい数値をDBに書き戻す」という手順を踏みます(Read-Modify-Write)。

しかし、もしユーザーがスマートフォンスクリーンのボタンを連打したり、複数のタブから全く同時に記事生成リクエストを送信したりした場合、この手順では「読み出したタイミング」が完全に重なってしまい、2回生成したのにデータベース上は1回しか増えていない、というデータの不整合・崩壊が簡単に発生してしまいます。

DynamoDBのアトミック加算を使えば、データを一度プログラム側に読み出すことなく、データベースの内部だけで直接、一瞬にして安全に数値を+1処理(ADD)することができます。

「昨日の自分より一歩先へ」進み、市場価値を尖らせて圧倒的な成果を残すなら、インフラを低コストで抑えるだけでなく、こうした「見えない裏側の堅牢性」にまで徹底的にプロのこだわりを宿らせてください。

その細部へのアウトプットの姿勢こそが、有象無象のプレイヤーから頭一つ抜け出し、ビジネスを圧倒的な成功へと導くための強力な武器になります。

4. まとめと次のステップ(CTA)

■ 今回の振り返りと次回予告:次はいよいよコンテナ化とリアルなエラーに方に立ち向かう「インフラ自動化 & 突破編」へ

今回は、MonographクラウドSaaS化における「脳みそ」となるバックエンドのロジック構築手順を完全解説しました。

  • 「DynamoDB ユーザー認証」によるデータ構造の外部化で、将来の複数ツールの横展開に備える
  • 「環境変数 IS_AWS」をトリガーに、ローカル環境(JSON)と本番(DynamoDB)を自動で繋ぎ変える
  • 拡張性のある「プラン判定 ロジック」を構築し、無料枠や高級モデルのアクセスを冷徹にガードする

安全な通信経路、洗練された操作画面、指示通りの判定ロジックという、Webサービスに必要なすべてのパーツが机の上に出揃いました。

次へのステップとして、この完成したPythonのプログラムを、24時間365日インターネット上で稼働し続ける「本番のインフラ環境」へ、人間の手を一切介さずに一撃でデプロイ(配備)するための自動化の仕組みを構築します。

次回(金曜日公開)は【第4回:インフラ自動化編】として、StreamlitアプリをheadlessモードでDockerコンテナ化する極秘のDockerfile記述、およびAWSの全インフラ資源を一発で自動生成するTerraform(main.tf)の設定を余すことなく解説します!

さらに、開発中に遭遇したリアルなエラー(st.form内だとパスワード強度チェッカーがリアルタイムで再レンダリングされないStreamlit固有の罠や、タイポによるNameErrorの原因など)の突破口を、「エラーメッセージのどこに注目すべきか」というプロの着眼点とともに、泥臭いデバッグストーリーとして完全公開します。どうぞお楽しみに!

💡 あなたのビジネスを一歩先へ進めるために

環境構築の煩わしさをすべて過去にし、ブラウザを開くだけで明日の作業効率を劇的に爆速化する『Monograph クラウドSaaS版』は、現在AWS上での最終テストに向けて熱量高く調整を進めています。公開のアナウンスを絶対に見逃さないよう、ぜひブログのブックマークをお願いします!

また、次回の記事を待てずに「今すぐ自分のパソコン環境でスクリプトを動かして、明日から生まれる自由な時間を数時間増やしたい」という圧倒的な成長意欲をお持ちの方は、私が実際のブログ運営や実務の効率化で運用し、圧倒的な実績を残している即戦力の自動化スクリプト群をBOOTHにて先行公開しています。

無料枠は月30回までじっくり試せる点も含め、将来提供するSaaSへの布石となるツール群です。導入するだけであなたのビジネスを加速させる強力な武器が揃っていますので、ぜひその目でチェックしてみてください。

👉 てつログ公式 BOOTHストアで即戦力ツールを見てみる

コメント

タイトルとURLをコピーしました