GoとAlibaba Cloudのサーバーレス設定を使用したスケーラブルなモバイルバックエンドの構築

> 本記事は[こちらのブログ](https://www.alibabacloud.com/blog/building-scalable-mobile-backends-with-go-and-alibaba-clouds-serverless-setup_602241?spm=a2c65.11461433.0.0.4ee35355Z0vn2M)を参考にしています。
> 翻訳にはアリババクラウドの[ModelStudio](https://www.alibabacloud.com/en/product/modelstudio)([Qwen](https://www.alibabacloud.com/en/solutions/generative-ai/qwen))を使用しております。

# モバイルアプリのバックエンド開発におけるサーバーレスアーキテクチャとGo言語の活用

モバイルアプリのバックエンド開発には常にジレンマがあります。インフラの複雑さに圧倒されず、同時に高速な応答を維持するという課題です。ユーザーは瞬時に反応し、スムーズに拡張し、予期せぬトラフィックの急増にも耐えられるアプリを期待しています。しかし、サーバーをセットアップし、設定を微調整し、マーケティングキャンペーン中にシステムがクラッシュしないことを祈る日々に疲れていませんか？そんな中、サーバーレスアーキテクチャは新鮮な解決策を提供します。そして、Go（Golang）を使用している場合、<a href=https://www.alibabacloud.com/en/product/function-compute target=_blank>Alibaba CloudのFunction Compute</a>との組み合わせにより、サーバー管理から解放された開発が可能です。これはあなたのスタックを完全に壊して再構築することではありません。むしろ、机を片付けるようなものです — クリーンで効率的なコードを書くスペースを作り、その下にある煩雑な部分は他の人に任せましょう。あなたが複数のクライアント向けプロジェクトを管理するモバイルアプリ開発会社であれ、単独で作業する開発者であれ、このシンプルなアプローチには大きな魅力があります。

## なぜモバイルアプリのバックエンドにサーバーレスを選ぶべきなのか？

少し視野を広げて考えてみましょう。モバイルアプリのバックエンドには以下が必要です。
- 予測不可能なトラフィックの急増に対応できる
- 電池消費を抑えつつ素早く応答する
- 機能が追加・変更されていく中でもスムーズに対応できる

従来のサーバーベースのセットアップも機能しますが、多くの時間を費やすことがよくあります。特に小規模な更新を繰り返すとき、ステージング環境を管理したり、サポートリクエストに対応したりするのは大変です。サーバーレスはこれを一変させます。関数を書き、デプロイすれば、自動的にスケールします。完了です。深夜のサーバーパッチ作業も、容量計画のスプレッドシートも不要です。以下のような作業をスキップできます：
- 手動でのスケーリング
- パッチ適用
- サーバープロビジョニング
- 使用していないリソースへの支払い

実行時のみ課金されます。必要なときにだけ動作し、必要ないときは邪魔にならない。これがポイントです。

## Goについて話そう — なぜここでは最適なのか

Goはシンプルで高速、かつコンパイル型の言語です。これにより、関数は迅速に実行され、メモリを効率的に使用します。重いフレームワークやランタイム依存性を引きずることはありません。核心にすぐに到達できます。そして、プッシュ通知や製品リリース後に1秒間に数千回も呼び出される可能性がある場合、Goは高負荷下でも安定したパフォーマンスを発揮します。これにAlibaba CloudのFunction Computeを組み合わせれば、邪魔になることなく必要なときにだけ動作するバックエンドが完成します。

## 実例：シンプルなユーザーアプリケーションAPIの構築

例えば、モバイルアプリのプロファイル機能を構築するとしましょう。ユーザーがアプリを開き、自身のプロファイルをリクエストします。これを迅速かつステートレスに、数千のリクエストに対応できるようにしたい。そこでGoを使ってどのように実現するか見てみましょう。

### 1. Goハンドラを書くgo
package main

import (
    "context"
    "encoding/json"
    "fmt"
)

type UserRequest struct {
    UserID string `json:"user_id"`
}

type UserResponse struct {
    Name  string `json:"name"`
    Email string `json:"email"`
}

func Handler(ctx context.Context, event json.RawMessage) (string, error) {
    var req UserRequest
    if err := json.Unmarshal(event, &req); err != nil {
        return "", fmt.Errorf("bad request: %v", err)
    }

    resp := UserResponse{
        Name:  "Amina Khan",
        Email: "amina.khan@example.com",
    }

    output, _ := json.Marshal(resp)
    return string(output), nil
}

これはプレースホルダーのレスポンスです。本番環境ではデータベースや外部サービスからユーザー情報を取得するでしょう。

### Alibaba Cloudでのセットアップ

次に、<a href=https://www.alibabacloud.com/en/product/function-compute target=_blank>Function Compute</a>上でこれをセットアップする手順を見てみましょう。

#### 2. 関数をzip化してアップロード

ファイルを準備します：bash
zip -r function.zip main.go

Alibaba Cloudコンソールに移動：

- **Function Compute** に移動
- 新しいサービスを作成
- 新しい関数を追加
  - ランタイム: カスタムランタイム（Go用）
  - `function.zip` をアップロード
  - エントリポイントを `main.Handler` に設定
  - メモリとタイムアウトを設定（シンプルなAPIの場合、128–256MB、3秒のタイムアウトが適切）

デプロイ後、組み込みのテストツールを使用して動作確認を行います。

#### 3. API Gatewayを使用してAPIを公開

モバイルアプリは直接関数を呼び出せないので、REST APIが必要です。ここでAPI Gatewayが役立ちます。

- APIグループを作成
- 新しいAPIを追加：
  - メソッド: POST
  - パス: `/user/profile`
  - バックエンドタイプ: Function Compute
  - デプロイ済みの関数とリンク
  - 必要に応じてCORSを有効化
- 本番環境に公開

これで、アプリが呼び出せるパブリックエンドポイントが生成されます。URLは次のようになります：ruby
https://123456789.apigateway.cn-hangzhou.aliyuncs.com/prod/user/profile

### モバイルアプリからの接続

iOSアプリでPOSTリクエストを送信する例を見てみましょう。Swiftでは次のように簡単に実装できます：swift
let url = URL(string: "https://your-api-url")!
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")

let requestBody = ["user_id": "user-987"]
request.httpBody = try? JSONSerialization.data(withJSONObject: requestBody)

URLSession.shared.dataTask(with: request) { data, response, error in
    if let data = data {
        print(String(data: data, encoding: .utf8)!)
    }
}.resume()

AndroidやFlutterでも同様の方法が使えます。JSON形式のペイロードであれば、フロントエンドの技術に関係なくバックエンドは動作します。

### 監視とログ

問題は避けられません。タイポ、エッジケース、データベース接続の失敗など、可視性を持つことが重要です。<a href=https://www.alibabacloud.com/en/product/function-compute target=_blank>Function Compute</a>は<a href=https://www.alibabacloud.com/product/log-service target=_blank>Log Service</a>（SLS）と簡単に統合できます。これにより次のことが可能になります：
- 各関数呼び出しのログを表示
- メモリ使用量と実行時間を確認
- <a href=https://www.alibabacloud.com/help/en/cms/cloudmonitor-1-0/user-guide/create-an-alert-rule target=_blank>遅いまたは失敗したリクエストに対するアラートを設定</a>

関数をLog Projectに接続すると、ログが次のように流れ始めます：bash
Function execution started
Received user ID: user-987
Returning mock response
Function execution completed in 43ms

このような洞察は、後のデバッグ時間を大幅に節約します。

### 将来的に追加したい要素

基本的な部分ができたら、チームは通常以下の要素を拡張します：
- 認証: APIを保護するためにJWTやOAuthトークンを追加
- データベースアクセス: Alibaba Cloud RDSやMongoDB Atlasと統合
- レート制限: API Gatewayの組み込みコントロールを使用して悪用を防ぐ
-