超便利ホスティングサービス Netlify

突然ですが個人の簡易的なサイトをお持ちでしょうか？？

個人レベルのwebページでさえ、作るのには様々なものを準備しないといけません。
費用も少なからず、必要です。。。

簡単な静的ページやポートフォリオサイトを作るのに、

* 費用を最小限に抑えたい
* 運用を楽にしたい
* 短期間で作成・公開したい

多くの人がこのように思うはずです。

そのような時に便利なサービスがあります。

その名も、<strong>[Netlify](https://www.netlify.com/)</strong>です。

今回は、このNetlifyがいかに簡単で、機能的かを説明していきます。

## Netlifyとは

> Netlifyは、最新のWebプロジェクトを自動化するためのオールインワンプラットフォームです。
>
> ホスティングインフラストラクチャ、継続的統合、展開パイプラインを単一のワークフローに置き換えます。
>
> プロジェクトの成長に応じて、サーバーレス機能、ユーザー認証、フォーム処理などの動的機能を統合します。
主に以下のようなことができます。

興味のある方は、[こちら](https://docs.netlify.com)を参考にいじってみてください！

* ビルド

  * 紐付けたGitアカウントに対してプッシュする度に、デプロイする。
* サイトの公開
* サイトの監視

  * Netlify Analyticsを利用して、サイトのアクティビティの監視を行う。
* ドメイン・HTTPS

  * ドメイン登録・カスタムドメイン登録・無料HTTPS
* アクセス制御

  * Netlify Identityでユーザー認証を行える
* Forms

  * Netlify Formsを利用してAPIやJSを必要としないフォームの設置
* Functions

  * Netlify Functionsを使用することで、特定のイベントに対するトリガーの設置
* Large Media

  * 画像コンテンツを必要なサイズで提供し、リポジトリの肥大化を防ぐ
* API利用

## Netlifyの登録

[こちら]([https://www.netlify.com/](https://www.netlify.com/))のページにアクセスし、【Get started for free】をクリック

その後は、簡単に登録できるので説明に沿って登録を勧めてください。

登録が完了すると以下のようなホーム画面に遷移します。

![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252675/fad605ad-40b5-bba1-f122-96fcba1215c4.png)


## Githubにリポジトリを作成し、コードをプッシュする

![b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252675/01e9e6a1-7a58-0eaa-3876-b5a16f1a9c4c.png)


## 公開（リポジトリとNetlifyを紐付ける）

1. 先程のNetlifyのホームから【New site from Git】をクリック

   ![](https://ucarecdn.com/9f0d97a9-9b07-4f9b-b351-46a2fb0c8777/)
2. Githubをクリック
3. 自分のGithubのリポジトリ一覧が表示されるので、先程作成したリポジトリを指定する
4. Deploy siteをクリック

   ![](https://ucarecdn.com/d2b1d2b5-5ef9-4f36-ae7b-5871bc892419/)

たったこれだけの手順で静的サイトを公開することができます。

また、サブドメインであれば無料で変更することが可能です。

あとは、リポジトリにプッシュする度にビルド・デプロイを行うため、Vue,Reactなどを使った実装でも重宝しそうです。

## APIの作成

次にNetlify Functionsを使用して簡単なAPIを作成しようと思います。

### 環境構築

* [netlify-lambda](https://www.npmjs.com/package/netlify-lambda)を使ってローカルでNetlify Functionsを使用できるようにする

```shell
npm install netlify-lambda --save
```

package.jsonのscriptsを作成する
今回、APIのfunctionsのコードはapi/で管理するので以下になる。

```json:title=package.json
"scripts": {
  "dev": "netlify-lambda serve ./api",
  "build": "netlify-lambda build ./api"
}
```

* 設定ファイルの作成
  **netlify.toml**をルートに作成する

```toml:title=netlify.toml
[build]
  command = "npm run build"
  functions = "./functions/"
```

npm run devをすることでローカルでAPIの確認をすることが可能になる。
./api以下の.jsを./functions/以下にAPIのコードとして出力する。 

npm run buildは、pushされてNetlify側でビルドされるときに呼ばれる。

### 実装

* apiディレクトリを作成し、その中にファイルを作成する。
  ファイル名がAPIのエンドポイント名になるので注意！

```javascript:title=thanks.js
const thanksArgs = require("../data/thanksArgs.js");
exports.handler = async (event, context) => {
    if ("id" in event["queryStringParameters"]) {
        let id = Number(event["queryStringParameters"]["id"]);
        try {
            let thank = await findThank(id);
            console.log(JSON.stringify(thank))
            return {
                statusCode: 200,
                body: JSON.stringify(thank)
            };
        }catch (e){
            return {
                statusCode: 404,
                body: JSON.stringify({
                    statusCode: 404,
                    message: "Not Found."
                })
            }
        }
    }
    return {
        statusCode: 400,
        body: JSON.stringify({
            statusCode: 400,
            message: "Bad Request."
        })
    }
};
function findThank (id) {
    let thank = thanksArgs.find(item =>item.id === id);
    if ( thank === undefined ) {
        throw new Error
    }
    return thank;
}
```

```javascript:title=thanksArgs.js
module.exports = [
    {
        id: 1,
        text: "Thank You!"
    },
    {
        id: 2,
        text: "Tnank You Very Match!"
    },
    {
        id: 3,
        text: "Thank you for your growth!"
    },
    {
        id: 4,
        text: "Thank you for watching to the end."
    },
    {
        id: 5,
        text: "Thank you. Look forward to tomorrow."
    },
]
```

* ローカルで確認する。

```shell
npm run dev
```

を実行し、

```
http://localhost:9000/.netlify/functions/thanks?id=1
```

にアクセスするとレスポンスが返る。

```json
{"id":1,"text":"Thank You!"}
```

### リポジトリをpushしてNetlifyの確認

Netlifyの【設定画面＞Functions】へ行くと、先程のapi/以下に設定したthanks.jsが作られている。

![c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252675/9a6cd034-9329-e374-cbd0-4d5eb629d519.png)


以下にアクセスるとレスポンスの確認ができた！
Functions logには、APIのログが残る。

* https://niihara-advent.netlify.com/.netlify/functions/thanks?id=1
* https://niihara-advent.netlify.com/.netlify/functions/thanks?id=2
* https://niihara-advent.netlify.com/.netlify/functions/thanks?id=3
* https://niihara-advent.netlify.com/.netlify/functions/thanks?id=4
* https://niihara-advent.netlify.com/.netlify/functions/thanks?id=5

![d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252675/454f7250-5142-6c8e-46c5-3ebbc44c9bee.png)


## まとめ

今回、Netlifyを簡単に使ってみました。
様々なことが簡単に実装することができるので、アイディアがある方は、実際に動くものを短期間で作成することができるのではないでしょうか。
サーバーレスやこの様なサービスのお陰で手間が掛からない分、アイディアや行動力、設計などが重要になってきそうです。

ぜひ、みなさんもお時間のある時に触ってみてください！

- - -

* [Githubリポジトリ](https://github.com/niiharamegumu/demo-netlify)
* APIのエンドポイント → 
  https://niihara-advent.netlify.com/.netlify/functions/thanks?id=1
  （idは1~5）

- - -

以上。