React + AWSでAI画像生成ツールを自動デプロイ　～①設計・環境設定～

## 初めに
本記事では、アプリケーション開発がどのような工程で進んでゆくのかを簡単にご紹介いたします。

開発エンジニアとはどういう作業をしているのか？ご理解いただくことを目的としておりますので、今回の内容でアプリケーション開発の流れがイメージできるようになればと思います。

## 1. 要件定義
「要件」とは、「**必要な条件、重要なポイント**」のような意味を持ちます。
すなわちシステム開発における要件定義とは、開発物に必要となる機能や仕様などを定めることとなります。

### 1-1. 要求の確認
システムに求められる要件を定めるにはまず「要求」を確認する必要があります。
「要求」とは文字通り「**何が求められているか？**」ということであり、
システム開発における要求元は利用ユーザであることが多いです。

今回の要求は以下の通りとします
* 画面操作で使いたい
* 指定した内容の画像を表示してほしい
* サーバを用意せずにアプリケーションを公開したい

### 1-2. 要件の整理
集めた要求をもとに要件を定めます。

(要求)「画面操作で使いたい」
→　(要件)Webアプリケーションを作成する

(要求)「指定した内容の画像を表示してほしい」
→　(要件)AIによる画像生成を取り入れる

(要求)「サーバを用意せずにアプリケーションを公開したい」
→　(要件)クラウド上でアプリケーションを運用できるサービスを使う

#### 要件まとめ
* Webアプリケーションを作成する
* AIによる画像生成を取り入れる
* クラウド上でアプリケーションを運用できるサービスを使う

## 2. 機能設計
要件が整理できましたね。
ここまでで「**AI画像生成できるWebアプリケーションをクラウド環境上で稼働**」が良いのでは？という方針が立ちます。

それをもとに設計をしていきます。本来は設計のドキュメントを書いたりしますが、今回は長くなるので省きます。
作成するアプリケーションのUIイメージだけ、下記のように作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655870/a3f6c538-3db2-a47a-123c-ff9483bf0ee8.png)


## 3. 環境設定
### 3-1. GitHub
GitHubはソースコードを管理するグローバルなサービスです。
今回もGitHubを使っていきます。
もしアカウント登録がまだの場合は下記などを参考に実施してください。

https://zenn.dev/protoout/articles/50-howto-github-setup

#### リポジトリ作成
GitHubの「リポジトリ」とは、ソースコードを保管しておく場所のようなものです。
通常、1つのアプリケーションごとに名前を付けて作成します。

右上の「＋」メニューから「New Repository」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655870/f3a15fa4-fcf7-092d-405c-86040c64fa89.png)

リポジトリ作成画面に入りましたら、任意のリポジトリ名を指定します。
今回は「image-generator」としておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655870/794c94d7-ca02-4196-1514-6ef7d9e78ae3.png)

「Public」「Add a README file」にチェックを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655870/0c25a862-27a8-754e-a99c-717bace83bd0.png)

最後に「Create Repository」をクリックしリポジトリを作成しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655870/8b4eb453-7329-e589-57a9-ebe64434d716.png)

下記のようにリポジトリのページができればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655870/6f4737b8-6a3c-b43c-9b9d-4e925ae2b7cd.png)

このリポジトリに、今回のアプリケーションを格納していきます。

### 3-2. AWS
AWS(Amazon Web Services)はAmazon社が提供しているクラウドコンピューティングサービスです。
「クラウド」とはインターネット経由で利用者にサービスを提供する技術、
「コンピューティング」とは、皆さんのPCのようなコンピュータが行える処理、機能のことを指します。

つまり、AWSは「インターネット経由でコンピュータの処理・機能を提供するサービス」ということですね。

AWSでは多数のサービスを利用することができますが、今回は「アプリケーションを配置する、動かす、ユーザにアクセスさせる」といった役割を担ってもらいます。

※今回、登録手順はご案内しませんので登録がお済みの前提で進めます。

#### AWSログイン(サインイン)
AWSのHPなどからサインインページへ進みます。

https://aws.amazon.com/jp/

