フロントエンドエンジニアが今すぐ挑戦できるAWS Amplify

## はじめに
AWSからしばらく遠ざかっていた私が、
「フロントエンドの知識があれば誰でもすぐにAWSを使ってWebサイトを作れますよ！」
「AWSってインフラエンジニアだけのものではないんですよ！」
と言うことを証明したくて手を動かしてみた記事です。

## この記事で挑戦したこと
 - AWS Amplifyで、Webサイトをデプロイ
 - AWS Amplify Studioで、FigmaでデザインしたパーツをReactコンポーネントに変換
 - AWS Cognitoで、ログイン機能を実装

## 使用したAWSサービス
 - AWS Amplify（自動デプロイのため）
 - AWS Amplify Studio（Reactコンポーネント作成のため）
 - AWS Cognito（ログイン機能実装のため）

## この先に進むための前提
 - AWSアカウントを持っている
 - Reactの基本的な知識を持っている
 - Figmaの基本的な操作がわかる（デザイン知識はなくても大丈夫です）

## おすすめ：「AWS CloudWatch」の設定
AWSには使用料金を監視してお知らせしてくれる機能があります。
いつの間にか大金がかかっていたらどうしよう...！と不安な方は、こちらを設定しておくと怖くないです。
[公式のガイド](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/monitor_estimated_charges_with_cloudwatch.html)
AWSは従量課金制ですので、コミットしたり、サイトにリクエストを送ったりすることで料金が発生します。
ですが、AWS登録から12ヶ月は無料でコミット＆デプロイし放題ですし、
個人で開発するくらいであれば過度に気にしなくても大丈夫です。

