🍎

Swiftでサーバーサイドを書いてAWS Lambdaで動かそう

2024/12/13に公開

サーバレスSwiftサーバーサイドへようこそ

さて、みなさん、サーバーサイドを書くときは何の言語で書いてますか?
Go?Node.js?Python?Ruby?Java?
今日はSwiftでサーバレスなサーバーサイド書いていきましょう。
Appleが開発した言語で、軽量で読みやすいのが特徴です。

使うもの

SwiftをAWS Lambdaでデプロイするのに使用するパッケージは以下がおすすめです。
https://swiftpackageindex.com/swift-server/swift-aws-lambda-runtime

このパッケージをより使いやすくするためのVSCode拡張もあります。今日はこちらを使っていきます。
https://github.com/swift-server-community/vscode-aws-lambda-swift-sam

やること

1. 必要ツールのインストール

以下のツールが必要になるので事前に入れていきましょう。Macユーザーならasdfで全部入ります。

2. VSCode拡張のインストール

VSCode AWS Lambda Swiftと入れて一番上の拡張を入れましょう。

3. ダッシュボードを開く

Cmd+Shift+Pでコマンドパレットを開き、Swiftと入れてダッシュボードを開きます。

4. プロジェクトの初期化

ここから先はダッシュボードの指示に従っていくだけです。
プロジェクト名を入れて
api-to-lambdaのテンプレートを選択し、Initializeボタンを押します。
こうすることでAPI GatewayとSwift Lambdaが立ち上がるSAMテンプレートが作られます。

5. コードを書く

ここまできたらいよいよSwiftを書いていきましょう。
Sources/HelloWorld/LambdaHandler.swiftに以下のようなコードを書きます。
今回は名前をおうむ返しするようなAPIを作っていきます。

LambdaHandler.swift
import AWSLambdaRuntime
import AWSLambdaEvents

@main
struct HelloWorld: SimpleLambdaHandler {

    func handle(_ event: APIGatewayV2Request, context: LambdaContext) async throws -> APIGatewayV2Response {

        let name = event.queryStringParameters?["name"] ?? "World"

        let body = "Hello Serverless Swift, \(name)!"

        return APIGatewayV2Response(statusCode: .ok, body: body)
    }
}

6. プロジェクトのビルド

コードが書けたら、Buildボタンを押しましょう。

7. ローカルでのInvokeテスト

テストに使うリクエストを定義するjsonを書き換えましょう
events/event.jsonの以下の部分です

events/event.json
# 14行目から17行目
  "queryStringParameters": {
    "parameter1": "value1,value2",
    "parameter2": "value"
  },
↓
# 以下に(好きな名前に)変更
  "queryStringParameters": {
   "name": "Yuki"
  },

ここまでできたらInvokeボタンを押します。

テスト用のDockerイメージのビルドが走り、成功すると以下のように出力されます。

8. プロジェクトをLambdaにデプロイ

AWSにデプロイされるリソース名を入力し、Deployボタンを押します。

デプロイされると以下のようにAPI GatewayエンドポイントのURLが表示され、リクエストできるようになります。

9. Lambda関数上でのInvokeテスト

最後に、Lambda関数が動くかもテストしてみましょう!

無事動いていますね。
以下のようなcurlコマンドでも確認できるはずです。

curl "https://{API GatewayのID}.execute-api.ap-northeast-1.amazonaws.com?name=Yuki"

まとめ

簡単にコードが書けて、簡単にデプロイができるサーバレスSwiftサーバーサイド、あなたもはじめてみませんか!!!






余談:この記事を書こうと思ったきっかけ

12/2-6までAWS re:invent2024に参加しておりました。
AI系や仕事に関わるEKSのsessionに参加する中で、ひとつ純粋な興味だけで参加したsessionがありました。
DEV334 | Swift, server-side, serverless
登壇していたAWSのPrincipal Developer AdvocateのSébastienさんがあまりにもSwiftサーバーサイドに愛があるsessionをしており、これは日本に帰ったらすぐに試したいなと思って、手を動かし、記事にしました!

re:invent滞在記はこちら

このsessionの登壇者がゲストのPodcastもすごく面白いのでぜひ!
https://www.youtube.com/watch?v=97AgMeaVUZs

Discussion