IAMと呼ばれる、自身のAWSユーザの情報を入力し、「Sign in」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655870/e7d1ee2f-50ad-2549-6d7e-64abdfd74bc8.png)

「コンソールのホーム」という画面に出ればログインOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655870/4d25e7aa-7a31-9169-dcf0-ea099caede5f.png)

### 3-3. 作業環境(コンソール)
開発を行うには、コマンドを実行したりする作業環境が必要ですね。
自分のPCに入っているコマンドプロンプトやPower Shellでも開発できますが、今回はLinux環境を使用します。

自身のPCでLinux作業環境を用意できればそれが一番ですが、今回はサクッと作業していただくために手軽な方法を使用します。

#### GitHubコンソールの使用
先ほど設定したGitHubのリポジトリページから、簡易的なコンソールを使用させていただくことができます。
主要な開発環境ではありませんが、今回はそれを使用しましょう。

「image-generator」のリポジトリページから「Code」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655870/8244510a-785c-7789-b239-11587253ba7f.png)

開いた画面から「Codespaces」を選択し、「Create codespace on main」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655870/cec42dd2-07ca-e251-dc68-8681a65a3746.png)

次のような画面が出て、ターミナルが使えるようになればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655870/5d89b020-b5f0-ab82-b865-ea4becb10efd.png)

デフォルトで「image-generator」というディレクトリにいますね。
ここにはリポジトリ内のファイルが格納されており、編集が可能となっております。

## 4. システム構成チェック(テスト開発)
設計も行い、開発環境の設定も完了したらいよいよ開発フェーズです。

それではアプリケーションをゴリゴリ開発していこう！
...としても良いのですが、今回は完全新規のシステム構成を使用するので、まずは最小構成で自身の想定した環境が整合性取れているかチェックを行いたいです。

既に稼働中のプロジェクトで追加開発をする場合などはこの工程を飛ばしても構いませんが、初回開発となるシステム構成では最初のうちに動作チェックするのがおすすめです。

<INS>開発の最終盤で、想定していた構成に問題があると分かっても軌道修正が大変ですので。</INS>

### 4-1. テスト開発
ということでまずは最小構成での開発を行います。

今回はNode.js + Reactの最小構成でアプリケーションが実際に動くところまで見届けます。

#### Node.js開発用コマンドの準備
Node.js(JavaScriptのバックエンド実行環境)を使用した開発には下記のようなコマンドを使用します。
* `node`
* `npm`もしくは`yarn`

通常、ご自身の開発環境にインストールする作業が発生しますが、
今回使用するGitHubコンソールには最初からインストールされているので特に準備はいりません。

コンソールのターミナル上で下記のようなコマンドを実施し、コマンドのバージョンが出力されれば`node`や`npm`が使用可能であるとわかります。
```bash
# nodeコマンドのチェック
$ node -v
v20.16.0

# npmコマンドのチェック
$ npm -v
10.8.1
```

#### Reactアプリケーションの生成
Reactアプリケーションには様々な構成要素がありますが、それらを1つずつ開発者が用意せずとも簡単にReactアプリケーション開発の準備をする方法があります。

`ceate-react-app`というコマンドを使用することで、Reactアプリケーションを1コマンドの実行のみで生成することができるため、早速実行してみましょう。

コンソール上で下記のように実行してください。
```bash
# 作業場所のチェック ※/image-generator にいること
$ pwd
/workspaces/image-generator

# アプリケーションの作成
# usage: create-react-app <アプリケーション名>
# 今回はすでにアプリケーション名(image-generator)のディレクトリができているので、
# アプリケーション名の代わりにカレントディレクトリ「.」を指定します。
$ npx create-react-app .

Need to install the following packages:
create-react-app@5.0.1
Ok to proceed? (y) y  # ←「y」を入力しEnter
```

`create-react-app`の前についている`npx`は、詳細は省きますが`create-react-app`コマンドが自環境にインストールされていなくても使用できるようにするコマンドです。

