1
0

More than 3 years have passed since last update.

【Netlify functions】Netlifyでデプロイ成功したらSlackにメッセージを投稿する

Last updated at Posted at 2021-01-21

Netlify functionsでSlackにメッセージを投稿するAPIを作成した際の忘備録です。

やりたい事

NetlifyでホスティングしているWebページのデプロイが成功したら、Slackにメッセージを投稿する。

ちなみに、Netlifyの有料プランならSlack notificationsで簡単に設定できるようです。
(以前は無料プランでも使えていた…?)

Netlify functionsとは

  • AWS LambdaをNetlify上で使えるようにしたもの(AWSアカウント不要)
  • JavaScript または Go で書ける。
  • 無料プランでは、リクエスト数125,000/月と制限がある

:warning: リクエスト数の上限を越えると、自動的に次のレベルまたはパッケージにアップグレードされるようなので注意!

構成

  • ホスティング: Netlify
  • SSG: Next.js
  • ソース管理: Github

フローとしては、次の通りです。
1. Next.jsで静的出力したソースをGithubリポジトリへプッシュ
2. Githubへのプッシュをトリガーに、Netlifyが自動ビルド&デプロイ
3. デプロイが成功したら、Slackに「デプロイが成功しました」とメッセージ投稿

前提条件

  • NetlifyとGitリポジトリの連携設定が完了している
  • メッセージを投稿したいSlackチャンネルが既に用意されている

環境

  • macOS Mojave 10.14.6
  • Next.js 9.4.4
  • Node.js v12.12.0

実装

1. Slackでの設定

SlackのIncoming Webhook URLを取得します。

Incoming Webhook URL作成方法
  1. Slackにログインした状態で https://slack.com/services/new/incoming-webhook にアクセス
  2. 通知を送りたいチャンネルを選択し、「Incoming Webhookインテグレーションの追加」ボタンを押す
  3. 作成されたWebhook URLをコピーして控えておく

2. APIの作成

※今回はNext.jsを使用しているので、ディレクトリ構成などはNext.jsの仕様に従っています。

2-1. 必要なnpmパッケージのインストール

ターミナル
yarn add node-fetch
yarn add netlify-lambda

2-2. /functions/slack.jsを作成

先ほど作成したWebhook URLへPOSTリクエストを投げるAPIを作ります。

slack.js
import fetch from "node-fetch";

exports.handler = async (event, context) => {

  if (event.httpMethod !== "POST") {
    return { statusCode: 405, body: "Method Not Allowed" };
  }

  return fetch(process.env.SLACK_WEBHOOK_URL, {
    headers: {
      "content-type": "application/json"
    },
    method: "POST",
    body: JSON.stringify({ text: `デプロイが成功しました` })
  })
    .then(() => ({
      statusCode: 200,
      body: `Your message has been sent to Slack.`
    }))
    .catch(error => ({
      statusCode: 422,
      body: `Oops! Something went wrong. ${error}`
    }));
};

2-3. Netlify functionを生成するnpmコマンドの追加

以下のようにlambda-buildコマンドを追加します。

package.json
"scripts": {
  "dev": "next dev",
  "build": "next build && next export",
  "start": "next start",
  "export": "next export",
  "lambda-build": "netlify-lambda build functions/"
}

コマンドを追加したら、lambda-buildを叩きます。

ターミナル
yarn lambda-build

すると、先ほど作成した/functions/slack.jsがビルドされ、/apiに吐き出されます。

2-4. APIディレクトリの設定

どのディレクトリに格納されているファイルをNetlifyがAPIとして認識するかをnetlify.tmlファイルで設定します。(この設定は恐らくNetlifyダッシュボードからでも可能)
今回だとapiディレクトリを指定します。

/netlify.tml
functions = "api"

3. Netlifyダッシュボードでの設定

3-1. 環境変数の設定

NetlifyダッシュボードからSettings > Build & Deploy > Build environment variablesと進み、SlackのWebhook URLを環境変数として設定します。
スクリーンショット 2021-01-21 16.52.54.png

3-2. Netlifyのイベント設定

このイベントが発生したら、このサーバーレス関数呼んでね!という設定をします。

  1. 「Site settings」を開き、
    メニューからBuild & deploy > Deploy notifications を選択

  2. 「Add notification」のプルダウンからOutgoing webhookを選択

  3. 「Event to listen for」でイベント発火のトリガーを選択
    今回はデプロイ成功時(Deploy succeeded

  4. 「URL to notify」にはAPIのエンドポイントを設定します。
    スクリーンショット 2021-01-21 16.55.59.png

:bulb: Netlify functionsのエンドポイントについて

https://ドメイン/.netlify/functions/APIファイル名

例)
サイトのURLがhttps://hoge-hoge.netlify.app
APIプログラムのファイル名がslack.jsだとすると、

APIエンドポイントは
https://hoge-hoge.netlify.app/.netlify/functions/slack となる。

動作確認

Gitリポジトリへpushし、Netlifyでのビルド・デプロイが成功すると…
スクリーンショット 2021-01-21 17.02.18.png
無事に通知がきました〜!

参考

https://docs.netlify.com/functions/overview/
https://functions-playground.netlify.app/

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0