ステップ5:サンプルモバイルアプリでの動作確認 - Expo + React Nativeアプリとバックエンドの統合
今回のステップの概要
このステップでは、ステップ1〜4で構築したバックエンドシステム(API Gateway、Cognito、Lambda、DynamoDB、WebSocket API)を、実際のモバイルアプリケーションから利用して動作確認を行います。
用意されているExpo + React Nativeサンプルアプリケーションを使用して、以下の機能が正しく動作することを確認します:
- ユーザー認証機能(ステップ2で構築):サインアップ、メール認証、ログイン
- 位置情報機能(ステップ3で構築):チェックイン作成、履歴取得、近隣検索
- リアルタイム通信(ステップ4で構築):WebSocketによる双方向通信
モバイルアプリを実際に動かすことで、これまで構築したバックエンドシステムが「生きたサービス」として機能することを体感できます。これは、レストランで作った料理を実際にお客様に提供して、味や見た目を確認するのと同じプロセスです。
このステップで学ぶこと
- Expo + React Nativeアプリとバックエンドの接続設定
- Expo Goアプリを使った実機での動作確認方法
- Cognitoを使った認証フローの実装確認
- API Gatewayを通したデータ通信の動作確認
- モバイルアプリケーション開発におけるエラーハンドリングとデバッグ手法
実際の手順
実際の手順では、サンプルアプリケーションのセットアップから、バックエンド接続設定、動作確認まで段階的に進めます。
1. 開発環境の準備
Expo + React Nativeアプリケーションを動作させるための開発環境を準備します。
Expoとは
Expoは、React Nativeアプリケーションの開発を劇的に簡単にするプラットフォームです。これは、レストランで言えば、調理器具や食材がすべて揃った「セントラルキッチン」のようなもので、開発者はすぐに料理(アプリ開発)を始められます。
Expoの特徴:
- XcodeやAndroid Studioのインストールが不要(開発時)
- 環境構築が数分で完了
- スマートフォンでQRコードをスキャンするだけで実機テストが可能
- 一つのコードベースでiOS/Android両対応
- JavaScriptの知識で開発可能
従来のReact Nativeとの違い
従来のReact Native開発では、iOSアプリを開発するにはXcodeを、AndroidアプリにはAndroid Studioをインストールし、複雑な環境設定が必要でした。これは、レストランを開く前に厨房の設備を一から揃えるような大変な作業です。
Expoを使用すると、これらの複雑な環境構築をスキップして、すぐにアプリ開発を始められます。これは、設備が整ったレンタルキッチンを借りて、すぐに料理を始められるようなものです。
他のモバイル開発手法
- ネイティブ開発: Swift(iOS)、Kotlin(Android)で個別開発
- Flutter: Dart言語を使用したクロスプラットフォーム開発
- Ionic: Web技術(HTML/CSS/JS)を使用したハイブリッドアプリ開発
1-1. Node.jsのインストール確認
Expoの開発にはNode.jsが必要です。以下のコマンドでバージョンを確認してください。
node --version
npm --version【解説】Node.jsのバージョン要件
Expo SDK 54を使用する場合、Node.js 18以上が推奨されます。バージョンが古い場合は、Node.js公式サイト から最新のLTS版をインストールしてください。
npmはNode.jsに同梱されているパッケージマネージャーで、ライブラリ管理に使用します。これは、レストランで言えば食材の発注システムのようなもので、必要なライブラリ(食材)を自動的に取り寄せてくれます。
1-2. Expo Goアプリのインストール(推奨)
最も簡単にExpoアプリをテストする方法は、スマートフォンにExpo Goアプリをインストールすることです。これは、レストランの新メニューを試食するために、お客様に試食用のサンプルを提供するようなものです。
iOS(iPhone)の場合:
- App Storeを開きます
- 「Expo Go」を検索してインストールします
- App Store直リンク
Androidの場合:
- Google Playを開きます
- 「Expo Go」を検索してインストールします
- Google Play直リンク
【解説】Expo Goアプリの仕組み
Expo Goアプリは、開発中のアプリを実機で動作確認するための「プレビュー環境」です。これは、レストランで言えば「試食会場」のようなもので、完成前の料理(アプリ)を実際に味見(テスト)できます。
従来のReact Native開発では、アプリを実機で動作確認するために、XcodeやAndroid Studioでビルドして、実機にインストールする必要がありました。この作業には数分から数十分かかることもあります。
Expo Goを使用すると、開発サーバーを起動してQRコードをスキャンするだけで、数秒で実機でアプリが動作します。コードを変更すると、即座に実機に反映されるため、開発スピードが劇的に向上します。
2. サンプルアプリケーションのセットアップ
GitHub上のサンプルコードをダウンロードし、依存関係をインストールします。
2-1. サンプルコードのダウンロード
- サンプルコードをダウンロードします:
- プロジェクト構成を確認します:
ls -la【解説】プロジェクト構造の詳細
プロジェクトのディレクトリ構成、各ファイルの役割、Expoプロジェクトの特徴については、サンプルコードのREADME.mdに詳しく記載されています。
以下の内容が確認できます:
- 📁 プロジェクト構造と各ファイルの説明
- ⚙️ バックエンド設定方法
- 🚀 セットアップ手順
- 🐛 トラブルシューティング
- 🔐 セキュリティ設定
サンプルコードディレクトリのREADME.mdを参照してください。
2-2. 依存関係のインストール
- Node.jsパッケージをインストールします:
npm installこのコマンドで、package.jsonに定義された以下のライブラリがインストールされます:
expo: Expoの基本ライブラリreact、react-native: React Nativeの基本ライブラリexpo-location: 位置情報取得ライブラリ(Expo対応版)expo-router: ファイルベースルーティングライブラリamazon-cognito-identity-js: Cognito認証ライブラリaxios: HTTP通信ライブラリ@react-native-async-storage/async-storage: ローカルストレージライブラリ
たったこれだけです。従来のReact Nativeでは、この後にcd ios && pod installを実行する必要がありましたが、Expoではその作業は不要です。
【解説】Expoの依存関係管理の仕組み
従来のReact Native開発では、位置情報機能を使用する場合、以下の手順が必要でした:
npm install react-native-geolocation-serviceでJavaScriptライブラリをインストールcd ios && pod installでiOSのネイティブモジュールをインストール- Android側の設定ファイルを手動で編集
- 権限設定を手動で追加
これは、レストランで言えば、食材(JavaScriptライブラリ)を仕入れるだけでなく、調理器具(ネイティブモジュール)も個別に揃え、さらに厨房のレイアウト(設定ファイル)も手動で調整する必要があるようなものです。
Expoでは、npm install expo-locationを実行するだけで、JavaScriptライブラリ、ネイティブモジュール、権限設定がすべて自動的に管理されます。これは、食材と調理器具がセットで届き、すぐに調理を始められるようなものです。
この仕組みにより、開発者は複雑なネイティブモジュールの管理から解放され、アプリのロジック開発に集中できます。
3. バックエンド接続設定
AWSで構築したバックエンドエンドポイントをExpoアプリに設定します。
3-1. 必要な情報の収集
以下の情報をAWSコンソールから取得します:
① Cognito User Pool ID
- AWSマネジメントコンソールでCognitoサービスを開きます
- ステップ2で作成したUser Pool(
mobile-app-user-pool)を選択します - 「ユーザープールの概要」ページで「プールID」をコピーします
- 形式例:
us-east-1_xxxxxxxxx
- 形式例:
② Cognito App Client ID
- 同じUser Poolの画面で「アプリの統合」タブを開きます
- 「アプリクライアント」セクションで作成したアプリクライアントを選択します
- 「クライアントID」をコピーします
- 形式例:
1a2b3c4d5e6f7g8h9i0j1k2l3m
- 形式例:
③ API Gateway URL(REST API)
- API Gatewayコンソールを開きます
- ステップ1で作成したAPI(
mobile-app-api)を選択します - 「ステージ」を選択し、デプロイしたステージ(
prodなど)をクリックします - 「URLを呼び出す」の値をコピーします
- 形式例:
https://abc123def4.execute-api.us-east-1.amazonaws.com/prod
- 形式例:
④ WebSocket API URL(ステップ4を実施した場合のみ)
- API Gatewayコンソールを開きます
- ステップ4で作成したWebSocket API(
mobile-app-websocket)を選択します - 「ステージ」を選択し、デプロイしたステージ(
prodなど)をクリックします - 「WebSocket URL」の値をコピーします
- 形式例:
wss://xyz123abc4.execute-api.us-east-1.amazonaws.com/prod
- 形式例:
【解説】エンドポイント情報の役割
- User Pool ID: Cognitoのユーザー管理データベースの識別子
- App Client ID: モバイルアプリがCognitoにアクセスする際の認証情報
- API Gateway URL: バックエンドAPIのベースURL(REST API)
- WebSocket URL: リアルタイム通信用のWebSocket API URL(ステップ4実施時のみ必要)
これらの情報は、モバイルアプリがAWSのサービスと通信するための「住所」と「鍵」のような役割を果たします。
3-2. 設定ファイルの編集
config/backend.jsファイルを開き、取得した情報を設定します。
詳細な設定方法について
設定ファイルの編集方法、各設定項目の説明、WebSocket設定の詳細については、サンプルコードのREADME.mdの「🚀 セットアップ手順」セクションを参照してください。
README.mdには以下の内容が含まれています:
- ⚙️ 設定ファイルの詳細な編集手順
- 📋 各設定項目の説明とデフォルト値
- 🔧 WebSocket設定(Phase 2)の詳細
- 🎨 カスタマイズ方法
- テキストエディタで
config/backend.jsを開きます:
# Visual Studio Codeの場合
code config/backend.js
# またはお好みのエディタで
nano config/backend.js- 最低限、以下の3箇所を編集してください:
const BACKEND_CONFIG = {
cognito: {
userPoolId: 'us-east-1_xxxxxxxxx', // ← AWSコンソールから取得した値
clientId: 'xxxxxxxxxxxxxxxxxxxxxxxx', // ← AWSコンソールから取得した値
region: 'us-east-1',
},
api: {
baseUrl: 'https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/prod', // ← AWSコンソールから取得した値
// ... その他の設定
},
// ステップ4を実施した場合のみ設定
websocket: {
url: 'wss://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/prod', // ← WebSocket URL
// ... その他の設定
},
};- ファイルを保存します
4. アプリケーションの起動と動作確認
設定が完了したら、実際にアプリを起動して動作を確認します。
4-1. Expo開発サーバーの起動
Expoの開発サーバーを起動します。
npm startまたは、以下のコマンドでも起動できます:
npx expo startこのコマンドでExpo開発サーバーが起動し、ターミナルにQRコードが表示されます:
› Metro waiting on exp://192.168.1.10:8081
› Scan the QR code above with Expo Go (Android) or the Camera app (iOS)
› Press a │ open Android
› Press i │ open iOS simulator
› Press w │ open web
› Press j │ open debugger
› Press r │ reload app
› Press m │ toggle menu
› Press ? │ show all commands
Logs for your project will appear below. Press Ctrl+C to exit.このターミナルウィンドウは開いたままにしておいてください。
【解説】Expo Metro Bundlerとは
Expo Metro Bundlerは、JavaScriptコードをバンドル(まとめる)し、デバイスに配信する開発サーバーです。これは、レストランで言えば「配膳システム」のようなもので、厨房で作った料理(アプリのコード)をお客様のテーブル(デバイス)まで運びます。
コードを変更すると、Metro Bundlerが自動的に変更を検知してアプリに反映します(Hot Reload機能)。これにより、アプリを再起動することなく、すぐに変更結果を確認できます。これは、料理の味付けを調整したら、即座に試食できるようなものです。
従来のReact Nativeと異なり、ExpoのMetro Bundlerは、XcodeやAndroid Studioを起動することなく動作します。これにより、開発環境がよりシンプルになります。
4-2. Expo Goアプリで実機テスト(推奨)
最も簡単で推奨される方法は、Expo Goアプリを使った実機テストです。
iOS(iPhone)の場合:
- iPhoneのカメラアプリを開きます
- ターミナルに表示されているQRコードをスキャンします
- 通知が表示されたら「Expo Goで開く」をタップします
- 自動的にExpo Goアプリが起動し、アプリが表示されます
Androidの場合:
- Expo Goアプリを開きます
- 「Scan QR Code」をタップします
- ターミナルに表示されているQRコードをスキャンします
- アプリが自動的に起動します
同じWi-Fiネットワークに接続していない場合:
- Expo Goアプリで「Enter URL manually」を選択します
- ターミナルに表示されているURL(例:
exp://192.168.1.10:8081)を入力します
5. 認証機能の動作確認
アプリが起動したら、ステップ2で構築したCognito認証システムの動作を確認します。
5-1. ユーザー登録のテスト
- アプリのログイン画面で「アカウントをお持ちでない方は こちら」をタップします
- 以下の情報を入力します:
- メールアドレス: test-user1@example.com(実際に受信可能なメールアドレス)
- パスワード: Test1234!(8文字以上、大文字小文字数字記号を含む)
- 「登録」ボタンをタップします
- 「確認コード送信」のメッセージが表示されます
5-2. メール認証のテスト
- 入力したメールアドレス宛に6桁の確認コードが送信されます
- メールを確認し、6桁のコード(例:123456)をコピーします
- アプリの「確認コード」欄にコードを入力します
- 「確認」ボタンをタップします
- 「登録完了」のメッセージが表示されたら、「OK」をタップします
メールが届かない場合のトラブルシューティング:
- 迷惑メールフォルダを確認してください
- Cognitoコンソールで「メール設定」が正しいか確認してください
- SESがサンドボックスモードの場合、検証済みメールアドレスのみに送信可能です
5-3. ログインのテスト
- 登録が完了すると、ログイン画面に戻ります
- 登録時に使用したメールアドレスとパスワードを入力します
- 「ログイン」ボタンをタップします
- ログインに成功すると、メイン画面に遷移します
ログインできない場合のトラブルシューティング:
- メールアドレスとパスワードが正しいか確認してください
- メール認証が完了しているか確認してください
- ネットワーク接続を確認してください
- 開発者ツールのコンソールでエラーメッセージを確認してください
【解説】JWTトークンの保存と自動認証
ログインに成功すると、Cognitoから発行されたJWTトークンがAsyncStorageに保存されます。このトークンにより、アプリを閉じても次回起動時に自動的にログイン状態が復元されます。
- IDトークン: ユーザーの身元情報を含む(名前、メールアドレスなど)
- アクセストークン: APIへのアクセス権限を示す
- リフレッシュトークン: アクセストークンの更新に使用
これらのトークンは有効期限があり、期限切れ時には自動的に再ログインが必要になります。
5-4. AWSコンソールでユーザーの確認
- AWSマネジメントコンソールでCognitoサービスを開きます
- User Pool(
mobile-app-user-pool)を選択します - 「ユーザー」タブをクリックします
- 作成したユーザーが「確認済み」ステータスで表示されていることを確認します
ユーザーをクリックすると、以下の詳細情報が確認できます:
- ユーザー名(メールアドレス)
- メール認証ステータス
- 作成日時
- 最終更新日時
6. 位置情報機能の動作確認
ステップ3で構築した位置情報システムの動作を確認します。
6-1. 位置情報権限の許可
メイン画面が表示されると、位置情報の利用許可を求めるダイアログが表示されます。
iOSの場合:
- 「Appの使用中は許可」を選択します
Androidの場合:
- 「アプリの使用中のみ」を選択します
【解説】Expoでの位置情報権限管理
Expoでは、位置情報権限の管理が従来のReact Nativeよりもシンプルになっています。
従来のReact Native:
- iOSの権限設定:
ios/Info.plistファイルを手動で編集 - Androidの権限設定:
android/AndroidManifest.xmlファイルを手動で編集 - 2つのファイルで別々に設定が必要
Expo:
app.jsonの1箇所で設定するだけ:
"plugins": [
[
"expo-location",
{
"locationAlwaysAndWhenInUsePermission": "チェックイン機能で現在地を使用します"
}
]
]Expoが自動的にiOSとAndroid両方の権限設定を生成してくれます。
位置情報権限の種類:
- 常に許可: バックグラウンドでも位置情報を取得可能(配送アプリなどで使用)
- アプリ使用中のみ許可: アプリがフォアグラウンドの時のみ取得可能
- 許可しない: 位置情報を取得できない
このサンプルアプリでは「アプリ使用中のみ」で十分ですが、バックグラウンドで位置情報を追跡する機能を実装する場合は「常に許可」が必要です。
6-2. 現在地の表示確認
位置情報権限を許可すると、アプリのメイン画面が表示されます。
画面上部に以下の情報が表示されます:
- 📍 チェックイン(タイトル)
- リアルタイム接続状態(緑のドット=接続中、オレンジのドット=接続中…)
- ログアウトボタン
「📍 現在地」カードに現在の緯度・経度が表示されます:
- 緯度: 35.787318(例)
- 経度: 139.469304(例)
6-3. チェックインの作成テスト
- 青い「チェックイン」ボタンをタップします
- 「成功」「チェックインしました!」のメッセージが表示されます
- 画面下部の「📋 チェックイン履歴」セクションに新しいチェックインが追加されます
チェックイン履歴に表示される情報:
- 📍 チェックイン(ラベル)
- チェックイン日時(例:2025/11/16 21:00)
- ユーザーID:
3438f498-1061-70c6-826c-714380d8845a(例) - 緯度・経度
- メモ: 📍 チェックイン
- ID: チェックインID(UUID)
このとき、バックエンドでは以下の処理が実行されています:
- React Nativeアプリが現在の緯度・経度を取得
- API Gateway経由でLambda関数にPOSTリクエストを送信
- Lambda関数がDynamoDBにチェックインデータを保存
- 成功レスポンスがアプリに返される
- アプリが履歴リストに新しいチェックインを表示
6-4. リアルタイム通信の確認(WebSocket)
画面上部に「🟢 リアルタイム」のステータスが表示されている場合、WebSocket接続が有効です。
このセクションはステップ4でWebSocket APIを実装した場合のみ該当します。WebSocket APIを未実施の場合はスキップしてください。
WebSocketの双方向通信テスト
WebSocketが正しく動作していることを、コマンドラインとExpoアプリの両方で確認します。
ステップ1: コマンドラインでWebSocket接続
# WebSocket URLを環境変数に設定(Step 4で取得したURL)
export WS_URL="wss://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/prod"
# 認証付きでWebSocket接続
wscat -c "${WS_URL}?token=${ID_TOKEN}"接続成功すると、以下のように表示されます:
Connected (press CTRL+C to quit)
>ステップ2: Expoアプリからメッセージ送信 → コマンドラインで受信確認
- Expoアプリで緑の「👋 Say Hi!」ボタンをタップします
- コマンドラインのwscat画面に即座にメッセージが表示されることを確認します:
< {
"type": "message",
"sender_id": "74a854b8-0091-70a8-9c1b-161f3130b0b0",
"message": "Hi! みんな元気?",
"timestamp": "2025-11-16T12:00:14.000000"
}ステップ3: コマンドラインからメッセージ送信 → Expoアプリで受信確認
- コマンドライン(wscat)で以下のメッセージを入力して送信します:
{"action": "send_message", "data": {"message": "Hello from command line!"}}- Expoアプリの「💬 受信メッセージ(最新3件)」セクションに即座に表示されることを確認します:
- #1(最新)
- 受信時刻(例:12:01:24)
- User ID: 送信者のユーザーID
- メッセージ:
Hello from command line!
【解説】WebSocketの双方向通信の確認
この2つのステップで、以下を確認できます:
- アプリ → サーバー → コマンドライン: Expoアプリからのメッセージ送信が正常に動作
- コマンドライン → サーバー → アプリ: サーバー側からのプッシュ通知が正常に動作
これにより、WebSocketが完全な双方向通信として機能していることが確認できます。実際のアプリでは、他のユーザーのチェックイン通知やチャットメッセージが、この仕組みでリアルタイムに配信されます。
6-5. 複数のチェックインをテスト
- 別の場所に移動してから「チェックイン」ボタンをもう一度タップします
- 「📋 チェックイン履歴」セクションに新しいチェックインが追加されます
- 最新のチェックインが先頭に表示されることを確認します
- 履歴件数が増加することを確認します(例:7件 → 8件)
【解説】チェックインデータの構造
DynamoDBに保存されるチェックインデータは以下の構造を持っています:
{
"checkInId": "uuid-v4-string",
"userId": "cognito-user-sub",
"latitude": 35.6812,
"longitude": 139.7671,
"timestamp": "2025-10-31T10:30:00Z",
"memo": "東京駅でチェックイン",
"createdAt": "2025-10-31T10:30:00Z"
}このデータ構造により、ユーザーごとのチェックイン履歴管理、時系列での検索、位置情報に基づく検索が可能になります。
6-6. DynamoDBでのデータ確認
- AWSマネジメントコンソールでDynamoDBサービスを開きます
- 「テーブル」から
checkins-tableを選択します - 「項目を表示」をクリックします
- アプリから作成したチェックインデータが保存されていることを確認します
確認できる項目:
checkInId: 一意のチェックインID(UUID)userId: Cognitoユーザーのサブ(ユーザー識別子)latitude、longitude: 位置情報timestamp: チェックイン日時memo: メモ(オプション)
7. エラーハンドリングとデバッグ
実際の開発では、エラーが発生することがあります。適切なデバッグ手法を学びます。
7-1. よくあるエラーとその対処法
① 「バックエンド設定エラー」と表示される
原因:
config/backend.jsの設定が不完全
対処法:
# 設定ファイルを確認
cat config/backend.js | grep -E "userPoolId|clientId|baseUrl"
# 以下が設定されているか確認:
# - userPoolId: us-east-1_xxxxxxxxx
# - clientId: 実際のクライアントID
# - baseUrl: https://xxxxx.execute-api...② 「Network Error」が発生する
原因:
- API GatewayのURLが間違っている
- CORSが正しく設定されていない
- Lambda関数が実行されていない
対処法:
# API GatewayのURLを手動でテスト
curl -X GET "https://xxxxx.execute-api.us-east-1.amazonaws.com/prod/checkins" \
-H "Authorization: Bearer YOUR_JWT_TOKEN"
# CORSヘッダーの確認
curl -X OPTIONS "https://xxxxx.execute-api.us-east-1.amazonaws.com/prod/checkins" \
-H "Origin: http://localhost:8081" \
-H "Access-Control-Request-Method: GET" \
-v③ 「Unauthorized」エラーが発生する
原因:
- JWTトークンが無効または期限切れ
- API Gatewayのオーソライザー設定が間違っている
対処法:
# 一度ログアウトして再ログインする
# アプリで「ログアウト」→「ログイン」を実行
# または、AsyncStorageをクリア(開発者モード)
# Expo開発サーバーで「m」キーを押してメニューを開き、
# 「Clear async storage」を選択④ 位置情報が取得できない
原因:
- 位置情報権限が許可されていない
- Expo Goアプリの位置情報権限が無効
対処法:
# iOS: デバイス設定を確認
# 設定 > プライバシーとセキュリティ > 位置情報サービス > Expo Go > 常に許可
# Android: デバイス設定を確認
# 設定 > アプリ > Expo Go > 権限 > 位置情報 > 許可
# アプリを再起動して権限リクエストをやり直す⑤ QRコードをスキャンしてもアプリが起動しない
原因:
- PCとスマホが異なるWi-Fiネットワークに接続されている
- ファイアウォールがポートをブロックしている
対処法:
# 1. 同じWi-Fiネットワークに接続されているか確認
# 2. Expo開発サーバーを再起動
# 3. トンネルモードを試す:
npx expo start --tunnel【解説】Expoのデバッグツール
Expoには強力なデバッグ機能が組み込まれており、従来のReact Nativeよりもデバッグが簡単です。これは、レストランで言えば、厨房内の状況を常にモニタリングできるシステムのようなものです。
① Expo開発サーバーのコマンド:
jキー: デバッガーを開く(Chrome DevTools)rキー: アプリをリロードmキー: メニューを開く(AsyncStorageクリアなど)?キー: すべてのコマンドを表示
② デバイスシェイク(Expo Goアプリ内):
- デバイスを振ると開発者メニューが表示されます
- 「Remote JS Debugging」でChromeでデバッグ可能
- 「Performance Monitor」でパフォーマンス監視
③ Expo Go内のログ:
console.log()の出力がExpo開発サーバーのターミナルに表示されます- ネットワークリクエストも自動的にログに記録されます
④ AWS CloudWatch Logs:
- バックエンド側のエラーログ確認
- Lambda関数の実行ログ
- API Gatewayのアクセスログ
従来のReact Nativeでは、React Native DebuggerやFlipperなどの追加ツールのインストールが必要でしたが、Expoではこれらの機能が標準で組み込まれています。
7-2. ネットワークリクエストのデバッグ
API通信の内容を詳細に確認する方法を学びます。
Expo開発サーバーのログ確認:
Expo開発サーバーのターミナルには、すべてのAPIリクエストが自動的にログ出力されます:
LOG [API] POST /checkin - 201 Created (234ms)
LOG [API] GET /checkins - 200 OK (145ms)
ERROR [API] GET /checkins/nearby - 401 Unauthorizedこれは、レストランで言えば、すべての注文(APIリクエスト)と配膳状況(レスポンス)を厨房のモニターで確認できるようなものです。
Chrome DevToolsでのデバッグ:
- Expo開発サーバーで
jキーを押します - Chromeブラウザが開きます
- 「Console」タブでログを確認できます
- 「Network」タブでAPIリクエストの詳細を確認できます
確認できる情報:
- リクエストURL
- リクエストヘッダー(Authorizationトークン含む)
- リクエストボディ
- レスポンスステータス
- レスポンスボディ
- リクエスト時間
7-3. Lambda関数のログ確認
バックエンド側でエラーが発生している場合、CloudWatch Logsを確認します。
- AWSマネジメントコンソールでCloudWatchサービスを開きます
- 「ログ」→「ロググループ」を選択します
- Lambda関数のロググループを選択します(例:
/aws/lambda/create-checkin) - 最新のログストリームを開きます
- エラーメッセージやスタックトレースを確認します
よくあるLambdaエラー:
# エラー例1: DynamoDBへの書き込み権限がない
[ERROR] ClientError: An error occurred (AccessDeniedException) when calling the PutItem operation
# 対処法: Lambda実行ロールにDynamoDBのPutItem権限を追加
# エラー例2: 環境変数が設定されていない
[ERROR] KeyError: 'TABLE_NAME'
# 対処法: Lambda関数の環境変数にTABLE_NAMEを追加
# エラー例3: JWTトークンの検証に失敗
[ERROR] Unauthorized: Invalid token
# 対処法: API GatewayのオーソライザーでCognito User Poolを正しく設定8. パフォーマンスとコスト最適化の確認
構築したシステムのパフォーマンスとコストを評価します。
8-1. APIレスポンス時間の測定
React Native Debuggerのネットワークタブで、各APIのレスポンス時間を確認します。
目標値:
- ログイン: 500ms以内
- チェックイン作成: 300ms以内
- チェックイン履歴取得: 500ms以内
レスポンス時間が遅い場合の改善策:
- Lambda関数のメモリ増加: 128MB → 256MB
- DynamoDBのプロビジョニングモード: オンデマンド → プロビジョニング
- API Gatewayのキャッシュ有効化: 頻繁にアクセスされるエンドポイントでキャッシュを有効化
8-2. AWS利用料金の確認
- AWSコンソールの「Billing」セクションを開きます
- 「コストエクスプローラー」で各サービスの利用料金を確認します
想定される無料枠内の料金(月間):
| サービス | 無料枠 | 使用量目安 |
|---|---|---|
| API Gateway | 100万リクエスト | 1,000リクエスト |
| Lambda | 100万リクエスト、40万GB秒 | 100リクエスト |
| DynamoDB | 25GB、読み書き25ユニット | 1GB、少量アクセス |
| Cognito | 50,000 MAU | 1ユーザー |
9. 追加テストシナリオ
より実践的なテストを実施して、システムの堅牢性を確認します。
9-1. 複数ユーザーでのテスト
異なるメールアドレスで複数のユーザーを登録し、以下を確認します:
- ユーザーAのチェックインがユーザーBの履歴に表示されないこと
- 各ユーザーが自分のデータのみにアクセスできること
- 近隣検索で他のユーザーのチェックインが表示されること(プライバシー設定に応じて)
9-2. オフライン動作のテスト
ネットワークを切断した状態でアプリの動作を確認します:
- デバイスを機内モードに設定します
- チェックインを作成しようとするとエラーメッセージが表示されることを確認します
- キャッシュされたデータ(履歴など)は表示されることを確認します
- 機内モードを解除すると、自動的にデータが同期されることを確認します
【解説】オフライン対応の実装
本格的なモバイルアプリでは、オフライン時にもアプリが使用できるよう、以下の機能を実装することが一般的です:
- ローカルキャッシュ: AsyncStorageやRealmを使用してデータをローカルに保存
- オフラインキュー: オフライン時の操作をキューに保存し、オンライン復帰時に送信
- 楽観的更新: APIレスポンスを待たずにUIを更新し、バックグラウンドで同期
- コンフリクト解決: オフライン時の変更とサーバー側の変更が競合した場合の処理
まとめ
このステップでは、ステップ1〜4で構築したバックエンドシステムを、Expo + React Nativeサンプルアプリケーションを使って動作確認しました。
確認できた主な機能:
- 認証システム - Cognitoによるユーザー登録、メール認証、ログイン
- API通信 - API Gatewayを通じた安全なデータ通信
- 位置情報処理 -
expo-locationによるチェックインの作成、履歴取得、位置情報表示 - リアルタイム通信 - WebSocketによる双方向通信(リアルタイムメッセージ受信)
Expoを使用することで得られたメリット:
- 環境構築が5分で完了(XcodeやAndroid Studioのインストール不要)
- QRコードをスキャンするだけで実機で動作確認
- コード変更が即座に実機に反映(Hot Reload)
expo-locationなどの統一されたAPIによるシンプルな開発- iOSとAndroid両対応の設定を
app.jsonで一元管理
学んだデバッグ手法:
- Expo開発サーバーのログ監視
- Chrome DevToolsを使ったネットワーク監視
- CloudWatch Logsでのバックエンドエラー確認
- Expo Goアプリでの実機デバッグ
- エラーケースのハンドリング
次のステップ
このカリキュラムで学んだ技術を応用して、以下のような機能拡張にチャレンジしてみましょう:
機能拡張のアイデア:
- 写真アップロード機能: S3とCloudFrontを使用した画像配信
expo-image-pickerで簡単に実装可能
- コメント機能: チェックインへのコメントとリアルタイム更新
- いいね機能: DynamoDB Atomicカウンターを使用した集計
- フレンド機能: ユーザー間のフォロー・フォロワー関係の管理
- リアルタイム機能の拡張: ユーザーのオンライン状態表示、タイピングインジケーター
- 検索機能: OpenSearch Serviceを使った全文検索
- 分析機能: Amazon QuickSightでのダッシュボード作成
学習の深掘り:
- Expo Application Services (EAS): 本番ビルドとデプロイの自動化
- GraphQL APIの実装: AWS AppSyncを使用
- CI/CDパイプラインの構築: GitHub ActionsとEAS Build
- インフラのコード化: AWS CDKとExpo Config
- セキュリティベストプラクティス: WAF、Shield、Cognito Advanced Security
お疲れさまでした!これで、O2Oモバイルアプリのバックエンド構築カリキュラムのすべてのステップが完了しました。Expoを活用することで、従来よりも圧倒的に簡単に、プロフェッショナルなモバイルアプリを開発できることを体感できたはずです。学んだ知識を活かして、さらなるスキルアップを目指してください!