実行後ずらずらと出力があった後、作成成功時は「**Happy Hacking!**」と出力があります。
```bash
### 省略 ###

Creating a new React app in /workspaces/image-generator.

Installing packages. This might take a couple of minutes.
Installing react, react-dom, and react-scripts with cra-template...

### 省略 ###

Success! Created image-generator at /workspaces/image-generator
Inside that directory, you can run several commands:

### 省略 ###

We suggest that you begin by typing:

  cd /workspaces/image-generator
  npm start

You had a `README.md` file, we renamed it to `README.old.md`

Happy hacking!  # ←作成完了

### 省略 ###
```
これでReactアプリケーションを自動で構築することができました。

#### アプリケーションの起動
ログ中の「We suggest that～」以下にある通り、`npm start`を実行することでアプリケーションを起動することができます。

早速実行してみましょう。
```bash
# 作業場所のチェック ※/image-generator にいること
$ pwd
/workspaces/image-generator

# アプリケーションの起動
# 起動成功で Compiled successfully! 表示が出ます。
$ npm start

Compiled successfully!

You can now view image-generator in the browser.

  Local:            http://localhost:3000
  On Your Network:  http://10.0.1.218:3000

### 省略 ###
```

おそらく自動でブラウザの別タブが立ち上がり、下記のようにアプリケーションが表示されたかと思います。
非常に簡単でしたね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655870/39db55c9-a52a-7b07-17bf-2997fb8a69fd.png)

ターミナル上に`Local: http://localhost:3000`とある通り、通常の開発環境ではデフォルトで`http://localhost:3000`がアプリケーションのURLとなりますが、今回はGitHubのコンソール上で作業しているため、GitHub特有のURLが発行されているかと思います。
```
https://hogehoge-fugafuga-xxxxx-3000.app.github.dev/
```

これで最小構成でのアプリケーション起動は確認できましたので、アプリケーションは停止させてしまいましょう。
アプリケーションの停止はターミナル上で`Ctrl + C`キーを実行してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655870/d65abcc3-ca3c-2739-3191-1d3a8c9624df.png)

プロンプトが戻ってくればアプリケーションの停止は完了です。

### 4-2. GitHub上のソースコードを更新
コンソール上でReactアプリケーションの生成を行い、様々なファイル群やディレクトリが作成されました。しかし、<INS>これはあくまでまだ「コンソール上のみでの変更」であり、GitHubにて管理するソースコードは更新されていません。</INS>

ですので、先ほど作成したReactアプリケーションのソースコードをGitHubのリポジトリへ反映させましょう。

ターミナル上で下記のように実行します。
```bash
# 変更をステージする (-A: すべてのファイルを選択)
$ git add -A

# 変更を確定する (-m: コミットメッセージ)
$ git commit -m "Reactアプリケーション作成"

# 変更をGitHubへ反映させる
$ git push origin main
```

gitコマンドの仕様は初学者にとってわかりにくいかもしれませんが、今回は詳しい説明は省きます。
基本的には下記のような流れを繰り返して開発を行います。
1. アプリケーションの編集をする
1. `git add <ファイル名>`で変更内容を確定(commit)したいファイルを選択(ステージ)する
1. `git commit -m "<コミットメッセージ>"`でステージしたファイルの変更内容を確定する
1. `git push origin <ブランチ名>`で変更内容をGitHubへ反映させる

ブラウザでリポジトリの画面に再度アクセスしてみましょう。
下記のように、先ほど生成したファイル群が登録されていればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655870/4584c065-3c24-2b35-f5d5-1d74adaa465f.png)

### 4-3. テストデプロイ
デプロイとは、「開発したアプリケーションを配置して使用できる状態にする」というような意味です。
今回は事前にAWS上でアプリケーションを稼働させると決めていますので、先ほど作成した最小構成のReactアプリケーションをAWS上へお試しデプロイしてみましょう。

#### AWS Amplifyの使用
AWS上へアプリケーションを配置する方法はいくつかありますが、今回は「AWS Amplify」というサービスを使用してみます。

