AWS の開始方法

フルスタック React アプリケーションを構築する

AWS Amplify を使用してシンプルなウェブアプリケーションを作成する

モジュール 4: GraphQL API とデータベースを追加する

このモジュールでは、Amplify CLI とライブラリを使用して、アプリケーションに GraphQL API を設定および追加します。

概要

アプリケーションを作成して認証を設定したところで、API を追加しましょう。

このモジュールでは、Amplify CLI とライブラリを使用してアプリケーションに API を追加します。作成する API は Amazon DynamoDB (NoSQL データベース) を利用する GraphQL API であり、AWS AppSync (マネージド型 GraphQL サービス) を利用します。(GraphQL の概要については、GraphQL のウェブサイトを参照してください。)

作成するアプリケーションは、ユーザーがメモを作成、削除、一覧表示できるようにするメモアプリケーションです。この例から、CRUD + L (作成、読み取り、更新、削除、一覧表示) アプリケーションの人気のタイプの多くを構築する方法がよくわかります。

実行する内容

このモジュールでは、次のことを行います。
  • GraphQL API を作成してデプロイする
  • API と相互にやり取りするためのフロントエンドコードを記述する

主要な概念

API – 複数のソフトウェア仲介者間の通信およびインタラクションを可能にするプログラミングインターフェイスを提供します。

GraphQL – クエリ言語であり、アプリケーションの型付き表現に基づくサーバー側 API の実装。この API 表現は、GraphQL 型システムに基づくスキーマを使用して宣言されます。

 所要時間

15 分

 利用するサービス

実装

  • a.アプリケーションディレクトリのルートから次のコマンドを実行して、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)
    ? Do you want to edit the schema now? (Y/n) yes

    b.テキストエディタで GraphQL スキーマを開きます: /amplify/backend/api/<api_name>/schema.graphql

    次のスキーマでファイルを更新します。

    type Note @model @auth(rules: [ { allow: public } ] ){
      id: ID!
      name: String!
      description: String
    }

    c.ファイルを保存します。

  • API がローカルで設定されたので、今度はそれをデプロイします。これを行うには、Amplify push コマンドを実行します。

    amplify push --y

    これにより、次の 3 つのことが行われます。

    1. AWS AppSync API を作成する
    2. DynamoDB テーブルを作成する
    3. API のクエリに使用できる src/graphql にあるフォルダにローカル GraphQL オペレーションを作成する

    アカウントで GraphQL API をいつでも表示するには、次のコマンドを実行し、左側のナビゲーションペインで GraphQL API を選択します。

    amplify console api
    
    > Choose GraphQL
    

    アカウントで Amplify アプリケーションをいつでも表示するには、次のコマンドを実行します。

    amplify console
    ? Which site do you want to open? AWS console
  • バックエンドがデプロイされたので、ユーザーがメモを作成、一覧表示、削除できるようにするコードを記述しましょう。

    src/App.js を次のコードで更新します。

    import React, { useState, useEffect } from "react";
    import "./App.css";
    import "@aws-amplify/ui-react/styles.css";
    import { API } from "aws-amplify";
    import {
      Button,
      Flex,
      Heading,
      Text,
      TextField,
      View,
      withAuthenticator,
    } from "@aws-amplify/ui-react";
    import { listNotes } from "./graphql/queries";
    import {
      createNote as createNoteMutation,
      deleteNote as deleteNoteMutation,
    } from "./graphql/mutations";
    
    const App = ({ signOut }) => {
      const [notes, setNotes] = useState([]);
    
      useEffect(() => {
        fetchNotes();
      }, []);
    
      async function fetchNotes() {
        const apiData = await API.graphql({ query: listNotes });
        const notesFromAPI = apiData.data.listNotes.items;
        setNotes(notesFromAPI);
      }
    
      async function createNote(event) {
        event.preventDefault();
        const form = new FormData(event.target);
        const data = {
          name: form.get("name"),
          description: form.get("description"),
        };
        await API.graphql({
          query: createNoteMutation,
          variables: { input: data },
        });
        fetchNotes();
        event.target.reset();
      }
    
      async function deleteNote({ id }) {
        const newNotes = notes.filter((note) => note.id !== id);
        setNotes(newNotes);
        await API.graphql({
          query: deleteNoteMutation,
          variables: { input: { id } },
        });
      }
    
      return (
        <View className="App">
          <Heading level={1}>My Notes App</Heading>
          <View as="form" margin="3rem 0" onSubmit={createNote}>
            <Flex direction="row" justifyContent="center">
              <TextField
                name="name"
                placeholder="Note Name"
                label="Note Name"
                labelHidden
                variation="quiet"
                required
              />
              <TextField
                name="description"
                placeholder="Note Description"
                label="Note Description"
                labelHidden
                variation="quiet"
                required
              />
              <Button type="submit" variation="primary">
                Create Note
              </Button>
            </Flex>
          </View>
          <Heading level={2}>Current Notes</Heading>
          <View margin="3rem 0">
            {notes.map((note) => (
              <Flex
                key={note.id || note.name}
                direction="row"
                justifyContent="center"
                alignItems="center"
              >
                <Text as="strong" fontWeight={700}>
                  {note.name}
                </Text>
                <Text as="span">{note.description}</Text>
                <Button variation="link" onClick={() => deleteNote(note)}>
                  Delete note
                </Button>
              </Flex>
            ))}
          </View>
          <Button onClick={signOut}>Sign Out</Button>
        </View>
      );
    };
    
    export default withAuthenticator(App);

    当社のアプリケーションには 3 つの主な機能があります。

    1. fetchNotes - この関数は、API クラスを使用してクエリを GraphQL API に送信し、メモのリストを取得します。
    2. createNote - この関数も API クラスを使用して、ミューテーションを GraphQL API に送信します。主な違いは、この関数では、フォームデータを使用して新しいメモを作成できるように、GraphQL のミューテーションに必要な変数を渡しているという点です。
    3. deleteNote - createNote と同様に、この関数は変数とともに GraphQL ミューテーションを送信しますが、メモを作成する代わりにメモを削除します。
  • アプリをテストするには、start コマンドを実行します。

    npm start

まとめ

これで、メモアプリケーションができました。AWS Amplify を使用して、アプリケーションに GraphQL API を追加し、作成、読み取り、削除機能を設定しました。次のモジュールでは、アプリケーションにストレージサービスを追加します。

このページはお役に立ちましたか?

ストレージを追加する