Amplify Data をセットアップする
このガイドでは、Amplify Data をセットアップする方法を学びます。これには、TypeScript を使用してデータモデルを定義してリアルタイム API とデータベースを構築し、認可ルールで API をセキュアにすることが含まれます。また、カスタムユースケースにスケーリングするために AWS Lambda を使用することも紹介します。
開始する前に、以下が必要です:
Amplify Data を使うと、数分でデータベースによるセキュアで リアルタイム API を構築できます。TypeScript を使用してデータモデルを定義した後、Amplify はリアルタイム API をデプロイします。この API は AWS AppSync によって提供され、Amazon DynamoDB データベースに接続されています。認可ルールで API をセキュアにでき、AWS Lambda でカスタムユースケースにスケーリングできます。
データバックエンドを構築する
すでに npm create amplify@latest を実行している場合、amplify/data/resource.ts ファイルが表示されます。これは、データバックエンドを構成するための中心的な場所です。最も重要な要素は schema オブジェクトで、バックエンドのデータモデル (a.model()) とカスタムクエリ (a.query())、ミューテーション (a.mutation())、サブスクリプション (a.subscription()) を定義します。
import { a, defineData, type ClientSchema } from '@aws-amplify/backend';
const schema = a.schema({ Todo: a.model({ content: a.string(), isDone: a.boolean() }) .authorization(allow => [allow.publicApiKey()])});
// Used for code completion / highlighting when making requests from frontendexport type Schema = ClientSchema<typeof schema>;
// defines the data resource to be deployedexport const data = defineData({ schema, authorizationModes: { defaultAuthorizationMode: 'apiKey', apiKeyAuthorizationMode: { expiresInDays: 30 } }});すべての a.model() は、クラウドで以下のリソースを自動的に作成します:
- レコードを保存するための DynamoDB データベーステーブル
- レコードを作成、読取 (リスト/取得)、更新、削除するためのクエリおよびミューテーション API
- 各レコードが最初に作成されたとき、または最後に更新されたときを追跡するのに役立つ
createdAtおよびupdatedAtフィールド - レコードの作成、更新、削除イベントをサブスクライブするためのリアルタイム API
allow.publicApiKey() ルールは、API キーで認証されたすべての人が、todo を作成、読取、更新、削除できることを指定します。
これらのリソースをクラウドサンドボックスにデプロイするには、ターミナルで次の CLI コマンドを実行します:
npx ampx sandbox --outputs-out-dir <path_to_swift_project>アプリケーションコードをデータバックエンドに接続する
クラウドサンドボックスが起動して実行されている場合、API エンドポイント URL や API キーなどのデータバックエンドへの接続情報を含む amplify_outputs.json ファイルも作成されます。
フロントエンドコードをバックエンドに接続するには、以下を実行する必要があります:
- Amplify ライブラリを Amplify クライアント構成ファイル (
amplify_outputs.json) で構成する - Amplify ライブラリから新しい API クライアントを生成する
- エンドツーエンドの型安全性を備えた API リクエストを実行する
Finder から amplify_outputs.json ファイルを Xcode にドラッグアンドドロップします。
次に、Swift Package Manager を使用して Amplify Library for Swift を追加します。Xcode で File > Add Packages... を選択します。
次に、Amplify Library for Swift GitHub リポジトリ URL (https://github.com/aws-amplify/amplify-swift) を検索バーに入力して Enter を押します。
結果が読み込まれたら、Dependency Rule として Next Major Version を選択して、Add Package をクリックします。
プロジェクトに追加するライブラリを選択します。このチュートリアルでは、AWSAPIPlugin と Amplify を選択して、Add Package をクリックします。
次に、アプリの init() 関数をカスタマイズして、必要なプラグインを Swift アプリケーションに追加します:
import SwiftUIimport Amplifyimport AWSAPIPlugin
@mainstruct MyAmplifyApp: App {
init() { let awsApiPlugin = AWSAPIPlugin(modelRegistration: AmplifyModels()) do { try Amplify.add(plugin: awsApiPlugin) try Amplify.configure(with: .amplifyOutputs) print("Initialized Amplify"); } catch { // simplified error handling for the tutorial print("Could not initialize Amplify: \(error)") } }
var body: some Scene { WindowGroup { ContentView() } }}最後に、Swift アプリケーション用の GraphQL クライアントコードを生成します。Amplify Data は GraphQL を使用して、クエリ、ミューテーション、サブスクリプションリクエストを実行します。生成された GraphQL クライアントコードは、GraphQL リクエストを手動で作成してマップする必要なく、完全に型付きされた API リクエストを作成するのに役立ちます。
npx ampx generate graphql-client-code --format modelgen --model-target swift --out <path_to_swift_project>/AmplifyModelsAmplifyModels フォルダを Xcode プロジェクトにドラッグアンドドロップして、生成されたファイルを追加します。
バックエンドにデータを書き込む
TodoViewModel.swift という新しいファイルを作成して、createTodo 関数を次のコードで作成します:
import Foundationimport Amplify
@MainActorclass TodoViewModel: ObservableObject { func createTodo() { let todo = Todo( content: "Build iOS Application", isDone: false ) Task { do { let result = try await Amplify.API.mutate(request: .create(todo)) switch result { case .success(let todo): print("Successfully created todo: \(todo)") case .failure(let error): print("Got failed result with \(error.errorDescription)") } } catch let error as APIError { print("Failed to create todo: ", error) } catch { print("Unexpected error: \(error)") } } }}ContentView.swift を次のコードで更新します:
struct ContentView: View {
// Create an observable object instance. @StateObject var vm = TodoViewModel()
var body: some View { VStack { Button(action: { vm.createTodo() }) { HStack { Text("Add a New Todo") Image(systemName: "plus") } } .accessibilityLabel("New Todo") } }}アプリケーションを実行して、"Add a New Todo" ボタンをクリックすると、todo が作成されたことを示すログが表示されるはずです:
Successfully created todo: Todo(id: XYZ ...)バックエンドからデータを読み込む
次に、すべての todo をリストし、todo が追加された後に todo を再度取得します:
TodoViewModel.swift の listTodos 関数を更新して、to-do アイテムをリストします:
@MainActorclass TodoViewModel: ObservableObject {
@Published var todos: [Todo] = []
func createTodo() { /// ... }
func listTodos() { Task { do { let result = try await Amplify.API.query(request: .list(Todo.self)) switch result { case .success(let todos): print("Successfully retrieved list of todos: \(todos)") self.todos = todos.elements case .failure(let error): print("Got failed result with \(error.errorDescription)") } } catch let error as APIError { print("Failed to query list of todos: ", error) } catch { print("Unexpected error: \(error)") } } }}次に、UI コードを更新して todos を観察します。
import SwiftUIimport Amplify
struct ContentView: View { @StateObject var vm = TodoViewModel()
var body: some View { VStack { List(vm.todos, id: \.id) { todo in Text(todo.content ?? "") } // .. Add a new Todo button } .task { await vm.listTodos() } }}リアルタイム更新をサブスクライブする
リアルタイム更新を追加するには、Amplify Data のサブスクリプション機能を使用できます。これにより、アプリケーションの onCreate, onUpdate, および onDelete イベントをサブスクライブできます。この例では、新しい todo が追加されるたびにリストを追加します。
最初に、サブスクリプションを保存するプライベート変数を追加します。次に、init() イニシャライザーでサブスクリプションを作成し、subscribe() および cancel() 関数を追加します。
@MainActorclass TodoViewModel: ObservableObject { @Published var todos: [Todo] = []
private var subscription: AmplifyAsyncThrowingSequence<GraphQLSubscriptionEvent<Todo>>
init() { self.subscription = Amplify.API.subscribe(request: .subscription(of: Todo.self, type: .onCreate)) }
func subscribe() { Task { do { for try await subscriptionEvent in subscription { handleSubscriptionEvent(subscriptionEvent) } } catch { print("Subscription has terminated with \(error)") } } }
private func handleSubscriptionEvent(_ subscriptionEvent: GraphQLSubscriptionEvent<Todo>) { switch subscriptionEvent { case .connection(let subscriptionConnectionState): print("Subscription connect state is \(subscriptionConnectionState)") case .data(let result): switch result { case .success(let createdTodo): print("Successfully got todo from subscription: \(createdTodo)") todos.append(createdTodo) case .failure(let error): print("Got failed result with \(error.errorDescription)") } } }
func cancel() { self.subscription.cancel() }
func createTodo() { /// ... }
func listTodos() { /// ... }}次に ContentView.swift で、ビューが表示されるとき vm.subscribe() を呼び出します。表示されなくなるときに、サブスクリプションをキャンセルします。
struct ContentView: View { @StateObject var vm = TodoViewModel()
var body: some View { VStack { // ... } .onDisappear { vm.cancel() } .task { vm.listTodos() vm.subscribe() } }}アプリを再実行すると、新しい todo を作成するたびに新しい todo がリストに追加されるはずです。
結論
成功しました! Amplify Data で初めてのリアルタイム API とデータベースを作成する方法を学びました。
次のステップ
Amplify Data で発見することがたくさんあります。詳細については、以下をご覧ください: