NetlifyとAivenを使い始める

<font color="Grey">*[Getting started with Netlify and Aiven](https://aiven.io/blog/getting-started-with-netlify-and-aiven)の翻訳です。*</font>

2023年9月12日

# NetlifyとAivenを使い始める

Aivenが提供するデータサービスを使ってNetlify上にJAMstackウェブアプリケーションをデプロイする！

JavaScript、API、マークアップ(JAM)スタックを使って効率的でエレガントなアプリケーションを構築することに長けている、才能あるフロントエンド開発者のアレックスを紹介しましょう。フロントエンド開発が得意なアレックスですが、1つ戸惑うことがあります。それは、アプリケーションをプロダクショングレードのデータベースと通信させ、コードをローカルマシンから実際のライブ環境に移動させることです。


そんなとき、彼女は[Netlify](https://netlify.com)とAivenのことを耳にした。NetlifyはJAMstackアプリケーションを簡単にホストしてデプロイできることで知られるプラットフォームであり、Aivenは信頼できるオープンソースのデータプラットフォームで、Alexは[MySQL](https://aiven.io/mysql)や[Redis](https://aiven.io/redis)のような、信頼性が高くエンタープライズ対応のデータサービスを作成できる。


このチュートリアルでは、Alexがプロダクショングレードのデータベースとデプロイメントに関する知識をほとんど持たない開発者から、MySQLとRedisとシームレスに統合された、堅牢でセキュアでスケーラブルなNext.jsアプリケーションをNetlify上にデプロイするプロセスをマスターするまでの道のりに同行します。


## でも...どうやって使うの？


百聞は一見にしかず。以下のアーキテクチャ図を見てみよう：


![NetlifyとAivenのデプロイのアーキテクチャ図。左側は開発者のローカル環境にあるサービスを示しており、MySQlとRedisはテスト用にローカルコンテナで動作している。開発者はこれらの変更をGitHubにプッシュし、右側にはNetlifyで起こることとAivenで起こることを説明する2つのボックスがあります。アプリはNetlifyにデプロイされ、Netlifyがフロントエンドのセキュリティ、スケーラビリティ、堅牢性を管理する。RedisとMySQLのデータベースはAivenを使ってデプロイされ、アプリはセキュアな接続でAivenと通信する](https://cdn.sanity.io/images/sczeoy4w/production/55b6843cf15cec1887bfefe7022570c457ee1bc4-6114x2283.png?q=80&fit=min&auto=format&dpr=1.5)


このアーキテクチャ図では、アプリケーションのライフサイクルを開発環境と本番環境の2つに分けている。


左側には、主人公のアレックスがほとんどの時間を過ごす開発環境があります。ここには3つの重要な要素が存在します：


1.localhost:8080を指すウェブブラウザ。アレックスが自分のアプリケーションとリアルタイムでやりとりし、その挙動を観察することができる。
2.アレックスがアプリケーションを一行ずつ作成するためのローカルソースコードファイル群。
3.3.ローカルでデータベースを実行するためのDockerイメージで、アレックスは開発プロセス中に、より現実的な本番のような環境をシミュレートできる。


Alexが自分の作業に満足したら、ローカル開発環境から中央に配置されたGitHubリポジトリにコードをプッシュする方法を矢印で示す。


図の中央では、GitHub のアイコンが開発環境と本番環境の橋渡しをしています。リポジトリにプッシュされるたびに、Webhook がアクションをトリガーして図の右側、つまり本番環境に導かれます。


本番環境では、成熟し、完全に実現された状態のアプリケーションを見ることができます。Netlify にデプロイされたアプリケーションは、安全で、スケーラブルで、信頼できるものです。何百万人ものユーザが利用する可能性があるプレッシャーの下でも、パフォーマンスを発揮する準備ができており、これは堅牢なアーキテクチャの証です。


本番アプリケーションは、[Aiven for MySQL](https://aiven.io/mysql)と[Aiven for Redis®*](https://aiven.io/redis)と通信しています。これらは私たちのアプリケーションの堅牢で信頼性の高いバックボーンであり、ユーザー負荷がスケールアップしてもパフォーマンスを維持するのに役立っています。


このアーキテクチャの流れを追うことで、アレックスのローカル開発セットアップから、何百万人ものユーザーにサービスを提供する頑丈な本番対応システムまで、アプリケーションの道のりを見ることができます。


## 夢中になってしまいました。何から始めたらいい？


素晴らしい！[詳細なチュートリアル](https://aiven.io/developer/deploy-netlify-app-aiven-pg-redis)を用意しました。このチュートリアルでは、MySQLの代わりにPostgreSQL®データベースを使用しています。チュートリアルを完了したら、PostgreSQLとMySQLを入れ替えるのはとても簡単です。変更する部分を見てみましょう。


### サービスのセットアップ


[このチュートリアル](https://aiven.io/developer/deploy-netlify-app-aiven-pg-redis)は、いくつかの前提条件となるアカウントのセットアップとツールのインストールから始まります。その部分が完了し、[Create free PostgreSQL and Redis services](https://aiven.io/developer/deploy-netlify-app-aiven-pg-redis#create-free-postgresql-and-redis-services)の部分に移ったら、このチュートリアルでは**PostgreSQL**の代わりに**MySQL**サービスを作成してください。それが終わったら、次のようになります：


* Aiven for MySQLサービスが実行されています。
* AivenのRedisサービスが動作している


### アプリケーション・コードの取得


[この](https://github.com/Aiven-Labs/nextjs-netlify/)は、PostgreSQLバックエンドを使ったチュートリアルのオリジナルのGitHubリポジトリです。私はこのリポジトリをフォークし、代わりにMySQLバックエンドで動作するようにソースコードに変更を加えました。


GitHub CLI でリポジトリをフォークしてクローンしてください：



```
gh repo fork https://github.com/Aiven-Labs/nextjs-netlify-aiven-mysql.git \
    --clone --remote
```

このリポジトリの主な変更点は、ORM ([Prisma](https://www.prisma.io/))のプロバイダとスキーマの詳細が `postgresql` から `mysql` になったことと、レシピモデルです。レシピモデルでは、MySQL には配列のサポートが組み込まれていないため、`String[]` を `String` に置き換えている。prisma/schema.prisma`ファイルを見ると、以下のようになっている：



```
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "mysql"
  url      = env("DATABASE_URL")
}

model Recipe {
  id               Int      @id @default(autoincrement())
  recipeName       String   @map("recipe_name")
  prepTimeMinutes  Int      @map("prep_time_minutes")
  cookTimeMinutes  Int?     @map("cook_time_minutes")
  totalTimeMinutes Int      @map("total_time_minutes")
  servings         Int
  yield            String?
  ingredients      Json
  directions       String
  rating           Float
  url              String?
  imgSrc           String?
  nutrition        String?
  isLiked          Boolean  @default(false) @map("is_liked")

  @@map("recipes")
}
```

## アプリケーションをデプロイする


チュートリアルの残りの部分に従って[アプリケーションをデプロイする](https://aiven.io/developer/deploy-netlify-app-aiven-pg-redis#deploy-the-application)。DATABASE_URL`変数には、PostgreSQLではなくMySQLデータベースのURLを使うことを忘れないでください。


## 次のステップ


Next.jsアプリケーションをNetlifyにデプロイし、バックエンドとして堅牢なデータプラットフォーム（そう、Aivenです）を利用できるようになったAlexは、Aivenプラットフォームで利用できる他のデータサービスについて学ぶことができます。アレックスは、Aivenが提供するサービスのビルトイン・ロギング・モニタリングの恩恵も受けることができる。さらに、Aiven Terraform Providerを活用することで、すべてのデータサービスの作成を自動化することができます。詳しくは以下のリンクをご覧ください：


* [Aivenサービスを調べる](https://docs.aiven.io/)
* [Aiven モニタリングとログ](https://docs.aiven.io/docs/platform/howto/list-monitoring)
* [Aiven Terraform Provider](https://docs.aiven.io/docs/tools/terraform)