AWS Amplifyを使ってNext.jsをデプロイする（Basic認証、Monorepoもあり）

## AWS Amplifyとは
手軽にWeb,モバイルアプリケーションをデプロイすることができるAWSサービスの一つです。
Amplifyを活用することでインフラ周りはすべてAWSにおまかせして開発者はフロントエンドの開発に集中することができるため高速で開発→リリースすることができます。
またCI/CD環境の導入も自動的に導入でき、GitHubと連携すれば指定のブランチにプッシュされると自動でデプロイすることができます。

https://docs.aws.amazon.com/amplify/index.html

## 事前準備
今回はGitHubのリモートリポジトリからアプリをデプロイしていきたいので、事前にリモートリポジトリを作成して、アプリのコードを先程作成したリモートリポジトリへ上げておきましょう。

## デプロイ編
### Amplifyのマネジメントコンソールにアクセスする
AWSマネジメントコンソールから「Amplify」を検索してコンソールにアクセスします。
まだ一度もアプリケーションを作成していなければ画像のような画面となっていますので
「Get started」→「Amplify Hosting」から始めていきましょう。
![9ea2ee45199d8c23e54e185779074d76.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1010273/045b9f36-47ff-eb04-e0fb-4d223019dd2a.png)

https://ap-northeast-1.console.aws.amazon.com/amplify/home?region=ap-northeast-1#/

### Amplifyホスティングの開始方法
デプロイするアプリケーションのコードがあるリポジトリと接続していきます。
今回はGitHubを使用するので`GitHub`を選択して「続行」をクリックします。
![スクリーンショット 2023-01-02 11.10.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1010273/7aa741d7-b62e-6ad4-7b79-7658fdd0aa9c.png)

認証を求められるのでアカウントがリポジトリが存在しているアカウントであることを確認してGitHubとAWSを連携します。
その後マネジメントコンソールにリダイレクトされます。

### リポジトリブランチの追加
GitHubとの連携に成功すると以下の画面が表示されます。
デプロイするリポジトリ・ブランチを選択して「次へ」をクリックして進みます。
![スクリーンショット 2023-01-02 11.09.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1010273/eac5db41-99ff-2215-0c6d-458a863e80a1.png)


※もしリポジトリ・ブランチがない場合には`GitHubのアクセス許可を表示`を押してリポジトリを選択することで権限を追加することができます。
![スクリーンショット 2023-01-02 11.12.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1010273/7df43e95-e61a-f891-06b6-c9284023693d.png)

### ビルドの設定
アプリケーションの名前や、ビルド時の設定などを定義していきます。
「アプリケーションの名前」にはアプリケーションの名前を入力します。
![スクリーンショット 2023-01-02 11.17.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1010273/31aa3dfa-2b02-c3e3-2b68-d5d3f4f75928.png)

「構築とテストの設定」では環境変数の設定や、ビルド時のコマンド、キャッシュの設定をすることができます。
「構築とテストの設定」の内容はフロントエンドフレームワークと`package.json`の内容から自動的に設定されます。
また`Edit`から内容を編集することもできたり`Download`から`deploy.yml`をダウンロードすることもできます。
入力形式はYAMLです。
「構築とテストの設定」の内容に問題がなければ「次へ」をクリックしてデプロイ内容の確認画面へ進みます。

```yml:amplify.yml
version: 1
frontend:
  phases:
    preBuild:
      commands:
        - npm ci
    build:
      commands:
        - npm run build
  artifacts:
    baseDirectory: .next
    files:
      - '**/*'
  cache:
    paths:
      - node_modules/**/*

```

**【項目の解説】**
**frontend** - フロントエンドのビルドコマンドを実行する。
**test** - テストフェーズのコマンドを実行する。（今回のamplify.ymlには入っていません）
**preBuild** - ビルドが始まる前や、パッケージの依存関係をインストールしたあとに実行したいコマンドを書きます。
**build** - ビルドコマンドを書きます。
**postBuild** - ビルドが終了した後に実行したいコマンドを書きます。
**artifacts->baseDirectory** - ビルド後のファイルが存在するディレクトリを指定します。今回はNext.jsを使用しているので　`.next`になります。
**artifacts->files** - aritifactsにあるデプロイしたいファイルを指定します。`**/*`であればすべてのファイルという意味になります。
**cache** - キャッシュさせたいディレクトリを指定します。初期ではフレームワークからキャッシュさせるディレクトリが自動的に判断されます。

