見出し画像

Zeabur で実現するブラウザ完結 API 開発(第2回)— PostgreSQL と CRUD API の実装

著者: Shotaro Suzuki
執筆日: 2026-01-20


はじめに

前回の記事では、GitHub Codespaces と Zeabur を使って、ブラウザだけで .NET 9 Web API を本番環境にデプロイしました。

しかし、`/weatherforecast` エンドポイントだけでは実用的なアプリケーションとは言えません。

この記事では、PostgreSQL データベースを追加し、商品管理 CRUD API を実装します。すべてブラウザ上で完結します。


この記事で実現すること

  • PostgreSQL データベースの追加(Zeabur Dashboard から1クリック)

  • Product モデルの作成(商品データの定義)

  • Entity Framework Core の設定

  • CRUD API の実装(作成・取得・更新・削除)

  • Swagger UI でのテスト

  • 実際のデータ投入と確認


ステップ1: PostgreSQL データベースを追加する

まず、Zeabur Dashboard でデータベースを追加します。

1-1. Zeabur Dashboard を開く

ブラウザで Zeabur Dashboard にアクセスしてください。

前回デプロイした `MobileShop.Api` プロジェクトを選択します。

1-2. PostgreSQL を追加する

Zeabur Dashboard で前回デプロイした MobileShop.Api があるプロジェクトを開き、プロジェクト画面内の「+ Add Service」ボタンをクリックしてください。そうすると サービス選択のダイアログ(モーダル)が開くので、サービスを追加→データベース→PostgreSQL を選択します

数秒で PostgreSQL インスタンスが作成され、以下の環境変数が自動的に `MobileShop.Api` サービスに注入されます:

  • `DATABASE_URL`: PostgreSQL 接続文字列

  • `POSTGRES_HOST`: ホスト名

  • `POSTGRES_PORT`: ポート番号

  • `POSTGRES_USER`: ユーザー名

  • `POSTGRES_PASSWORD`: パスワード

  • `POSTGRES_DATABASE`: データベース名

PostgreSQL 環境変数の自動設定

これで、データベースの準備は完了です。パブリッククラウドサービスのように接続文字列を手動でコピーする必要はありません。


ステップ2: GitHub Codespaces を開く

前回使用した GitHub Codespaces を開いてください。

もし閉じてしまった場合は、GitHub リポジトリ(`MobileShop.Api`)のページから「Code」→「Codespaces」→「Open in browser」で再度開けます。


ステップ3: GitHub Copilot でコードを自動生成する(所要時間: 約3分)

ここからが、この記事の最大のポイントです。手動でコードを書く必要はありません。

3-1. 必要なパッケージを追加する

まず、ターミナルで以下のコマンドを実行してください:

# MobileShop.Api ディレクトリに移動
cd MobileShop.Api

# Entity Framework Core のデザインツール
dotnet add package Microsoft.EntityFrameworkCore.Design
# PostgreSQL 用のプロバイダー
dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL

3-2. Copilot Chat を開く

キーボードショートカット「Ctrl+Shift+I」(Mac では Cmd+Shift+I)で Copilot Chat を開いてください。

または、コマンドパレット(Ctrl+Shift+P / Cmd+Shift+P)を開き、「GitHub Copilot: Open Chat」と入力して選択してください。

3-3. プロンプトを入力する

以下のプロンプトをコピーして、Copilot Chat に貼り付けてください:

以下のプロンプトを Copilot Chat に貼り付けてください:

ASP.NET Core 9 で商品管理 CRUD API を作成してください。

要件:
- Product モデル: Id, Name, Price, Description, ImageUrl, CreatedAt
- Entity Framework Core + PostgreSQL
- ApplicationDbContext を使用
- CRUD エンドポイント(GET, POST, PUT, DELETE)
- 環境変数 DATABASE_URL から接続文字列を取得
- Migration 自動実行
- Program.cs で PORT 環境変数を読み取る

生成するファイル:
- Models/Product.cs
- Data/ApplicationDbContext.cs
- Controllers/ProductsController.cs
- Program.cs(既存ファイルを更新)

3-4. コードを確認して適用する

