Name:
interface
Value:
Amplify has re-imagined the way frontend developers build fullstack applications. Develop and deploy without the hassle.

クイックスタート

前提条件

始める前に、以下がインストールされていることを確認してください:

このクイックスタートガイドでは、Expo の TypeScript テンプレートを使用して Android または iOS 向けの Todo アプリケーションを構築する方法を説明します。

警告: React Native for Web はまだ公式にサポートされていませんが、公式サポートに向けて取り組んでいます。GitHub の issue #13918 で進捗を追跡しています。

Amplify は Expo SDK では利用できないネイティブモジュールが必要になりました。そのため、Expo Go はサポートされなくなりましたが、Expo は引き続き使用できます。Amplify v6 での Expo Go サポート終了について詳しく

Terminal
npx create-expo-app my_amplify_app -t expo-template-blank-typescript
cd my_amplify_app

ネイティブライブラリとプラットフォーム依存関係を呼び出すには、対象プラットフォームのフォルダを生成するために prebuild コマンドを実行する必要があります。

Terminal
npx expo prebuild

バックエンドの作成

AWS Amplify を始める最も簡単な方法は、create-amplify コマンドを使用して npm 経由で行うことです。ベースプロジェクトディレクトリから実行できます。

Terminal
cd my_amplify_app
npm create amplify@latest
? Where should we create your project? (.) # press enter

このコマンドを実行すると、現在のプロジェクトに Amplify バックエンドファイルが以下のファイル構成でscaffold されます:

├── amplify/
│ ├── auth/
│ │ └── resource.ts
│ ├── data/
│ │ └── resource.ts
│ ├── backend.ts
│ └── package.json
├── node_modules/
├── .gitignore
├── package-lock.json
├── package.json
└── tsconfig.json

バックエンドをデプロイするには、Amplify の開発者ごとのクラウドサンドボックスを使用します。この機能はチームの各開発者に個別のバックエンド環境を提供し、ローカル開発とテストに最適です。サンドボックス環境でアプリケーションを実行するには、以下のコマンドを実行します:

Terminal
npx ampx sandbox

認証の追加

初期のscaffoldには、amplify/auth/resource.ts ファイルに事前設定済みの認証バックエンドがすでに定義されています。メールアドレスとパスワードによるログインをサポートするように設定されていますが、Google、Amazon、Sign In With Apple、Facebook など、さまざまなログインメカニズムをサポートするように拡張できます。

ログイン体験を素早く起動する最も簡単な方法は、Amplify UI ライブラリで利用可能な Authenticator UI コンポーネントを使用することです。

Authenticator を使用するには、プロジェクトに以下の依存関係を追加する必要があります:

Terminal
npm add \
@aws-amplify/ui-react-native \
@aws-amplify/react-native \
aws-amplify \
@react-native-community/netinfo \
@react-native-async-storage/async-storage \
react-native-safe-area-context@^4.2.5 \
react-native-get-random-values \
react-native-url-polyfill

iOS をターゲットにする場合は、以下を実行して iOS の cocoapods をインストールします:

Terminal
npx pod-install

次に、App.tsx ファイルを以下のように更新します:

import React from "react";
import { Button, View, StyleSheet } from "react-native";
import { Amplify } from "aws-amplify";
import { Authenticator, useAuthenticator } from "@aws-amplify/ui-react-native";
import outputs from "./amplify_outputs.json";
Amplify.configure(outputs);
const SignOutButton = () => {
const { signOut } = useAuthenticator();
return (
<View style={styles.signOutButton}>
<Button title="Sign Out" onPress={signOut} />
</View>
);
};
const App = () => {
return (
<Authenticator.Provider>
<Authenticator>
<SignOutButton />
</Authenticator>
</Authenticator.Provider>
);
};
const styles = StyleSheet.create({
signOutButton: {
alignSelf: "flex-end",
},
});
export default App;

Authenticator コンポーネントは認証バックエンドの設定を自動検出し、認証バックエンドの認証フローに基づいて正しい UI 状態をレンダリングします。

ローカル環境でアプリケーションを再度実行してみましょう。ログイン体験が表示されるはずです。

データの追加

初期のscaffoldには、amplify/data/resource.ts ファイルに事前設定済みのデータバックエンドがすでに定義されています。デフォルトの例では、content フィールドを持つ Todo モデルが作成されます。

以下を追加するように変更しましょう:

  • ブール型の isDone フィールド。
  • Auth リソースを通じて認証されたオーナーが自分のレコードを「作成」、「読み取り」、「更新」、「削除」できる認可ルール。
  • defaultAuthorizationMode を更新して、ユーザー認証トークンで API リクエストに署名します。
