🉐

Cloud Runで始めるServer Side Swift

2023/05/06に公開

ずっとSwiftでサーバーサイドの開発をしたいと思いながら数年。Cloud FunctionsがV2に対応したことや、Swift Foundationがリリースされたことや、EventarcがFirestoreに対応したことや、ChatGPTによってコーディングが加速したことなどなどの理由でServerSideSwiftにも本格的に参入しても良さそうだなと思ったのでやってみました。

Firebase + Cloud Run + Vaporで開発を進めます。

Vapor

まずはVaporに触れてみましょう。

https://vapor.codes/

Vaporは、Swift言語で記述されたWebアプリケーションフレームワークです。 Vaporは、Webアプリケーションを構築するための多数のツールと機能を提供し、高速でスケーラブルなアプリケーションの開発を支援します。

Vaporは、Swift言語のAsync/Await機能を活用して非同期処理をサポートし、高速なネットワーク通信を実現します。また、VaporはHTTP/2やWebSocketsといった現代的なWeb技術をサポートしており、リアルタイムなWebアプリケーションの構築も容易に行えます。

Vaporは、開発者が柔軟にコントロールできるミドルウェア機能を提供し、カスタマイズ性に優れています。さらに、Vaporは、軽量で直感的なルーティングシステム、リクエスト/レスポンスデータの処理、セキュリティ機能など、Webアプリケーションの開発に必要な機能を備えています。

Vaporは、オープンソースで開発されており、コミュニティによってアクティブにサポートされています。また、Vaporは、Swift言語の実行速度の高さや、安全性の高さ、コードの可読性のよさなど、Swift言語の特徴を活かしたWebアプリケーション開発を可能にしています。

Vaporを使った開発

Vaporをインストールして開発を始めましょう。

brew install vapor

次にプロジェクトを作りましょう。

vapor new [your_project] -n
cd [your_project]

あとはビルドするだけでサーバーが起動するはずです。

swift build

Package.swiftを開くとXcodeで開発を行うことができます。

Cloud Run

次にCloud Runについて触れていきましょう。

Cloud Runは、Google Cloud Platform(GCP)上で実行されるマネージドコンテナサービスで、Dockerコンテナを使用して、任意の言語やフレームワークで記述されたWebアプリケーションやAPIを簡単にデプロイできるようにするものです。Cloud Runは、アプリケーションのスケーリング、負荷分散、自動管理を容易にし、高可用性、スケーラビリティ、セキュリティを提供します。

Cloud Runは、ユーザーが自分のDockerイメージを使用することができるほか、Google Cloud Buildを使用して、アプリケーションのDockerイメージを自動的にビルドしてデプロイすることもできます。Cloud Runは、コンテナの最初のリクエスト時に起動し、その後は必要に応じてスケールアウトまたはスケールインするため、リクエストの処理に必要なリソースだけを使用することができます。これにより、無駄なリソースの消費を抑えることができ、コスト効率の良いアプリケーション開発が可能となります。

Cloud Runは、HTTPリクエストとともにAPIキーを使用してアクセス制御を行うほか、アプリケーションを保護するためにIAMやセキュリティ機能を提供しています。また、Cloud Runは、Cloud MonitoringやCloud LoggingといったGoogle Cloud Platformの機能と統合されているため、アプリケーションのパフォーマンス監視やログの収集が容易に行えます。

Cloud Runは、サーバーレスアーキテクチャの一種であるため、開発者はサーバーの管理や設定を気にする必要がなく、アプリケーションの開発に集中できます。また、Cloud Runは、GCP上で動作する他のサービスとのシームレスな統合が可能であり、開発者にとって非常に使いやすいサービスです。

gcloud

Cloud Runを扱うために必要なgcloudについて少し説明しておきます。

gcloudは、Google Cloud Platform(GCP)のコマンドラインツールであり、GCP上でのリソースの管理や操作を行うために使用されます。gcloudコマンドラインツールを使用すると、ターミナル上でコマンドを入力することで、GCP上の仮想マシン、ストレージ、ネットワーク、データベース、アプリケーションなどのリソースを管理することができます。

