🚀

【更新版】とりあえず動かす!Cloud9 & React & Amplify & GraphQLの環境構築 (疎通確認編)

2023/11/06に公開

導入

前に書いた記事(とりあえず動かす!Cloud9 & React & Amplify & GraphQLの環境構築)の更新版です。
Cloud9にReactプロジェクトを作成してAmplifyを構築して疎通確認するまでの手順をまとめました。前回記事からの変更点は要点ごとに記事を分けたことです。

留意事項

  • リージョン:オレゴン(us-west-2)
    • リージョンは↑で統一しているので、以降の手順を進める際にはリージョンをオレゴン(us-west-2)で進めます
  • Reactのプロジェクト名:sampleapp
    • 全て↑のフォルダ配下で行います

関連する記事の全体

  1. IAM作成編
  2. Cloud9&React準備編
  3. Amplify初期化編
  4. GraphQL構築編
  5. function構築編
  6. 疎通確認 ← イマココ
  7. ホスティング編
  8. 後かたずけ編

構成

最終的な構成は以下の通りです。

ReactにApmlifyのライブラリを追加

前回までの記事で構築したReactプロジェクトsampleappの配下にターミナルで移動します。
React側でAmplifyの機能を利用するためのライブラリを追加します。追加はyarnで行います。

yarn add aws-amplify aws-amplify-react

ライブラリの追加後、sampleapp/src/index.jsに以下を追加します。

import { Amplify } from 'aws-amplify'
import config from "./aws-exports";
Amplify.configure(config)

追加後のindex.js全体は以下の通りです。

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import { Amplify } from 'aws-amplify'
import config from "./aws-exports";
Amplify.configure(config)

ReactDOM.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
  document.getElementById('root')
);

// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();

疎通用のApp.jsに書き換え

今回は疎通できればOKなので、sampleapp/src/App.jsを全て消して、以下に書き換えます。

import { Component } from 'react';
import './App.css';
import { API, graphqlOperation } from 'aws-amplify';
import * as query from './graphql/queries';
import * as subscriptions from './graphql/subscriptions';
import * as mutations from './graphql/mutations';

class App extends Component {

  state = {
    todos: [],
    statusCode: 0,
    returnMessage: '',
  }
  
  subscribeTodo = () => {
    try {

      API.graphql({
        query: subscriptions.onCreateTodo,
      }).subscribe({
        
        // 登録されたデータと既に登録済みデータを「登録と同時に」取得
        next: async() => {
          const listTodo = await API.graphql(graphqlOperation(query.listTodos));
          const tmpList = listTodo.data.listTodos.items;
          console.log(tmpList);
          var inputList = [];
          // 型誤りエラーのため明示的にinputTodoへ詰め替え
          tmpList.forEach((element) => {
            var inputTodo = {
              id : element.id,
              name : element.name,
              createdAt : element.createdAt,
              updatedAt : element.updatedAt
            };
            inputList.push(inputTodo);
          });
          const param = {
            msg: 'test',
            getList: inputList
          };

          // Lambdaの呼び出し
          const result = await API.graphql(graphqlOperation(query.sampleQuery, {param: param}));
          console.log(result.data.sampleQuery);
          this.setState({
            statusCode: result.data.sampleQuery.statusCode,
            returnMessage: result.data.sampleQuery.returnMessage,
            todos: result.data.sampleQuery.todoList,
          })

        },
        error: (err) => {
          console.log("subscription error : ", err);
        }
      });
    } catch (e) {
      console.log("createTodo error : ", e)
    }
  }

  createNewTodo = async() => {
    // 新規登録 mutation
    const todo = {
      name: "Front Random Number " + Math.floor(Math.random() * 100),
    }

    // 登録処理
    try {
      await API.graphql(graphqlOperation(mutations.createTodo, { input: todo }))

    } catch (e) {
      console.log("createTodo error : ", e)
    }
  }

  render() {
    this.subscribeTodo()
    return (
      <div className="App">
        <p>statusCode: {this.state.statusCode}</p>
        <p>returnMessage: {this.state.returnMessage}</p>
        <button onClick={this.createNewTodo}>Add Todo</button>
        <div>
          {this.state.todos.map((todo) => <p key={todo.id}>{todo.name} ({todo.createdAt})</p>)
          }
        </div>
      </div>
    );
  }
}

export default App;

後はyarnからReactを開始します。
(Cloud9の作成時にメモリを最小構成にした場合は、途中でメモリが上限に達して起動までに時間がかかります)

yarn start

「Preview」→「Preview Running Application」を選択してCloud9上でプレビューを表示します。

初期表示は↓のようになります。

「Add Todo」ボタンを押すと、上部にはLambdaからの返却メッセージが、下部にはDynamoDBへ登録した値の一覧がそれぞれ表示されます。(一覧といっても今回は1件だけですが)

subscriptionを利用してリアルタイムに即時反映を行なっているので、ボタン押下直後にもう一方のブラウザにも入力内容が反映されます。

AWSで任意の独自ドメインを使ってホスティングする場合には「ホスティング編」を参照してください。
作成した環境を削除する場合は「後かたずけ編」を参照してください。

参考サイト

https://dev.classmethod.jp/articles/react-amplify-appsync-dynamodb-tutorial/
https://qiita.com/G-awa/items/a5b2cc7017b1eceeb002
https://qiita.com/Junpei_Takagi/items/f2bc567761880471fd54

Discussion