---
title: "Cloud FunctionsでSlack通知をする関数を作る | grasys blog"
url: "https://blog.grasys.io/post/fukushima/firststep_gcf"
description: "どうも初めまして。grasysの福嶌です。 今回は初歩的な内容ですがご愛嬌ということで。 先日行いましたセミナーの記事 - ‘GCEとGKEのアーキテクチャを一挙公開――GCP活用のコツをgrasys 長谷川祐介氏が伝授’ を見る機会あったのでちょっとしたことをやってみようと思いました。 記事の中で解説されていますが…"
---

# Cloud FunctionsでSlack通知をする関数を作る

-   ![](/_astro/noicon.CTHOhNiB_1HMs6A.webp)[fukushima](/authors/fukushima/)
-   公開日：2019年8月9日
-   カテゴリー：[Tech](/categories/tech/)
-   タグ：[#Cloud Functions](/tags/cloud-functions/)

![Cloud FunctionsでSlack通知をする関数を作る](/_astro/og-image.DDSiu2Ny_XHpDd.webp)

どうも初めまして。grasysの福嶌です。  
今回は初歩的な内容ですがご愛嬌ということで。

先日行いましたセミナーの記事 - ‘[GCEとGKEのアーキテクチャを一挙公開――GCP活用のコツをgrasys 長谷川祐介氏が伝授](https://enterprisezine.jp/article/detail/12206)’ を見る機会あったのでちょっとしたことをやってみようと思いました。

記事の中で解説されていますが弊社のコーポレートサイトとブログサイトにGoogle Cloud (GCP) Storage(以下GCS)を利用しているのでGoogle Cloud (GCP) Functions(以下GCF)で何かできないかなと思いGCFを触ってみました。

## 今回のゴール

GCSの変更をトリガーにしてGCF使いslackにスクレイピング内容を通知できるようにする

### GCFとは？

GCPで関数を実行するためのサービス(サーバーレス)、詳しくは[公式のドキュメント](https://cloud.google.com/functions/docs/concepts/overview?hl=ja)へ！

### 作ってみた

自分の考えたロジックは以下のようになりました。

![作ってみたの画面](/_astro/01-func_chart-1024x553-a7247125.BFC6G16f_Z219JC9.webp)

考えるまでもなくとてもシンプルですねー  
作成したFunctionsのコードは以下のようになります。ここで注意しなければいけないのは実行したい関数のエントリーポイントは`main.py`にしないといけない点です。

Plain textcontent\_copy

```
#!/usr/bin/env python
#coding:utf-8

import requests, json
from bs4 import BeautifulSoup

# スクレイピングを行いデータを抽出する関数
def create_text(url):
    """
    BeautifulSoupを利用してスクレイピングをする。
    スクレイピングには作法やルールがあるためここでサンプルコードを載せるのは割愛
    """
    return msg

# Cloud Functionsでデプロイする関数
def cloud_func_gcs(event, context):
    targetURL = "{スクレイピングを行うWEBサイトのURL}"
    Webhook = "{WebhookURL}"
    # 指定したファイルのイベントかどうかの判定
    if content['name'] == "index.html":
      requests.post(Webhook , data = json.dumps({
          'text': create_text(targetURL),
          'username': 'grasys news',
          'icon_emoji': u':herb:',
          'link_names': 1,
      }))
```

今回は簡単な関数なので1ファイルにしていますが応用して以下のようにパッケージを分ける構成でも実行は可能です。

Plain textcontent\_copy

```
├── main.py
├── requirements.txt
├── package1
│   ├── hoge.py
│   └── fuga.py
└── package2
    └── piyo.py
```

##### デプロイ

デプロイは以下のコマンドでできます。  
何か変な箇所やビルドが失敗したらエラーがStackdriver Loggingで確認できるのでコツコツと修正していきましょう。  
自分は関数のファイル名が`main.py`じゃないぞと言われました。

試行錯誤→デプロイしながらを繰り返すとバージョンがどんどん上がっていきます(汗)

Plain textcontent\_copy

```
$ gcloud functions deploy {EntryPoint} \
  --runtime python37 --stage-bucket {BUCKET} \
  --trigger-bucket {BUCKET} \
  --region asia-northeast1
```

各オプションの説明ですが  
`--runtime`は実行する言語の指定になります。今回はPython 3.7を利用します。  
`--stage-bucket`はfunctionsのソースコードをあげるバケットの指定になります。  
`--trigger-bucket`はどのGCSバケットをトリガーとするかの指定になります。  
`--region`はどこのリージョンを利用するか

その他、詳しくは`--help`に書いてる。

##### 動作確認

試しに弊社のコーポレートサイトをスクレイピングして最新情報を通知する関数を試してみました！ (更新タイミングに出会えなかったのでストレージはコーポレートサイトとは違うストレージを利用しました(^\_^;))  
そんなこんなで実行した結果以下のようになりました。

![動作確認の画面](/_astro/02-21-2-1024x238-8e3ce6e5.DSkTYgda_ZkOt0C.webp)

動作してますねー

### まとめ

今回はslackのWebhookを叩いて通知するということをしましたが  
LINE Messaging APIやTwitterなどにも利用できそうですね。夢が広がりんぐ  
ただ今回、一点懸念点で考えたのことはスクレイピングする対象箇所以外(例として弊社コーポレートサイトだと最新情報以外)が変更されてもトリガーを引いてしまいます。これはHTML側にhidden属性をつけて日付を入れて関数の方で日付の判定を行えば大丈夫かなと思いました。  
最後にCloud Functionsには様々な[イベントとトリガー](https://cloud.google.com/functions/docs/concepts/events-triggers?hl=ja)があるので上記以外にもたくさん使えそうですね！

それでは！アディオス！

* * *

![grasysの積極採用中バナー](/_astro/01-S__26386448-4-1024x513-6041d554.Cqu_hJVy_Z2hi9KC.webp)

## この記事を書いた人

[![](/_astro/noicon.CTHOhNiB_Z24aAgM.webp)](/authors/fukushima/)

### [fukushima](/authors/fukushima/)

fukushimaのプロフィールと執筆記事をご覧いただけます。

[プロフィールと記事一覧](/authors/fukushima/)