Copilot が以下の4つのファイルのコードを生成します:

  1. Models/Product.cs - 商品モデル

  2. Data/ApplicationDbContext.cs** - データベースコンテキスト

  3. Controllers/ProductsController.cs - CRUD API コントローラー

  4. Program.cs - アプリケーションの設定

各ファイルの内容を確認し、問題なければ「Apply」または「Insert at cursor」をクリックしてコードを適用してください。

重要なポイント

  1. Copilot が自動生成してくれる
    手動でコードをコピペする必要はありません。プロンプトを入力するだけです。

  2. PORT 環境変数の読み取り
    Zeabur は動的にポートを割り当てるため、`PORT` 環境変数を読み取る必要があります。

  3. DATABASE_URL の読み取り
    Zeabur が自動注入する `DATABASE_URL` を使って PostgreSQL に接続します。

  4. 自動マイグレーション
    アプリ起動時に `dbContext.Database.Migrate()` を実行することで、テーブルが自動作成されます。


ステップ4: マイグレーションを作成する

データベーススキーマを定義するマイグレーションファイルを作成します。

ターミナルで以下のコマンドを実行してください:

# Entity Framework Core Tools をインストール(初回のみ)
dotnet tool install --global dotnet-ef

# マイグレーションを作成
dotnet ef migrations add InitialCreate

`Migrations` フォルダに `*_InitialCreate.cs` というファイルが生成されます。


ステップ5: Git でコミット・プッシュする

すべてのコードが完成したので、GitHub にプッシュします。

# すべてのファイルをステージング
git add .

# コミット
git commit -m "Add Product CRUD API with PostgreSQL"

# GitHub へプッシュ
git push origin main

ステップ6: Zeabur で自動デプロイされるのを確認する

GitHub に push すると、Zeabur が自動的に新しいコードを検知してデプロイを開始します。

6-1. Zeabur Dashboard を開く

Zeabur Dashboard で `MobileShop.Api` プロジェクトを開いてください。

6-2. デプロイログを確認する

画面右側のログで、ビルドの進行状況を確認できます。

約1〜2分で「Deploy successful」と表示されれば、デプロイ完了です。


ステップ7: Swagger UI でテストする

API が正常に動作しているか、Swagger UI で確認しましょう。

7-1. Swagger UI を開く

ブラウザで以下の URL にアクセスしてください:

https://mobileshop-api.zeabur.app/swagger

Swagger UI が表示され、新しく追加した `/api/products` エンドポイントが表示されているはずです。

新しく追加した /api/products エンドポイント

7-2. 商品を作成する(POST)

  1. POST /api/products」をクリック

  2. Try it out」をクリック

  3. Request body に以下の JSON を入力:

{
  "name": "iPhone 15 Pro",
  "price": 159800,
  "description": "最新の iPhone",
  "imageUrl": "https://example.com/iphone15pro.jpg"
}
  1. Execute」をクリック

成功すると、Response body に作成された商品データが返ってきます:

{
  "id": 1,
  "name": "iPhone 15 Pro",
  "price": 159800,
  "description": "最新の iPhone",
  "imageUrl": "https://example.com/iphone15pro.jpg",
  "createdAt": "2026-01-13T10:30:00Z"
}

7-3. 商品一覧を取得する(GET)

  1. GET /api/products」をクリック

  2. Try it out」をクリック

  3. Execute」をクリック

先ほど作成した商品データが配列で返ってきます:

[
  {
    "id": 1,
    "name": "iPhone 15 Pro",
    "price": 159800,
    "description": "最新の iPhone",
    "imageUrl": "https://example.com/iphone15pro.jpg",
    "createdAt": "2026-01-13T10:30:00Z"
  }
]
先ほど作成した商品データ

7-4. さらに商品を追加する

同じ手順で、さらに商品を追加してみましょう:(Swaggerでも1つのJSONオブジェクトのみを入力してください。複数の商品を一度に登録したい場合は、一括登録用のエンドポイントを作成する必要があります。)

