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

Page updated Mar 20, 2024

Maintenance ModeYou are viewing Amplify Gen 1 documentation. Amplify Gen 1 has entered maintenance mode and will reach end of life on May 1, 2027. New project should use Amplify Gen 2. For existing Gen 1 projects, a migration guide and tooling are available to help you upgrade. Switch to the latest Gen 2 docs →

APIとデータベースをアプリに接続する

アプリケーションを作成および設定し、新しいAmplifyプロジェクトを初期化したので、機能を追加できます。最初に追加する機能はAPIです。

Amplify CLIはAPIカテゴリーの2つのタイプ、RESTとGraphQLの作成と相互作用をサポートしています。

このステップで作成するAPIは、AWS AppSync(マネージドGraphQLサービス)を使用するGraphQL APIであり、データベースはAmazon DynamoDB(NoSQLデータベース)になります。

GraphQL APIとデータベースを作成する

以下のコマンドを実行して、GraphQL APIをアプリに追加し、データベースを自動的にプロビジョニングします。アプリケーションディレクトリのルートから実行します:

amplify add api

以下で強調されているデフォルト値を受け入れます:

? Select from one of the below mentioned services: GraphQL
? Here is the GraphQL API that we will create. Select a setting to edit or continue Continue
? Choose a schema template: Single object with fields (e.g., "Todo" with ID, name, description)

CLIはこのGraphQLスキーマをテキストエディタで開くよう促します。

amplify/backend/api/your-api-name/schema.graphql

# This "input" configures a global authorization rule to enable public access to
# all models in this schema. Learn more about authorization rules here: https://docs.amplify.aws/react/build-a-backend/graphqlapi/customize-authorization-rules/
input AMPLIFY {
globalAuthRule: AuthRule = { allow: public }
} # FOR TESTING ONLY!
type Todo @model {
id: ID!
name: String!
description: String
}

生成されたスキーマはTodoアプリ用です。Todoタイプの@modelディレクティブに気付くでしょう。このディレクティブはAmplify GraphQL APIカテゴリーの一部です。

Amplify GraphQL APIは、カスタムGraphQLディレクティブを提供し、データモデルを定義、認可ルールを設定、サーバーレス関数をリゾルバーとして構成するなど、さらに多くのことができます。

@modelディレクティブで装飾されたGraphQLタイプは、タイプ(Todoテーブル)のデータベーステーブル、CRUD(作成、読み取り、更新、削除)およびリスト操作のスキーマ、そしてすべてを一緒に機能させるために必要なGraphQLリゾルバーをスキャフォールディングします。

コマンドラインからEnterキーを押してスキーマを受け入れ、次のステップに進みます。

APIをデプロイする

このバックエンドをデプロイするには、pushコマンドを実行します:

amplify push

各プロンプトに対して以下の値を選択します:

✔ Are you sure you want to continue? (Y/n) · yes
...
? Do you want to generate code for your newly created GraphQL API: Yes
? Choose the code generation language target: typescript
? Enter the file name pattern of graphql queries, mutations and subscriptions: src/graphql/**/*.ts
? Do you want to generate/update all possible GraphQL operations - queries, mutations and subscriptions: Yes
? Enter maximum statement depth [increase from default if your schema is deeply nested]: 2
? Enter the file name for the generated code: src/API.ts
✔ Are you sure you want to continue? (Y/n) · yes
...
? Do you want to generate code for your newly created GraphQL API Yes
? Choose the code generation language target javascript
? Enter the file name pattern of graphql queries, mutations and subscriptions src/graphql/**/*.js
? Do you want to generate/update all possible GraphQL operations - queries, mutations and subscriptions Yes
? Enter maximum statement depth [increase from default if your schema is deeply nested] 2
? Enter the file name for the generated code src/API.js

APIはライブになり、相互作用を開始できます。デプロイしたAPIには、投稿を作成、読み取り、更新、削除、および一覧表示するための操作が含まれています。