## 作業の手順
[公式ドキュメント](https://docs.amplify.aws/react/how-amplify-works/)も参考にしています。

### 1. Node.jsの設定（Volta管理）
まずはローカルで環境構築をしていきます。
```terminal
$ curl https://get.volta.sh | bash
$ source ~/.zshrc
$ volta install node
```
`node -v`でバージョンが出ればOKです。

### 2. プロジェクト作成（Vite）
今回はReactかつTS、ビルドにSWCを使うテンプレート（react-swc-ts）で環境構築することにしました。
例）プロジェクト名「testProject」の場合
```terminal
$ npm create vite@latest testProject -- --template react-swc-ts
$ cd testProject
$ npm install
$ npm run dev　　//ローカル起動
```

### 3. Node.jsおよびnpmのバージョン固定（Volta管理）
```terminal
$ volta pin node
$ volta pin npm
```

### 4. パスエイリアスの設定
`tsconfig.json`を修正しておきます。
```json
"compilerOptions": {
  "baseUrl": "./",
  "paths": {
    "@/*": ["src/*"]
  }
}
```
以下コマンドで[vite-tsconfig-paths](https://github.com/aleclarson/vite-tsconfig-paths) をインストールします。
```terminal
$ npm install -D vite-tsconfig-paths
```
`vite.config.ts` を編集します。
```diff_typescript
import react from "@vitejs/plugin-react-swc";
import { defineConfig } from 'vite'
+ import tsconfigPaths from 'vite-tsconfig-paths'

export default defineConfig({
- plugins: [react()],
+ plugins: [react(), tsconfigPaths()],
});
```
ここまででローカルの環境構築は完了です。

### 5. AWS Amplifyの設定
ここからがAWSの設定です。まずはインストールします。
```terminal
$ npm install -g @aws-amplify/cli
```

### 6. Gitリポジトリの作成
Gitのpushで自動デプロイできるようにしたいのでGitも設定しましょう。
一旦mainブランチにpushしておきます。
```terminal
$ git init
$ git add .
$ git commit -m "Initial Commit"
$ git remote add origin git@github.com:ユーザー名/testProjects.git
$ git push -u origin main
```

### 7. AWS Amplifyでデプロイ

ここからはコマンドではなくブラウザ上で操作します。
AWSコンソール画面からAmplifyのページを開き、「新しいアプリ」を選択します。

「GitHub」を選択してデプロイしたいリポジトリを選択すればOKです。
git pushすると自動的にプロビジョン→ビルド→デプロイが済みます。
「〜.amplifyapp.com」と言うドメインも自動で発行されるため、すぐにページにアクセスできます！

このあとはAWS Anplify Studioを使用するので、「バックエンド環境」のタブを開いて、このアプリ用のStudioを起動しておきましょう。

### 8. Figmaでコンポーネントを作成
ページがデプロイできたら、次はFigmaに移動します。
作りたいReactコンポーネントの元となるデザインを作ってみましょう。
今回はこのようなプロフィールカードを作ってみました。
![スクリーンショット 2024-12-15 14.38.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617185/a2316258-ea9c-16c4-d70d-a02c33f26ffd.png)

:::note warn
コンポーネント名の頭文字は大文字にすること（この時点でReactコンポーネントのルールに従っておかないとAWSが認識できない）
:::
何も思いつかないしFigmaわかんないなと言う方には、[Amplify用のUI Kit](https://www.figma.com/community/file/1047600760128127424)もおすすめです。Webサイトで使われがちなパーツが網羅されており、これらを組み合わせていくだけでも美しいページが作れそうなくらい充実しています...！

### 9. FigmaとAWSの連携
Figmaの「共有」ボタンで生成した共有リンクをAWS Amplify Studioのコンソール画面で入力します。
Studioの管理画面から「UI Library」を選択し、以下の「Sync with Figma」を押下してリンクを指定しましょう。
![スクリーンショット 2024-12-15 15.40.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617185/60ed9fc0-5f5b-6eff-cd32-d1d2f46f5957.png)

「Accept all changes」ボタンを押下して、そのまま「Accept all」ボタンを押下し、
「Succuessfully」のメッセージが出たら成功です。

次に、作成したReactコンポーネントをローカルの開発環境で使うための準備をします。
以下コマンドを実行します。
```terminal
$ amplify configure
```
上記実行後に立ち上がったブラウザ内でログインし、
`AdministratorAccess-Amplify`ポリシー（[ポリシーの詳細](https://us-east-1.console.aws.amazon.com/iamv2/home?region=us-east-1#/policies/details/arn%3Aaws%3Aiam%3A%3Aaws%3Apolicy%2FAdministratorAccess-Amplify?section=permissions)）をユーザーにアタッチ（権限付与）します。![スクリーンショット 2024-04-14 13.41.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617185/31f3f8bf-a364-214c-dd25-24d123bf22ba.png)

IAMユーザーの詳細画面から、アクセスキーを作成します。
セキュリティ認証情報タブから「アクセスキーの作成」を押下して、コマンドラインインターフェースを選択しましょう。
![スクリーンショット 2024-04-14 13.45.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617185/1edb0436-87cf-e721-b990-11ff207146a6.png)

出力されたアクセスキーとシークレットアクセスキーをコマンドラインに入力し、
ユーザー名をつけたら完了です。

### 10. 生成したコンポーネントをローカルの開発環境にインストール

AWS Amplify Studioのコンソール画面から、Reactコンポーネントとして読み込むファイルを作成します。
再び管理画面の「UI Library」に戻り、使用したいコンポーネントを選び、「Configure」押下で設定画面を開きます。
![スクリーンショット 2024-12-15 15.54.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617185/60fae191-ac00-10bd-9e8e-cb208745fd84.png)

以下のボタンを押下して「Profile component code」を作成します。
![スクリーンショット 2024-04-14 14.44.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617185/61b8a4f8-dd31-e700-e4c7-d1d6a1ad058d.png)
出力されたコマンドをコマンドラインで実行すると、プロジェクトフォルダに`ui-components`フォルダができます。この中にReactコンポーネントのソースが格納されています。

##### 余談
半年くらい前まではAWSコンソール上でFigmaと連携していたのですが、最近FigmaプラグインからReactコンポーネントを作成できるようになっていました！簡単！

Figma側で「AWS Amplify UI Builder」と言うプラグインをインストールして実行します。
![スクリーンショット 2024-12-15 15.00.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617185/ad021a76-5a19-4c00-f338-53ef43cfb802.png)

デザインシステムのような画面が現れたら「Download component code」を押下すると、Reactコンポーネントがまとまったzipフォルダ（`ui-components`フォルダ）をダウンロードすることができます。

### 11. 出来上がったReactコンポーネントを使用

Reactプロジェクトなので以下のコマンドも実行しておきます。
```terminal
$ npm install aws-amplify @aws-amplify/ui-react
```
以下の通り`main.tsx`を編集します。
```tsx
import { ThemeProvider } from "@aws-amplify/ui-react";
import { Amplify } from 'aws-amplify';
import awsconfig from './aws-exports';
import "@aws-amplify/ui-react/styles.css";
import { studioTheme } from "./ui-components";
Amplify.configure(awsconfig);

ReactDOM.createRoot(document.getElementById('root')!).render(
  <React.StrictMode>
    <ThemeProvider theme={studioTheme}>
      <App />
    </ThemeProvider>
  </React.StrictMode>
)
```

`App.tsx`などのファイルでコンポーネントを読み込んでgit push（自動デプロイ）すると、
Figmaで作成したデザインをReactコンポーネントとして使うことができました！（置いただけですが><）

![スクリーンショット 2024-04-14 15.00.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617185/23be029c-eec9-a6fd-b4e2-4bad145d23b8.png)

## おまけ：ログイン機能をAWSで実装する
Amplify Studioから、ページに対するログイン機能をつけることができます。AWSのサービスであるCognitoを使用します。

Amplify Studio内のサイドバーの「Authentication」から、設定します。
![スクリーンショット 2024-12-15 16.21.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617185/b4ed8d76-81e4-c893-5764-08a78fdd0cb3.png)

[参考サイト](https://tech-blog.cloud-config.jp/2022-01-14-amplify-studio-authentication/)

ログイン方法を選択します。今回は「Email」のみを選択し、デプロイボタンを押します。（数分かかることがあります。）

以下のようなコマンドが表示されたらルートディレクトリで実行します。

```terminal
$ amplify pull --appId サイトのドメイン --envName staging
```
「done」を押下したら元の画面に戻るので、
「User management」からユーザーを追加しまsy。
仮パスワードは記号と大文字小文字を含む必要があるので注意です。

ユーザー登録が完了したら、AWS上の変更を取り込むため以下コマンドを実行します。
```terminal
$ amplify pull
```
`App.js`に以下を追加して認証できるようにします。
```javascript
// 認証用
import { withAuthenticator } from '@aws-amplify/ui-react';
// 中略
// 以下のように変更
export default withAuthenticator(App);
```
ローカル起動して認証画面が出てきたら成功です！
仮パスワードを入力後に本パスワードを設定しておきましょう。

## 今回作業してみての気づき

### いいと思ったところ
 - 個人の制作物であれば、一貫性を持ってデザインからwebサイトを作ることができる
 - Figma側でデザイン更新があった時、正しくReact側に反映することができ、デザイナーとエンジニア間の連携ミスが防げる
 - コンポーネントのコード作成が自動であるため、複数人での開発でも、作成者によってバラつきが出て将来的に可読性に欠けるような事態を防げる
 - ブラウザ上で操作できることが多く、コマンドに苦手意識があっても、エンジニアでなかったとしてもとっつきやすいと感じた
 - AWS上でDBを作成すれば、好きなコンポーネントにデータを流し込み、折り返し位置や最大幅などの設定も簡単にできる（この記事では手順割愛）

### 少し難しいと思ったところ
 - 生成されるReactコンポーネントのHTML構造はFigma上である程度考えておかなければならず、HTMLやCSSの実装知識を持った人がFigmaも操作する必要があるかも
 - タグ名の指定はFigmaからはできないようだったので、自分好みのセマンティックなHTMLは書きづらいかも
 - フォントはFigma上で見えていてもReact側に反映されていないものがあり、手動で追加が必要になった

## まとめ

フロントエンドエンジニアでありながら、会社のミッションでFigmaでのデザイン作成を経験し、
「Webサイトを最初から最後まで自分で作れるのではないか...?」と思ったのがこのチャレンジの始まりでした。

ですが、そんなに甘くはなく、
小さすぎるボタンを作ってしまってデザインからコンポーネント作成の手順を何度もやり直したり、
忘れかけていたバックエンドやインフラの知識を呼び起こしたりと、
改めて他職種の方々に感謝が止まらない日々となりました。

フロントエンドに関わる方の興味の幅が少しでも広がれば幸いです！