{
  "name": "iPad Pro 13インチ",
  "price": 128800,
  "description": "M2チップ搭載",
  "imageUrl": "https://example.com/ipadpro.jpg"
}
{
  "name": "AirPods Pro",
  "price": 39800,
  "description": "ノイズキャンセリング対応",
  "imageUrl": "https://example.com/airpodspro.jpg"
}

再度 `GET /api/products` を実行すると、3件の商品が返ってくるはずです。

GET /api/products で3件の商品が返ってくる

7-5. 特定の商品を取得する(GET)

  1. GET /api/products/{id}」をクリック

  2. Try it out」をクリック

  3. `id` に `1` を入力

  4. Execute」をクリック

ID が 1 の商品(iPhone 15 Pro)だけが返ってきます。

7-6. 商品を更新する(PUT)

  1. PUT /api/products/{id}」をクリック

  2. Try it out」をクリック

  3. `id` に `1` を入力

  4. Request body に以下を入力(価格を変更):

{
  "name": "iPhone 15 Pro",
  "price": 149800,
  "description": "最新の iPhone(値下げ)",
  "imageUrl": "https://example.com/iphone15pro.jpg"
}
  1. Execute」をクリック

成功すると `204 No Content` が返ってきます。

成功  204 No Content

再度 `GET /api/products/1` を実行すると、価格が更新されていることが確認できます。

GET /api/products/1 を実行

7-7. 商品を削除する(DELETE)

  1. DELETE /api/products/{id}」をクリック

  2. Try it out」をクリック

  3. `id` に `3` を入力(AirPods Pro を削除)

  4. Execute」をクリック

成功すると `204 No Content` が返ってきます。

  削除成功 204 No Content

再度 `GET /api/products` を実行すると、AirPods Pro が削除されて2件だけが返ってくるはずです。

GET /api/products で2件だけ

curl コマンドでのテスト(上級者向け)

Swagger UI の代わりに、ターミナルから `curl` コマンドでテストすることもできます。

商品一覧を取得

curl https://mobileshop-api.zeabur.app/api/products

商品を作成

curl -X POST https://mobileshop-api.zeabur.app/api/products \
  -H "Content-Type: application/json" \
  -d '{
    "name": "MacBook Pro 14インチ",
    "price": 248800,
    "description": "M3 Pro チップ搭載",
    "imageUrl": "https://example.com/macbookpro.jpg"
  }'

特定の商品を取得

curl https://mobileshop-api.zeabur.app/api/products/1

商品を更新

curl -X PUT https://mobileshop-api.zeabur.app/api/products/1 \
  -H "Content-Type: application/json" \
  -d '{
    "name": "iPhone 15 Pro",
    "price": 139800,
    "description": "最新の iPhone(さらに値下げ)",
    "imageUrl": "https://example.com/iphone15pro.jpg",
  }'

商品を削除

curl -X DELETE https://mobileshop-api.zeabur.app/api/products/2

まとめ

この記事では、前回デプロイした Web API に PostgreSQL データベースを追加し、完全な CRUD API を実装しました。

実現できたこと

  • ✅ PostgreSQL データベースをワンクリックで追加

  • ✅ GitHub Copilot でコードを自動生成

  • ✅ Entity Framework Core を使ったデータベース連携

  • ✅ 商品の作成・取得・更新・削除 API

  • ✅ Swagger UI でのテスト

  • ✅ 自動デプロイ(Git push するだけで本番環境に反映)

Zeabur の素晴らしい点

  1. データベース追加が1クリック
    Azure のように接続文字列をコピーする必要がありません。

  2. 環境変数が自動注入
    `DATABASE_URL` が自動的にアプリに渡されます。

  3. マイグレーションが自動実行
    `dbContext.Database.Migrate()` を書くだけで、テーブルが自動作成されます。

  4. すべてブラウザで完結
    .NET SDK、PostgreSQL、VS Code のインストールは一切不要です。


次回予告

次回(第3回)では、この API を、実際の iOS アプリ(Swift)Android アプリ(Kotlin) から呼び出す方法を解説します。

モバイルアプリ側のコード例と、CORS 設定、認証の追加方法も紹介する予定です。


参考リンク


最後まで読んでいただき、ありがとうございました!

いいなと思ったら応援しよう!