デプロイメントステータスを確認する

次に、以下のコマンドを実行してAmplifyのステータスを確認します:

amplify status

これはAmplifyプロジェクトの現在のステータスを表示します。現在の環境、作成されたカテゴリー、およびそれらのカテゴリーの状態が含まれます。以下のようになります:

Current Environment: dev
┌──────────┬───────────────────────┬───────────┬───────────────────┐
│ Category │ Resource name │ Operation │ Provider plugin │
├──────────┼───────────────────────┼───────────┼───────────────────┤
│ Api │ your-api-name │ No Change │ awscloudformation │
└──────────┴───────────────────────┴───────────┴───────────────────┘
AWSコンソールでデプロイされたAPIを確認する

AppSyncコンソールでGraphQL APIを任意の時点で表示するには、以下のコマンドを実行します:

amplify console api

Amplifyコンソールでアプリ全体を任意の時点で表示するには、以下のコマンドを実行します:

amplify console
ローカルモッキングでAPIをテストする

これをローカルでテストするには、mockコマンドを実行できます。注:モッキングをセットアップするための指示を参照してください。

フロントエンドを接続して先に進みたい場合は、次のステップにスキップできます。

amplify mock api

注: amplify mock apiにはJavaが必要です。

# If you have not already deployed your API, you will be walked through the following steps for GraphQL code generation
? Choose the code generation language target: javascript (or preferred target)
? Enter the file name pattern of graphql queries, mutations and subscriptions: src/graphql/**/*.js
? Do you want to generate/update all possible GraphQL operations - queries, mutations and subscriptions: Yes
? Enter maximum statement depth [increase from default if your schema is deeply nested] 2

これにより、ローカルポートでGraphiQLエクスプローラーが開きます。テスト環境から、クエリやミューテーションなど、さまざまな操作をローカルで試すことができます。

GraphiQLツールバーで、Use: User Poolを選択し、Todoを作成してみてください:

mutation CreateTodo {
createTodo(input: { name: "Test Todo", description: "Todo description" }) {
id
owner
name
updatedAt
createdAt
description
}
}

次に、認証をUse: API Keyに更新し、Todoのリストをクエリしてみてください:

query ListTodos {
listTodos {
items {
description
createdAt
id
owner
name
}
}
}

サーバーサイドレンダリング(SSR)付きAPI

このセクションでは、Next.js アプリケーションからTodoを一覧表示および作成する方法を作成します。これを行うには、サーバーから最新のTodoをフェッチしてレンダリングし、新しいTodoを作成します。

Amplify GraphQL API クライアントを生成する

サーバーサイドでGraphQL API リクエストを行うには、まず@aws-amplify/adapter-nextjs/apiからgenerateServerClientUsingCookiesをインポートし、プロジェクトのamplifyconfiguration.jsonconfigとして、next/headersからcookiesを使用してcookiesClientを生成する必要があります。

AmplifyはNext.js サーバーサイドランタイム用に2つのAPIクライアントを提供します。App RouterのReact Server ComponentsやServer Actionsなど、next/headersからcookiesが利用可能なユースケースでは、generateServerClientUsingCookiesを主に使用します。Pages RouterやMiddlewareなど、NextRequest/NextResponseが利用可能なユースケースでは、generateServerClientUsingReqResを使用します。サーバーサイドランタイムからデータに接続を確認して、どのAPIクライアントをどのユースケースで使用するかを詳しく確認してください。

src/app/page.tsxを開き、次のコードで置き換えます:

import { generateServerClientUsingCookies } from '@aws-amplify/adapter-nextjs/api';
import { cookies } from 'next/headers';
import config from '@/amplifyconfiguration.json';
const cookiesClient = generateServerClientUsingCookies({
config,
cookies
});
export default async function Home() {
return (
<div
style={{
maxWidth: '500px',
margin: '0 auto',
textAlign: 'center',
marginTop: '100px'
}}
>
<form>
<input name="name" placeholder="Add a todo" />
<button type="submit">Add</button>
</form>
</div>
);
}

