【AWS初学者向け】AWS Amplify Studioをさわってみた

#はじめに
[システムアイ Advent Calendar 2021](https://qiita.com/advent-calendar/2021/systemi) 23日目の記事です。

2021年12月2日に発表されたAWSの新サービス『AWS Amplify Studio』（以降Amplify Studio）がテック系メディアを中心に話題になっていますね。
従来の『Amplify Admin UI』の後継ということですが特徴としては、

+ フルスタックのウェブアプリとモバイルアプリを構築するためのビジュアル開発環境
+ ブラウザのWebデザインツール[『Figma』](https://www.figma.com/)のデザインからReactコードを生成

などがあるようです。

「FigmaからReactコード生成」できる点が気になる、とAWSもReactも経験ほぼゼロな私が公式チュートリアルを参考に『Amplify Studio』をさわってみました。

なお、『Amplify Studio』については他のQiita Advent Calendarでも複数取り上げられていますが、本記事では**“できるだけ丁寧に”**心がけて解説しています。

ページは長いですが画像が多いのでさらっと読んでいただけます。（というかほぼ画像）

###対象の読者
「公式のチュートリアルがよくわからない」
「（話題の）Amplify Studioって開発の現場で使えるの？」
「知らない単語が多いと読む気がなくなる」

という、（私のような）AWS初学者の方を対象としています。

:::note info
チュートリアルではReactコードを生成しますが、Reactの知識は不要です。
:::

#チュートリアル

チュートリアルの大まかな流れとしては以下の通りです。

1. Amplify Studioの環境構築
2. [Figma](https://www.figma.com/)⇒Amplify Studio連携
3. データモデル作成
4. UIコンポーネントにデータバインド
5. Reactコードのダウンロード

なお、以降のチュートリアルはおおむねAWSの[Amplify Docs](https://docs.amplify.aws/console/)に沿った内容となっており、適宜補足して解説しています。AWS初学者以外の方で英語のドキュメントが読める方は直接参照してください。

それでは行きましょう。

###Amplify Studioの環境構築
まずはhttps://aws.amazon.com/jp/console/ からAWSコンソールにログインします。

右上の「コンソールにサインイン」をクリックします。
![00_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/ae99e40c-1120-36da-2b71-8659cc4209e4.jpeg)

アカウント情報を入力して「サインイン」をクリックします。
![00.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/6b1666d8-f94c-099f-e62d-db20f49f7cbb.jpeg)

画面上部の検索窓に「amplify」を入力し、「AWS Amplify」を選択します。
![01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/ff25f5c2-2550-7b5d-fe22-9072f7176064.jpeg)

画面下部にある『Amplify Studio』で「使用を開始する」をクリックします。
![02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/c6a912f4-bd1a-c8c8-a186-8fdf8de602c0.jpeg)

任意のアプリケーションの名前を入力し、「Confirm deployment」をクリックします。
![03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/7ef227b6-646b-9852-e533-bf848d7378f8.jpeg)

デプロイが開始されます。
![04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/72726deb-fc93-27cd-0400-5c8d48c369b1.jpeg)

（通常は[^1]）5分ほど待つと、デプロイされたアプリケーションの画面が表示されます。
![09_IAM変更しても変わらず、できていたものを使ってみる.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/c100829f-1c24-bc11-cdfb-5181a6f91823.jpeg)

画面中央の「Backend environments」タブをクリックし、「Get started」をクリックします。
![10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/3ca3c317-7b70-52db-e398-1bdc57bc165c.jpeg)

2分ほど待ちます。
![11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/7faa3456-5154-1c8f-dd28-b26918c8099a.jpeg)

完了すると以下画面になるため、「Studio を起動する」をクリックします。
![12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/393cee71-43da-3c10-3810-d2ccc5ea93ac.jpeg)

###Figma⇒Amplify Studio連携
ここからはAmplify Studioをさわっていきます。

この章ではFigmaのデザインをAmplify Studioに取り込みます。今回は『AWS Amplify UI Kit』というテンプレートを使用しますが、もちろんご自身で作成されたものを取り込むこともできます。

まずは画面左側の「UI Library（Preview）」をクリックします。
![13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/632962a1-0e7d-5637-4f1f-761ce87f8ef2.jpeg)

「Use our Figma template」をクリックしてFigmaにGoします。
![14.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/c747018d-5993-2356-8e49-60feab97cfb0.jpeg)

「Duplicate」からAWS Amplify UI Kitを取り込み、URLをコピーします。

:::note warn
Figmaのアカウントが必要になります。
:::
![15_figma.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/823e1a9a-4d8a-77e6-8a76-82778342ddac.jpeg)

FigmaのURLを貼り付け、「Continue」をクリックします。
![15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/5b010643-2242-3a0d-9a12-c73251e331e8.jpeg)

「Allow access」をクリックしてFigma⇒Amplify Studio間の連携を許可します。
![16.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/1ef32003-724b-d58d-1a9e-6fd8177982d7.jpeg)

「Accept all」をクリックしてすべて取り込みます。
![17.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/576272f4-bb58-2a7a-6756-6b0285990806.jpeg)

Successfullyが出ているので、取り込み成功。
Figmaのデザインと違うようにも見えますが…
![18.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/8b836cb0-2b70-5d59-92c4-42912733f713.jpeg)

FigmaのPages > My Componentsが取り込まれているようです。
![19.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/f3b57da9-3da1-5018-6272-e8ebe8020081.jpeg)


###データモデル作成
画面左側の「Data」をクリックし、Data modelingに進みます。
![24.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/a26b934b-ffbd-5042-a944-0f2e245f314f.jpeg)

「Add model」をクリックし、フィールド名（Field name）と型（Type）を入力。
ここでは以下の通り入力しました。
　モデル名：`Home`
　Field name：`id`　Type：`id`
　Field name：`address`　Type：`String`
　Field name：`price`　Type：`String`
　Field name：`image_url`　Type：`String`

「Save and deploy」をクリックします。
![25.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/e478e919-8fa8-1494-286c-f31a5d9d6034.jpeg)

「Deploy」をクリックします。
![26.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/9b14617e-f91e-33dc-440a-09163d8a240f.jpeg)

デプロイ中です。画面右上の「Deploying」からデプロイの進行状況が確認できます。
![27.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/09676296-4d45-bd2d-f4b6-ade7755d7d71.jpeg)

Deployedと出ているので、問題なくデプロイできたようです。
![28.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/c903d193-a48c-3b97-9a66-47b3a1c217d7.jpeg)

###サンプルデータ作成
こちらの章では作成したデータモデルにサンプルデータを流し込めます。

画面左側から「Content」をクリックします。
![29.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/384f07bd-0587-7c89-6241-4b2db7411c8c.jpeg)

「Actions」から「Auto-generate data」をクリックします。
![30.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/8b08d3ec-87e6-bd33-1d94-a63af3b63057.jpeg)

自動で生成するデータを決めます。
ここでは以下のように入力しました。
　How many rows～：`5`
　Field Name：`address`　Range/setting：`Street address`

「Generate data」をクリックします。
![32.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/15453116-1d67-fac8-1409-322c3ae58054.jpeg)

自動生成されたレコードが確認できますね。

:::note warn
画像についてはサーバ上に公開していないため、後続のデータバインドでも画像はリンク切れ状態になります。表示切れさせない場合は実際にサーバにある画像URLの指定が必要になります。
:::

![33.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/f01881f4-0120-85e8-2168-65d03b10883a.jpeg)

###UIコンポーネントにデータバインド
この章ではFigmaで取り込んだコンポーネントと作成したデータ項目を紐づけます（データバインド）。

画面左側の「UI Library」をクリックします。
![34.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/a940412b-506a-5b16-3faf-c176b985ab27.jpeg)

「CardB」を選択し、「Configure」をクリックします。
ここでは「CardB」コンポーネントに対して、作成した「Home」モデルを紐づけます。
![35.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/688c5b4a-71f0-c80f-e6e3-41099b49455e.jpeg)

画面右側の「Add prop」をクリックします。
![36.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/5ad280bf-3511-4f2d-3607-abe8a955f268.jpeg)

親コンポーネントを設定します。
ここでは以下の通り入力しました。
　Name：`home`
　Type：`Home`

![37.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/f7f25195-5002-bc0b-fa43-7dd25210f798.jpeg)

「Elements tree」から「$99 USD」を選択、「Add prop」をクリックして子コンポーネントのプロパティを設定します。
ここでは以下の通り設定しました。
　Prop：`label`
　Value：`Price: $`　 + ：`home.price`
![38.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/6cab6142-c5c6-41c2-afa1-b810c472742b.jpeg)

先ほどと同様に「Elements tree」から「image」を選択、「Add prop」をクリックして子コンポーネントのプロパティを設定します。
ここでは以下の通り設定しました。
　Prop：`src`
　Value：`home.image_url`

次に「Create collection」をクリックします。
コレクションにより、コンポーネントを使ってレイアウトした画面を別のコンポーネントとして簡単に作成できます。
![39.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/a10c433c-f373-5894-f088-829ae25cef9c.jpeg)

コレクション名を入力し、「Create」をクリックします。
![40.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/3802be8f-9a63-dd9d-482f-2a3b34cf497d.jpeg)

データバインドしたコンポーネントが表示されました。
![41.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/7ca1d9c9-f4f5-b1ae-08c4-895db1ebc3b9.jpeg)

コレクションのレイアウトを変更します。
ここでは以下の通り設定しました。
　Type：`Grid`
　Columns：`3`
　margin：`10px`

![41_collection.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/17497992-9c4a-5f06-ec2f-01f2a634d9fe.jpeg)


###Reactコードのダウンロード
ここからはローカル環境を構築し、Amplify Studioで作成したReactコードをpull（ダウンロード）します。

なお、ローカルPCにNode.jsがインストールされていることが前提となります。
まだインストールされていない場合は、下記の記事などを参考にインストールしてください。
[Node.jsをインストールする](https://qiita.com/sefoo0104/items/0653c935ea4a4db9dc2b
)	

また、エディターはVisual Studio Codeを使用しています。こちらは必須ではありませんが、必要に応じてインストールしてください。

参考までに私のNode.js、npmのバージョンは下記の通りです。
　Node.js：v16.13.1
　npm：8.1.2
![44.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/789d141e-ea2b-8c4c-b3d0-9fedeef073e4.jpeg)

まずは`npx create-react-app`コマンドでReactアプリを用意します。

```
npx create-react-app studio-demo
```

![51.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/e4c8fa54-2662-bc53-2484-5b7d1ad5fbd8.jpeg)

アプリ作成後の画面。
![52.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/1c74ad4c-be0b-5fe5-aab2-ee1c7280d258.jpeg)

Amplify Studioに戻ります。
![54.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/6679ec0b-8bf9-5b26-00d6-b68abb5aff34.jpeg)

画面右上の「Local setup instructions」をクリックします。
![55.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/54187162-cb09-534e-b42c-1b5771f5f689.jpeg)

:::note warn
Amplify CLIをすでにインストール済の方はこちらは対応不要です。
:::

「View Amplify CLI installation instructions」をクリックし、コマンドをコピーします。
![56.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/20e1e075-e08d-6431-c7f0-8fb0acf1355b.jpeg)

:::note warn
Amplify CLIをすでにインストール済の方はこちらは対応不要です。
:::

コマンドプロンプトでコピーしたコマンドを実行します。
![57_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/5edbb338-e4d0-f0ab-87a1-3f2cec990c7b.jpeg)

再度『Amplify Studio』に戻り、`amplify pull --appId XXXXXXXXXXXXXX --envName staging`をコピーします。
![49.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/9128f293-26d6-f1a1-3e17-4733042b1fa0.jpeg)

コマンドプロンプトでコピーしたコマンドを実行します。
![63.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/37750f9b-8a84-80ed-915e-462295492210.jpeg)

ブラウザ上で『Amplify CLI』にログインしてよいか確認されるため「Yes」をクリックします。
![64.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/6a818fe2-60a9-78ef-8ae0-e5b7e9576230.jpeg)

成功しました。
![65.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/6f626a56-9759-a7a7-921c-223de8c4baae.jpeg)

場合によっては以下のようなWindows Defenderファイアウォールの警告がでるかもしれません。許可します。
![66.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/e775dc76-1d65-acab-ba62-7d945faa3b1e.jpeg)

デフォルトのエディターが聞かれます。`Visual Studio Code`を選択します。
![67.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/30ec7cc7-a722-bf56-2c23-cd0e5f32a335.jpeg)

アプリの種類が聞かれます。`javascript`を選択します。
![68.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/abda2d3d-8fc6-0c32-b753-15a4713344bf.jpeg)

利用するフレームワークが聞かれます。`react`を選択します。
![69.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/1b5e4c94-5138-3ea0-1871-5a34c13f1002.jpeg)

そのほかいくつか質問がありますが、すべてEnterキーで進めます。
![71.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/3bd1444b-e9f5-93eb-661e-3fe0ed80876a.jpeg)

成功しました。`Y`を入力しEnter。
![72.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/9f48b380-b353-1b18-9d7f-db729c632d2a.jpeg)

完了です。
![73.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/1289a1e5-912f-d69f-de7b-27f887296bba.jpeg)

『Amplify Studio』で作成したコードがCloneされました。
![74_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/09dfdbb2-5ad0-76e9-5874-73fb2d3c67d4.jpeg)

以下のコマンドを実行し、必要なライブラリを取り込みます。

```
npm install aws-amplify @aws-amplify/ui-react
```

![87_npm.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/54f9f75f-d10a-1b45-e85b-ada7714b044c.jpeg)

完了。
![88.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/0f09a680-195b-c90d-ca96-28f7a11f5d99.jpeg)

`src/index.js`に以下の通りコードを追記します。

```ruby:src/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 "@aws-amplify/ui-react/styles.css"
import { AmplifyProvider } from "@aws-amplify/ui-react"
import awsconfig from "./aws-exports"
Amplify.configure(awsconfig)
  # 追加終わり

ReactDOM.render(
  # 省略
```

![89.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/330babcd-ee62-cb77-b8a7-a4c56be822ac.jpeg)

`src/index.js`の`<App />`を`<AmplifyProvider>`で下記の通りラップします。

```ruby:src/index.js
import React from 'react';
  # 省略
ReactDOM.render(
  <React.StrictMode>
    <AmplifyProvider>
      <App />
    </AmplifyProvider>
  # 省略
```

![90.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/12a1c7bf-e63e-1f29-e829-950c12d9aa38.jpeg)


Node.jsを起動します。

```
npm run start 
```

![92.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/c561c82c-982d-34a9-533d-9a5c0e130fcc.jpeg)

ローカル上で確認できました。
![93.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/3c7b3d42-1a59-df1e-d13f-b9a4e3e4a09a.jpeg)

作成したコレクションコンポーネントに変更します。
`src/App.js`の`HeroLayout1`を`CardBCollection`に変更します。

```ruby:src/App.js
import "./App.css"
import CardBCollection from "./ui-components/CardBCollection"

function App() {
  return (
    <div className="App">
      <CardBCollection />
    </div>
  )
}

export default App
```

![94.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/849d8527-e6f2-c5de-8416-c5a77624d836.jpeg)

作成したコレクションが確認できました。
![95.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2178270/fdbe0e74-2d9f-196a-ac94-9c5c92567923.jpeg)

以上がチュートリアルになります。

#Amplify Studioをさわってみて
今回Amplify Studioをさわってみて、特徴にも書いた「FigmaのデザインからReactコードを生成」がかなり強力だなと。Reactコードの生成もさることながら、GUIでレイアウトの変更などもかなり容易だと感じました。
Amplify Studioによりデザイナー、フロントエンド開発者の領域や仕事のやり方を大きく可能性を秘めているかもしれません。

[^1]: 通常では、と記載したのは理由があり、私の環境では1時間たってもデプロイが完了しませんでした。完了はしませんでしたが、アプリは作成されていたため私の環境ではそのまま進めることができました。（IAMの設定も疑いましたが関係ありませんでした）