それ以外については下記リンクの公式ドキュメントをご参考ください。

※日本語版のドキュメントの訳がめちゃくちゃなので英語版を読むのをおすすめします・・・

https://docs.aws.amazon.com/amplify/latest/userguide/build-settings.html


※　リポジトリのプロジェクトルートに`deploy.yml`を上げておくビルド時の設定を定義することもできますが、現時点で(2023年1月2日)`Please acknowledge`という警告が表示されるも、確認するためのボタンがないため次に進むことができないというissueが立っていて未解決です。
`amplify.yml`はアプリをデプロイ後にリポジトリに上げるのが良さそうです。

https://github.com/aws-amplify/amplify-hosting/issues/2440

### 確認
デプロイされる内容の確認画面です。
問題なければ「保存してデプロイ」をクリックしてデプロイを開始しましょう。
![スクリーンショット 2023-01-03 10.08.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1010273/7576e65f-2b08-f79b-b49f-cc0dcceb1746.png)

### デプロイ
「保存してデプロイ」をクリックするとすぐにデプロイが開始されます。
![スクリーンショット 2023-01-03 10.10.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1010273/7d23407e-354f-d1ef-5b5c-08e777487cc5.png)

デプロイしているブランチ名（今回であればmain）をクリックすればコマンドの実行状況を確認することができます。
もしデプロイに失敗した場合にはここにエラーメッセージが表示されるので参考にすることができます。
ドメイン名をクリックすればデプロイしたアプリを表示することができます。
これでデプロイは完了です！
![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f313031303237332f35326566353162372d633136662d323530362d656335372d3639366136353830356561632e706e67.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1010273/f2dc74ff-6b12-1de3-fcfc-d9f30451fca1.png)


### デプロイしたアプリにBasci認証をかける
Amplifyを活用すると簡単にBasic認証をかけることができます。
まずAmplifyの左ペインから`アクセスコントロール`を選択します。
![スクリーンショット 2023-01-03 10.24.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1010273/f5c08bca-6031-c880-c4b1-645ec9536355.png)
「アクセス設定」がパブリックに表示可能となっているとBasic認証がかかっていない状態です。
右上の「アクセスの管理」からユーザー名、パスワードを設定していきます。
![スクリーンショット 2023-01-03 10.25.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1010273/986cba29-586f-a8a5-ab59-e7b00e56631f.png)
「アクセス設定」を「制限-パスワードが必要です」を選択するとユーザーネームとパスワードのフォームが活性化されるので設定したいユーザー名、パスワードを入力して「SAVE」をクリックすれば設定が完了です！
![スクリーンショット 2023-01-03 10.31.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1010273/80e49b4b-c3b9-dc25-2faf-500b4bb3f4a5.png)

再びアプリのドメインにアクセスしてみるとユーザー名とパスワードが求められるようになりました。
以上で完了となります。簡単ですね！
![スクリーンショット 2023-01-03 10.34.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1010273/764dfe71-8b82-b391-3c8b-a5e7191ae138.png)

**参考リンク**

https://dev.classmethod.jp/articles/amplify-console-access-control/

## モノレポアプリをデプロイする場合のamplify.ymlの書き方
今回自分がAmplifyにデプロイするアプリのディレクトリの構成は以下のようなMonorepoでした。
```
project
 ├ api
 └ front
```
`/api`がFastAPIを使用したAPIサーバのディレクトリ、`/front`がフロントエンドのディレクトリになります。
この場合、先程書いたようにはデプロイすることができずamplify.ymlを少し編集する必要があり、そこで少しつまりました。
結果以下のようなamplify.ymlでデプロイすることができました。
```yml:amplify.yml
version: 1
applications:
  - appRoot: front
    frontend:
      phases:
        preBuild:
          commands:
            - npm ci
        build:
          commands:
            - npm run build
      artifacts:
        baseDirectory: build
        files:
          - '**/*'
      cache:
        paths: []
```
`appRoot`でフロントのディレクトリを指定することで`prebuild`や`build`のコマンドがフロントのコードが有る`/front`ディレクトリ内で実行することができます。

https://docs.aws.amazon.com/amplify/latest/userguide/monorepo-configuration.html

## 最後に
インフラのことをあまり考えずに爆速でデプロイすることができるのがAmplifyの素晴らしいところだと感じました。
今後はFastAPIとの連携もやっていくのでまたそれについても記事にしていきたいと思います。