4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

記事投稿キャンペーン 「2024年!初アウトプットをしよう」

[Lambda][FCM]LambdaからFlutterアプリに向けたPush通知を実行する

Posted at

FCM経由でFlutterアプリにPush通知を送るにあたり、Lambda(それもPython)を使った記事が少ないと感じたので投稿します。

はじめに

FCMコンソール側の設定・Flutterアプリ側の実装は世の中にHowToが溢れているので割愛します。

LambdaでFirebase Admin SDKを使用した、Push通知送信リクエスト実行方法のみ記載したいと思います。
なんでわざわざLambdaなのかと言われると、単にAWSで他のサービスを利用しているため選択肢に挙がったまでです。

スクリーンショット 2024-01-05 16.55.26.png

前提条件

①Flutterアプリ側でFCMからエンドポイントを取得済(Flutterアプリ側以下のソースで取得できます)

final fcmToken = await FirebaseMessaging.instance.getToken();

②Firebaseコンソール>Firebaseプロジェクトの設定>サービスアカウントより、秘密鍵を取得済

serviceAccountKey.jsonという名前でダウンロードされます。

①Lambda Layerの作成

Lambda Layerとは、複数のLambda関数に適用が可能な共有ロジックのようなものです。
Firebase Admin SDKを包含するLayerを作成し、それをLambda関数に読み込ませるために作成します。

▼Firebase Admin Python SDKの取得
今回はPythonで実行環境を作ります。

sudo pip install firebase-admin

あるいはサイトからダウンロードもできます

インストールしたディレクトリを
python/firebase-admin/という構成にしてzipにします。
※Lambda Layerでは読み込めるファイルのパスが決まっているため

▼Layerの新規作成

スクリーンショット 2024-01-05 17.35.50.png

AWS Lambdaに移ります。
サイドバーの[レイヤー]→[レイヤーの作成]→.zip ファイルをアップロードで先ほど作成したfirebase-admin が内包されたzipファイルをアップロード
また、互換性のあるランタイムに任意のPythonバージョンを追加します。

今回はfirebase_admin_layerという名前にしました。

スクリーンショット 2024-01-05 18.06.34.png

これでLayerの作成は完了

②Lambda 関数の作成

▼Lambda 関数の準備

引き続き、AWS Lambdaです。
サイドバーの[関数]→[関数の作成]→[一から作成]を選択
ランタイムを任意のPythonバージョンに設定します。

作成した関数を開き、[コード]タブの一番下
レイヤーを設定する項目があります。

スクリーンショット 2024-01-05 17.45.14.png

[レイヤーの追加]→[カスタムレイヤー]から、①で作成したLayerを選択します

設定周りはこれで完了

▼コードの作成

Lambda関数でのコードの作成に移ります。
Push通知送信リクエストです。

lambda_function.pyの内容を以下にベタ貼りします。
※動作確認済


import firebase_admin   # Layerを追加しているためfirebase_admin SDKが使用できる
from firebase_admin import credentials
from firebase_admin import messaging

##デバイスに通知を送る
def lambda_handler(event, context):
    
    if not firebase_admin._apps:
        cred = credentials.Certificate("serviceAccountKey.json") #事前準備②
        firebase_admin.initialize_app(cred)
    
    
    # This registration token comes from the client FCM SDKs.
    registration_token = "エンドポイントが入ります" #事前準備①

    
    # See documentation on defining a message payload.
    
    message = messaging.Message(
        notification=messaging.Notification(
            title='test server',
            body='test server message',
            
        ),
        token=registration_token,
    )
    
    # Send a message to the device corresponding to the provided
    # registration token.
    response = messaging.send(message)
    
    # Response is a message ID string.
    print('Successfully sent message:', response)

lambda_function.pyと同一の階層にserviceAccountKey.jsonという名前でファイルを新規作成し、事前準備②でダウンロードした秘密鍵の内容をそのままペーストしすべての準備OK

動作確認

Lambda関数を実行すると、エンドポイントに紐づくアプリにPush通知が表示されます
これにて送信リクエスト成功。

Lambda関数の設定で[関数 URL を有効化]すれば、少ない修正でAPI化できますね。
もちろんAPI Gatewayを使うのもよし。

仕事でPush通知に関してはかなり調査したので、また記事にしたいですねえ

参考

4
2
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
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?