1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[GCP] CloudFunctionsを使って指定日にLINE送信する仕組みを作ってみた [無料]

Last updated at Posted at 2022-03-20

こんにちは、毎週火曜日の夕方にオンラインサロンのslackを確認をしないといけない用事があるけど忘れちゃうのでLINE(こちらもGoogleじゃな以下略)に通知したいな〜、お手軽に無料でできないかな〜ということで、
GCPとLINEmessagingAPIを使って無料で定時にLINE送信するシステムを、ちゃんとGCPのベストプラクティスに沿って作っていくよ!

アーキテクチャ

アーキテクチャはこんな感じ
スクリーンショット 2022-03-20 20.11.22.png

アーキテクチャのポイント

1. CloudPubSubトリガーで起動

CloudFunctionsはhttpアクセスをトリガーにして実行することもできますが、賢い人たちにはURLを容易に特定されてしまいます。意図せぬ大量アクセスによる課金を防ぐため、PubSubをトリガーにした安心な構成にしています。

2. 秘密情報はSecretManagerで管理

LINEmessagingAPIのtokenなどの、流出すると困る大事な情報はSecretManagerに登録して、CloudFUnctionsで呼び出すのがベストプラクティス!
バージョン管理にも対応してるので、定期的にローテーションして保守性を高めることもできます。
SecretManagerのベストプラクティス詳細

LINE系設定

まずLineのアカウントを作成します。

1. Line Developersに登録

LineでPush通知を行うためにはLine Developersへの登録が必要です。
以下から登録してください。
https://developers.line.biz/

2. Lineチャネルの作成

新しいチャネルの作成から「Messaging API」をクリックしてチャネルを作成してください。
スクリーンショット 2022-03-20 12.44.26.png
「Messaging API」タブの中にあるQRコードを読んで、おともだちになってください。
同じページの最下部にtoken発行ボタンがあるので、tokenを発行してください。
スクリーンショット 2022-03-20 12.44.48.png
※tokenは流出させないように気をつけてね!!

無料枠:月1000通まで無料

2022年3月現在、月1000通まで無料で送信することができます。
個人の通知用で使う分には十分かな。
https://at.line.me/jp/plan

GCPの設定

ここからはGCPで設定をしていきます。
アカウントを持っていない人は作成してね。

1. Pub/Subでtopicの作成

サイドメニューからPub/Sub画面に遷移します。
適当な名前をつけて「トピックを作成」をクリックすると、topicが作成されます。
スクリーンショット 2022-03-20 13.15.34.png

無料枠:月10GBのメッセージ送信まで無料

https://cloud.google.com/free/docs/gcp-free-tier/#pub-sub
10GBと言われても全然ピンとこない情報処理弱者な私なので、ちょっと計算してみた。
「UTF-8で日本語はだいたい1文字3バイト!」とどこかのブログで言っていたので
1GB は 1e+10バイトで、1e+10は100億だから、
100億➗3 = 33.3億文字送信できます!!
スクリーンショット 2022-03-20 20.48.59.png

2. Cloud Schedulerでジョブの作成

サイドメニューからCloud Scheduler画面に遷移します。
画面上部の「ジョブを作成」から先ほど作成したPub/Subトピックを呼び出すジョブを作成します。
毎週火曜日の18時にLINEを送信したいので、このように設定しました。
スクリーンショット 2022-03-20 13.26.37.png

無料枠:月3ジョブまで無料

こちらはちょっと数が少ないので、有効に使わないとですね。
https://cloud.google.com/scheduler?hl=ja

3. Secret Managerでシークレットの作成

先ほど作成したLINE Messaging APIのtokenを登録します。
サイドメニューからSecret Manager画面に遷移します。
画面上部の「シークレットを作成」から適当な名前をつけて「シークレットの値」にtokenを入力して「シークレットを作成」をクリックします。
スクリーンショット 2022-03-20 13.31.18.png

無料枠:月6個のアクティブシークレットバージョンまで無料

正確にはこんな感じ

6 個のアクティブ シークレット バージョン(1 か月あたり)
10,000 回のアクセス オペレーション(1 か月あたり)
シークレット ローテーション通知: 1 か月あたり 3 回
https://cloud.google.com/free/docs/gcp-free-tier/#secret-manager

4. サービスアカウントの作成

CloudFunctionsからSecretManagerにアクセスするための、サービスアカウントを作成します。
左メニューの「IAMと管理」内の「サービスアカウント」に遷移します。
画面上部の「サービスアカウントを作成」をクリックし、ロールに「Secret Managerのシークレットアクセサー」を付与します。
スクリーンショット 2022-03-20 15.52.33.png

5. Cloud Functionsの作成

サイドメニューからCloudFunctions画面に遷移します。
上部の「関数を作成」をクリックします。

5.1. トリガー設定

適当な関数名をつけて、トリガーに先ほど作成したPub/Subを設定します。
スクリーンショット 2022-03-20 19.17.20.png

5.2. ランタイムサービスアカウント設定

ランタイムサービスアカウントに先ほど作成したSecretManagerへのアクセス権限を付与したサービスアカウントを設定します。
スクリーンショット 2022-03-20 19.15.34.png

5.3. 処理の設定

ソースはこんな感じ

main.py
import base64
import json
import requests
from google.cloud import secretmanager

def hello_pubsub(event, context):
    # pubsub_message = base64.b64decode(event['data']).decode('utf-8')
    # print(pubsub_message)

    # secretmanagerからtoken取得
    token = access_secret_version()

    # LINE送信
    send_line(token)


def access_secret_version():
    # Create the Secret Manager client.
    client = secretmanager.SecretManagerServiceClient()

    # Build the resource name of the secret version.
    name = f"projects/{プロジェクト番号}/secrets/token_line_notice/versions/latest"

    # Access the secret version.
    response = client.access_secret_version(request={"name": name})

    # Print the secret payload.
    payload = response.payload.data.decode("UTF-8")

    return payload

def send_line(token):
    # header
    headers = {
        'Content-Type': 'application/json',
        'Authorization': f'Bearer ' + token
    }

    # message
    message = {
        'messages':[
            {
                'type': 'text',
                'text': 'サロンのSlackをチェックしてね!'
            }
        ]
    }
                
    # LINE API アクセス
    requests.post('https://api.line.me/v2/bot/message/broadcast', headers=headers, data=json.dumps(message))

※「{プロジェクト番号}」には皆さんのGCPのプロジェクト番号を入力してください。
ライブラリの読み込みはこんな感じ

requirements.txt
google-cloud-secret-manager>=2.7.2

無料枠:月200万回の呼び出しまで無料

正確にはこんな感じですが、週1回の呼び出しなので、余裕ですね!

200 万回の呼び出し(1 か月あたり、バックグラウンド呼び出しと HTTP 呼び出しを含む)
400,000 GB 秒、200,000 GHz 秒のコンピューティング時間
5 GB の下り(外向き)ネットワーク(1 か月あたり)
https://cloud.google.com/free/docs/gcp-free-tier/#cloud-functions

実際に動かしてみる

サイドメニューからCloud Scheduler画面に遷移して「今すぐ実行」をクリック
スクリーンショット 2022-03-20 13.56.29.png

LINEが送信されればOK

スクリーンショット 2022-03-20 20.13.57.png

以上!

GCPを使えば無料で簡単にLINE通知システムが作れちゃうので、
みんなもGoogleを活用してみましょう!

1
3
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
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?