gcloudコマンドラインツールは、GCPのAPIと統合されており、APIを呼び出してリソースを管理します。gcloudコマンドラインツールを使用すると、GUIを使用するよりも高度な機能を実行することができ、自動化やスクリプト化することもできます。

gcloudコマンドラインツールには、以下のような機能があります。

  • リソースの作成、編集、削除、表示
  • 仮想マシン、ストレージ、ネットワークの管理
  • GCPプロジェクトの管理
  • アプリケーションのデプロイ、バージョン管理
  • クラウド上でのビルド、テスト、デバッグ
  • 監視、ログの表示
    gcloudコマンドラインツールは、Google Cloud SDKに含まれています。Google Cloud SDKは、GCPの開発に必要なすべてのツールを提供し、gcloudコマンドラインツールの他に、Google Cloud ConsoleやGoogle Cloud API Client Librariesなどが含まれています。

gcloud CLI をインストールする

gcloudの入手はこちらを参考にしてください。

https://cloud.google.com/sdk/docs/install?hl=ja

gcloudの初期化

gcloudについては取り急ぎ下記のコマンドを覚えてください。

gcloudの初期化

gcloud init

デフォルトのプロジェクトを設定する

gcloud config set project [PROJECT_ID]

認証情報を設定

gcloud auth login

Docker

Cloud Runで利用するDockerについても触れておきます。

Dockerは、アプリケーションをコンテナと呼ばれる軽量な仮想環境にパッケージ化するためのオープンソースプラットフォームです。Dockerコンテナは、アプリケーションの実行に必要なすべてのコンポーネント、ライブラリ、依存関係を含む、完全に独立した実行環境を提供します。

Dockerコンテナは、ほかのコンピュータやクラウド環境に移植することが容易であり、同じアプリケーションをさまざまな環境で実行することができます。また、Dockerによって、複数のコンテナを使用して複雑なアプリケーションを構築することができ、異なるサービスやコンポーネントを個別のコンテナとして実行することができます。

Dockerは、ユーザーがDocker Hubと呼ばれるレジストリから、Dockerコンテナイメージをダウンロードして使用することができます。Docker Hubには、オープンソースのDockerコンテナイメージが多数公開されており、自分でDockerコンテナイメージを作成する必要がない場合は、Docker Hubからコンテナイメージをダウンロードすることができます。

Dockerは、Linux、macOS、Windowsなどのさまざまなプラットフォームで使用することができます。Dockerは、オープンソースであり、Docker Inc.によって開発、サポートされています。

Dockerのインストール

Dockerのインストールはこちらから行ってください。
ちなみにインストールしなくても今回のCloud Runは利用できます。それについては後で説明します。

https://www.docker.com/get-started/

コンテナとイメージ

イメージ(Image)

Dockerイメージは、Dockerコンテナを実行するために必要なすべてのファイル、設定、依存関係を含む静的な状態のスナップショットです。つまり、イメージはDockerコンテナを生成するためのテンプレートのようなもので、Dockerイメージを使用して複数の同じ設定のコンテナを作成することができます。イメージは、Dockerfileを使用して作成されることが一般的です。

コンテナ(Container)

Dockerコンテナは、Dockerイメージを実行した際に生成される実行可能なプロセスです。つまり、イメージをベースにして、実際にアプリケーションが動作する仮想環境を生成します。コンテナは、イメージから生成されるため、同じイメージを使用して複数の同じ設定のコンテナを作成することができます。コンテナは、Dockerイメージとは異なり、動的な状態を持ち、実際のアプリケーションの実行環境となります。

つまり、Dockerイメージは、コンテナを生成するための静的なテンプレートであり、コンテナは、イメージをベースにして生成される実行可能なプロセスです。Dockerコンテナを起動すると、Dockerエンジンは、イメージから新しいファイルシステムを生成し、そのファイルシステムを基にして新しいコンテナを生成します。

Cloud RunにVaporをデプロイ

Cloud Runへのデプロイ方法を二つ紹介します。
一つ目はgcloudを使ってコマンド行う方法です。こっちの方が楽ですが遅くて時間がかかったので僕は開発では二つ目の方法でやってました。

gcloudでビルドとデプロイ

このコマンドは、Google Cloud Platformでビルドを実行し、DockerイメージをGoogle Container Registryにアップロードします。

gcloud builds submit --tag gcr.io/[project id]/[image]

このコマンドは、Google Cloud PlatformでCloud Runサービスをデプロイするためのコマンドです。

gcloud run deploy [name] --image [Registry] --region [Region] --platform managed --allow-unauthenticated
args 説明
[name] デプロイするサービスの名前を指定します。この例では、"api"という名前のサービスをデプロイします。
--image [Registry] デプロイするDockerイメージを指定します。[Registry]には、DockerイメージがプッシュされたコンテナレジストリのURLを指定します。
--region [Region] デプロイするCloud Runサービスのリージョンを指定します。
--platform managed Cloud Runをマネージドプラットフォームとしてデプロイするためのオプションです。このオプションを指定することで、アプリケーションのスケーリングや管理が自動化されます。
--allow-unauthenticated 認証を必要としない場合にアクセスを許可するためのオプションです。このオプションを指定することで、サービスに認証されていないユーザーからのリクエストを受け付けることができます。

Dockerでビルドとデプロイ

  1. ローカルでアプリケーションを開発する。
  2. Dockerイメージをビルドする。
  3. コンテナレジストリにイメージをプッシュする。
  4. Cloud Runにデプロイする。

ローカルでアプリケーションを開発する。
まず、ローカルでアプリケーションを開発します。このとき、Dockerコンテナとして実行するために、アプリケーションをコンテナにパッケージ化する必要があります。アプリケーションの言語やフレームワークに応じて、Dockerfileを作成して、必要なライブラリや依存関係を含むDockerイメージをビルドすることができます。

Dockerイメージをビルドする。
アプリケーションをコンテナにパッケージ化したら、Dockerイメージをビルドします。Dockerfileを使用して、必要なライブラリや依存関係を含むDockerイメージをビルドします。

docker build -t [IMAGE_NAME] .

コンテナレジストリにイメージをプッシュする。
Dockerイメージをビルドしたら、それをコンテナレジストリにプッシュすることができます。Docker HubやGoogle Container Registryなどのコンテナレジストリを使用することができます。

docker push [IMAGE_NAME]

Cloud Runにデプロイする。
最後に、Cloud RunにDockerイメージをデプロイします。Cloud Runは、Dockerコンテナのデプロイに対応しています。

デプロイ方法は先に説明したコマンドです。

gcloud run deploy [name] --image [Registry] --region [Region] --platform managed --allow-unauthenticated

Firebaseと統合する

ここまででVaporをCloud Runにデプロイする方法を説明したました。
ここからはCloud RunをFirebaseに統合していきます。

まずはfirebase-toolsについて説明します。
https://firebase.google.com/docs/cli?hl=ja

firebase-tools

Firebaseは、Googleが提供するモバイルアプリケーションのバックエンドサービスであり、データベース、認証、ストレージ、クラウド関数などの機能を提供しています。Firebase CLIと呼ばれるツールを使用すると、Firebaseプロジェクトの管理や開発を容易にすることができます。firebase-toolsは、Firebaseプロジェクトを管理するために使用されます。

インストールが完了すればログインをしてください。

firebase login

Firebaseプロジェクトを作る

次にFirebaseのプロジェクトを作りましょう。
今回はHostingと統合するので次のコマンドでプロジェクトを作ってください。

firebase init hosting

Firebase Hostingの設定ファイルであるfirebase.jsonファイルを編集します。firebase.jsonファイルには、Firebase Hostingの設定が含まれています。

firebase.jsonファイルに、以下のような設定を追加します。

{
  "hosting": {
    "public": "public",
    "rewrites": [
      {
        "source": "**",
        "run": {
          "serviceId": "cloudrun-service",
          "region": "us-central1"
        }
      }
    ]
  }
}

この設定は、Firebase Hostingのリライト機能を使用して、特定のパスのリクエストをCloud Runサービスに転送するようにします。serviceIdとregionには、Cloud RunサービスのIDとリージョンを指定します。

firebase deploy

これでFirebaseと連携は完了です。

Discussion