AWS APIテストアプリ test の画面

test – 自作 AWS API(/items, /changes)とやり取りするテストクライアント

AWS API Gateway + Lambda で自分で用意したエンドポイント /items/changes に対して、 実際の Android から HTTP リクエストを送り、レスポンスの形・エラー・レイテンシなどを 細かく確認するためのテスト専用クライアントアプリです。

作品の説明

「test」は、将来の本番アプリ(予定管理・ログ収集・CanSat など)から 叩くことを想定した AWS API を、安全なサンドボックス環境で検証するためのアプリです。 画面上からリクエスト種別(GET/POST/PUT…)やパラメータを指定し、 JSON レスポンスとステータスコード、レスポンスヘッダをそのまま見られるようにしています。

バックエンドは、/items が「現時点のアイテム一覧」、 /changes が「アイテムに対する変更履歴」や「差分アップロード」に対応する想定で、 このアプリではそれぞれに対して CRUD 系の操作を順番に試しながら、 データ構造・バリデーション・エラー処理を調整していきます。

  • ① テキスト入力で API のベースURL や APIキーを設定
  • ② /items に対して GET/POST/PUT/DELETE を送って挙動を確認
  • ③ /changes に対して差分の送信・同期テストを実施
  • ④ 返ってきた JSON を Pretty Print して画面に表示
  • ⑤ ステータスコード・ヘッダ・レイテンシを併記してログ保存
  • ⑥ 後で見返すために、成功・失敗ケースをローカルに記録

システム概要

test アプリのAWSシステム構成図

Android アプリから HTTPS で API Gateway の /items/changes にアクセスし、 バックエンド側では Lambda 経由でデータストア(DynamoDB や S3 など)を更新します。 test アプリは、この往復を一つずつ観察するための窓口です。

技術スタック

  • Client: Android, Kotlin, Retrofit/OkHttp, Moshi or Gson
  • Backend: AWS API Gateway, AWS Lambda(Node.js / Python など), DynamoDB / S3
  • DevOps: IAM(権限管理), CloudWatch Logs(リクエストログ)

主要コンポーネント

  • MainActivity: ベースURL / エンドポイント / メソッド / ペイロードを入力して リクエストを送る画面。JSON 表示とログリストもここに集約。
  • ApiClient(Retrofit): /items/changes のインターフェイスを定義し、 シリアライザとタイムアウトをまとめて管理。
  • LogRepository: テスト結果(時刻・URL・メソッド・ステータス・レスポンス)をローカルに保存。
  • AWS Lambda handlers: API Gateway から渡されたイベントをパースし、 items/changes 用のビジネスロジックを実行。

技術解説

/ITEMS

/items エンドポイントで「現在の状態」を取得・更新

/items は、「今こういうデータを持っている」という状態を表す API を想定しています。 test アプリからは GET(一覧取得)、POST(新規追加)、PUT(更新)、DELETE(削除)などを順に試し、 レスポンスの JSON スキーマが設計通りになっているかを確認します。

Retrofit インターフェイス例:
@GET("items")
suspend fun getItems(): List<ItemDto>

@POST("items")
suspend fun createItem(@Body body: ItemDto): ItemDto
/CHANGES

/changes エンドポイントで「差分」や「履歴」を扱う

/changes は、オフライン中に貯めた更新や、 クライアント側の状態との差分をやり取りするためのエンドポイントとして設計しています。 test アプリでは、小さな JSON パッチを送ってみたり、 連続して同じ変更を送ったときの冪等性(idempotency)をテストします。

差分送信のイメージ:
{
 "clientId": "android-001",
 "changes": [
  { "op": "update", "itemId": "abc", "fields": { "title": "new" } }
 ]
}
ERROR & VALIDATION

4xx/5xx エラーのハンドリングとバリデーション

本番アプリを作る前に、400/401/403/404/500 といったエラーが どのような JSON で返ってくるかを統一しておくことは重要です。 test アプリでは、あえて不正なリクエストや権限不足の状態を作り、 エラー JSON をきちんとパース・表示できるかを確認します。

エラー表示のイメージ:
if (!response.isSuccessful) {
 val errorBody = response.errorBody()?.string()
 showError(response.code(), errorBody)
}
LOGGING

リクエスト/レスポンスを保存し、あとから「再現」できるように

APIまわりのトラブルは、「どんな入力を送ったのか」「その時のレスポンス」が すぐに再現できるかどうかで解決スピードが決まります。 test アプリでは、送信した内容と返ってきた JSON を ひとまとまりのログとして保存し、必要に応じて再送できるようにしています。

実験・結果・課題

代表的なテストケース

・/items に対して 50 件のデータがある状態で全件取得 ・/changes に対して同じ変更を 2 回送って冪等性を確認 ・わざと必須フィールドを欠けさせて 400 Bad Request を発生させる といったテストを行い、バックエンドの設計を固めていきました。

/items レスポンス表示画面
(a) /items レスポンスの Pretty Print
/changes 送信画面
(b) /changes 送信とエラーチェック画面

現在の課題

・本番用の認可(JWT・Cognitoなど)を入れた時の挙動検証はこれから ・オフライン時に溜めた /changes をどのタイミングで再送するか ・API バージョンアップ時に古いクライアントをどう扱うか といった、運用寄りの課題が見えてきています。

本番用認証はまだ暫定 バージョニング戦略の検討が必要

動画リンク

/items と /changes に対して、 いくつかのリクエストを送り、レスポンスとログを確認していく 一連の様子を録画したデモ動画です。

test アプリで AWS API を叩くテストデモ

まだできていない部分と今後

「テストアプリ」から「共通APIクライアント」へ

test はあくまで検証用ですが、 ここで作った Retrofit 設定やエラー処理、ログ保存の仕組みは 他のアプリ(osakanakuwaetasazaesan など)でもそのまま使える 共通 API クライアントになり得ます。 今後は本番プロジェクトに組み込める形にリファクタリングしていく予定です。

  • 短期: API キー・トークンの安全な保存と、自動付与の仕組みを整える。
  • 中期: モジュール化して、複数アプリから同じクライアントを利用。
  • 長期: スキーマ定義(OpenAPI)と連動した自動生成クライアントに発展。

これからの改善点と開発計画

認証・モジュール化・モニタリングの 3 つの軸で改善を進めます。

  • Auth: Cognito / JWT など本番相当の認証方式の導入テスト。
  • Module: 「api-core」的な Gradle モジュールへの切り出し。
  • Monitoring: クライアント側レイテンシの計測と可視化。
17
18
19
20
21
22
23
24
25
26
27
28
29
30
認証付きAPIでの動作確認
共通クライアントモジュールへの切り出し
レイテンシ計測・可視化の追加

このプロジェクトを通して

感じていること

自分で設計した API を、実際の Android から叩いてみることで、 「ドキュメント上はきれいでも、実際にはこういうところで詰まる」というリアルな感覚が掴めました。 例えば、タイムアウト・エラー形式・認証ヘッダの付け忘れなど、 細かい部分はテストクライアントがないと気づきにくいところです。

また、ログをちゃんと残しておくことで、 後から「この時どんなリクエストを送ったんだっけ?」を再現できる安心感も得られました。 test アプリで得た知見は、今後のすべてのサーバ連携アプリの「下地」になっていくと思います。

今の自分へのメモ

  • ・API 設計とクライアント実装は必ずセットで考えること。
  • ・「テスト専用クライアント」を軽く作れる癖を今後も維持すること。

リファレンス & リンク

リファレンス

  • AWS API Gateway Developer Guide
  • AWS Lambda Developer Guide
  • Android Developers – Retrofit / OkHttp / Networking

リンク