Todoを送信するためのフォームを作成する

Next.jsでは、Server Actionを使用して、フォーム送信をサーバーサイドで処理できます。Server Actionを追加しましょう。これはデータをcreateTodo関数に送信します。呼び出されると、createTodocookiesClient.graphql(...)経由でGraphQL APIにGraphQL ミューテーションを送信し、次にnext/cacheからrevalidatePathを呼び出して、ページキャッシュを無効化し、最新のTodoをフェッチします。

src/app/page.tsxを次のコードで更新します:

import { generateServerClientUsingCookies } from '@aws-amplify/adapter-nextjs/api';
import { cookies } from 'next/headers';
// 1. 次の2つのインポートを追加します
import { revalidatePath } from 'next/cache';
import * as mutations from '@/graphql/mutations';
import config from '@/amplifyconfiguration.json';
const cookiesClient = generateServerClientUsingCookies({
config,
cookies
});
// 2. 新しいServer Actionを作成します
async function createTodo(formData: FormData) {
'use server';
const { data } = await cookiesClient.graphql({
query: mutations.createTodo,
variables: {
input: {
name: formData.get('name')?.toString() ?? ''
}
}
});
console.log('Created Todo: ', data?.createTodo);
revalidatePath('/');
}
export default async function Home() {
return (
<div
style={{
maxWidth: '500px',
margin: '0 auto',
textAlign: 'center',
marginTop: '100px'
}}
>
{/* 3. フォームのactionを新しい
create Todo Server Actionを使用するように更新します*/}
<form action={createTodo}>
<input name="name" placeholder="Add a todo" />
<button type="submit">Add</button>
</form>
</div>
);
}

Todoを一覧表示する

cookiesClient.graphql(...)を使用してGraphQL クエリも実行します。listTodosクエリを渡し、返されたアイテムをtodosに割り当ててから、それらを反復処理して<ul>タグに表示します。Todoがない場合は、「No todos, please add one」というメッセージを表示します。

src/app/page.tsxを次のコードで更新します:

import { generateServerClientUsingCookies } from '@aws-amplify/adapter-nextjs/api';
import { cookies } from 'next/headers';
import { revalidatePath } from 'next/cache';
import * as mutations from '@/graphql/mutations';
// 1. クエリをインポートとして追加します
import * as queries from '@/graphql/queries';
import config from '@/amplifyconfiguration.json';
const cookiesClient = generateServerClientUsingCookies({
config,
cookies
});
async function createTodo(formData: FormData) {
'use server';
const { data } = await cookiesClient.graphql({
query: mutations.createTodo,
variables: {
input: {
name: formData.get('name')?.toString() ?? ''
}
}
});
console.log('Created Todo: ', data?.createTodo);
revalidatePath('/');
}
export default async function Home() {
// 2. 追加のTodoをフェッチします
const { data, errors } = await cookiesClient.graphql({
query: queries.listTodos
});
const todos = data.listTodos.items;
return (
<div
style={{
maxWidth: '500px',
margin: '0 auto',
textAlign: 'center',
marginTop: '100px'
}}
>
<form action={createTodo}>
<input name="name" placeholder="Add a todo" />
<button type="submit">Add</button>
</form>
{/* 3. エッジケース&ゼロ状態&エラー状態を処理します*/}
{(!todos || todos.length === 0 || errors) && (
<div>
<p>No todos, please add one.</p>
</div>
)}
{/* 4. Todoを表示します*/}
<ul>
{todos.map((todo) => {
return <li style={{ listStyle: 'none' }}>{todo.name}</li>;
})}
</ul>
</div>
);
}

ローカルで実行する

次に、アプリを実行して、Todoを作成および表示する機能を備えた更新されたUIが表示されることを確認します:

npm run dev

APIを正常にデプロイし、アプリに接続しました。