import { type ClientSchema, a, defineData } from '@aws-amplify/backend';
const schema = a.schema({
Todo: a
.model({
content: a.string(),
isDone: a.boolean()
})
.authorization(allow => [allow.owner()])
});
export type Schema = ClientSchema<typeof schema>;
export const data = defineData({
schema,
authorizationModes: {
defaultAuthorizationMode: 'userPool'
}
});

次に、To-do アイテムを作成、一覧表示、削除するための UI を実装しましょう。src フォルダを作成し、その中に TodoList.tsx という新しいファイルを作成します。このページには Todo アイテムの作成、読み取り、更新、削除に関する情報が含まれます。

以下のコードをファイルにコピーして貼り付けます:

import { useState, useEffect } from "react";
import { View, Button, Text, StyleSheet, FlatList } from "react-native";
import { generateClient } from "aws-amplify/data";
import type { Schema } from "../amplify/data/resource";
import { GraphQLError } from "graphql";
const client = generateClient<Schema>();
const TodoList = () => {
const dateTimeNow = new Date();
const [todos, setTodos] = useState<Schema["Todo"]["type"][]>([]);
const [errors, setErrors] = useState<GraphQLError>();
useEffect(() => {
const sub = client.models.Todo.observeQuery().subscribe({
next: ({ items }) => {
setTodos([...items]);
},
});
return () => sub.unsubscribe();
}, []);
const createTodo = async () => {
try {
await client.models.Todo.create({
content: `${dateTimeNow.getUTCMilliseconds()}`,
});
} catch (error: unknown) {
if (error instanceof GraphQLError) {
setErrors(error);
} else {
throw error;
}
}
};
if (errors) {
return <Text>{errors.message}</Text>;
}
const renderItem = ({ item }: { item: Schema["Todo"]["type"] }) => (
<TodoItem {...item} />
);
return (
<View style={{ flex: 1 }}>
<FlatList
data={todos}
renderItem={renderItem}
keyExtractor={(item) => item.id}
ItemSeparatorComponent={() => (
<View style={styles.listItemSeparator} />
)}
ListEmptyComponent={() => <Text>The todo list is empty.</Text>}
style={styles.listContainer}
></FlatList>
<Button onPress={createTodo} title="Create Todo" />
</View>
);
};
const TodoItem = (todo: Schema["Todo"]["type"]) => (
<View style={styles.todoItemContainer} key={todo.id}>
<Text
style={{
...styles.todoItemText,
textDecorationLine: todo.isDone ? "line-through" : "none",
textDecorationColor: todo.isDone ? "red" : "black",
}}
>
{todo.content}
</Text>
<Button
onPress={async () => {
await client.models.Todo.delete(todo);
}}
title="Delete"
/>
<Button
onPress={() => {
client.models.Todo.update({
id: todo.id,
isDone: !todo.isDone,
});
}}
title={todo.isDone ? "Undo" : "Done"}
/>
</View>
);
const styles = StyleSheet.create({
todoItemContainer: { flexDirection: "row", alignItems: "center", padding: 8 },
todoItemText: { flex: 1, textAlign: "center" },
listContainer: { flex: 1, alignSelf: "stretch", padding:8 },
listItemSeparator: { backgroundColor: "lightgrey", height: 2 },
});
export default TodoList;

上記のコードでは、ランダムな Todo アイテムを作成してリストに表示できます。完了としてマークしたり、リストを更新したり、その操作を元に戻したりすることができます。アイテムを削除することもできます。リスト内の各変更はサブスクリプションで監視され、すぐに画面に表示されます。

コードをより詳しく見てみると:

  • generateClient はモデルのために必要なファイルとフォルダを生成します。
  • TodoList コンポーネントにはサブスクリプション、作成操作、作成されたアイテムを保持するリストが含まれます。
  • TodoItem には各 Todo アイテムに関する情報が含まれます。

最後に、App.tsxApp コンポーネントを以下のように更新します:

const App = () => {
return (
<Authenticator.Provider>
<Authenticator>
<SafeAreaView style={styles.container}>
<SignOutButton />
<TodoList />
</SafeAreaView>
</Authenticator>
</Authenticator.Provider>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
padding: 8,
},
signOutButton: {
alignSelf: "flex-end",
},
});

アプリケーションを実行すると、以下の動作が確認できるはずです:

プロジェクトのクリーンアップのためにサンドボックス環境を終了できます。

クラウドへの変更の公開

クラウドへの変更の公開にはリモート git リポジトリが必要です。Amplify はフルスタックブランチデプロイメントを提供しており、フィーチャーブランチからインフラストラクチャとアプリケーションコードの変更を自動的にデプロイできます。詳細については、フルスタックブランチデプロイメントガイドをご覧ください。

🥳 成功

以上です!AWS Amplify でフルスタックアプリの構築に成功しました。Amplify の使い方についてさらに詳しく学びたい場合は、Amplify の仕組みの概念ガイドをご覧ください。