Amplifyではユーザの**GitHubリポジトリと連携**することができ、保管してあるソースコードをAWS上へ簡単にデプロイすることが可能です。
その際、**アクセス用のURLも自動発行**してくれるため、お手軽に自作のアプリケーションを公開することが可能です。

まずはAWSのマネジメントコンソール上部にある検索ボックスに、「amplify」と入力しましょう。
「サービス」の欄に「AWS Amplify」がサジェストされますので、こちらをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655870/38d776cf-d894-0deb-69f9-d732a2e173d8.png)

Amplifyの画面に遷移したら、右上の「新しいアプリの作成」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655870/468d9325-60bb-936a-94b8-02deb4f7eecb.png)

連携サービスの選択画面に飛ぶので、「GitHub」を選択し「次へ」クリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655870/9fed840e-affa-d0f5-fb3c-7fc0f4e4b633.png)

GitHub未連携状態だと、連携を許可するかどうかの確認画面が発生します。アカウントが正しいことを確認して緑色の「Authorize～」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655870/5d1241f6-05ad-da9e-23c3-8708e6cc99a1.png)

続いてどのリポジトリをAmplifyに連携するか聞かれます。
今回は1個だけでいいので「Only select repositories」を選択し、「Select repositories」から「<あなたのアカウント>/image-generator」だけ選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655870/ad70c050-c8d4-e82c-0d0d-fcb5e6bc1b13.png)

最後に下部の「Install ＆ Autorize」をクリックしましょう。(パスワードが求められます)

AWSのブラウザに戻ると、下記のような画面になってます。
先ほど連携した「image-generaor」が選択肢に出るので、選択しましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655870/7e7472b9-bc54-e1a3-b8e2-a12b06104189.png)

ページ下部の「次へ」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655870/8cabcc6b-79e9-cb17-a988-4a67a7b9e5ef.png)

「アプリケーションの設定」画面へ遷移します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655870/166d1e9c-ae70-b6e0-ccbe-184eb06f57b0.png)

今回はデフォルトの設定で問題ありませんので、下部の「次へ」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655870/9c7a8519-a1c4-7056-fdb9-54f754722887.png)

「確認」画面へ遷移します。下部の「保存してデプロイ」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655870/65799513-6bdc-fb1f-3572-2b0a7c29783d.png)

少し待つと、下記のようにデプロイしたアプリケーションの概要画面に遷移します。「main」もしくは直下のデプロイステータスをクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655870/707d340c-1369-e8be-cd82-edfd0a0b137e.png)

デプロイ状況が見れる画面へ遷移します。
下記のように、「ビルド」「デプロイ」がともに緑チェックになっていればデプロイは成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655870/d1b19554-efe1-6c4b-c5a1-d06164c3e2ca.png)

「ドメイン」と書かれている箇所がAWS上にデプロイされたあなたのアプリケーションのURLです。クリックしてアクセスしましょう。

テスト開発フェーズで見たのと同じ、Reactのテスト画面が表示されれば無事アプリケーションのデプロイテストは完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3655870/a94c89a0-b0fa-8cf2-a2c9-532708f92687.png)

## コラム【CI/CD】
<INS>**CI/CD**(Continuous Integration / Continuous Delivery)</INS>とは、開発作業における自動化の手法です。

CIとは簡単に言うと「**テストの自動化**」です。記述したコードの「構文が正しいかどうか」や、「処理が正常に動くかどうか」を自動でテストさせます。

CDとは「**デプロイの自動化**」です。記述したコードを開発者が手動デプロイするのではなく、システマティックに自動でデプロイして運用開始されるように構成を組みます。

今回使用したAWS Amplifyは、GitHubリポジトリへの変更をトリガーに自動で再デプロイを実施してくれます。つまり、AmplifyはCDツールであるといえるわけです。

CI/CDを開発フローに導入することは、コーディングを楽にするほか、システムの安定性にもつながりますので、積極的に取り込んでいただきたい要素となっています。

# 次回予告
それではここから本格的に開発をしていきましょう。
下記の資料より続きの実施をお願いします。

https://qiita.com/ms1546/private/6a875103ae461ffff8e7