AWS Lambda で APNs によるプッシュ通知

近年、モバイルアプリケーションの普及と共に、ユーザーエンゲージメントを高めるための新たな手段が求められています。その中でも、プッシュ通知は効果的なコミュニケーション手段として広く活用されています。アプリユーザーに対して重要な情報をリアルタイムで届け、ユーザーエクスペリエンスを向上させることが期待されています。

AWS Lambdaは、クラウド上でサーバーレスなアプリケーションを実現するための革新的なサービスとして注目されています。本記事では、AWS Lambdaを使用して、Apple Push Notification Service (APNs)を活用したプッシュ通知を実現する方法に焦点を当てます。この組み合わせには多くの有用性があり、開発者やビジネスにとって様々なメリットが存在します。

メリット

サーバーレスなアーキテクチャの柔軟性

AWS Lambdaを使用することで、サーバーレスなアーキテクチャを構築することができます。サーバーレスなアーキテクチャは、リソースの自動スケーリングやメンテナンスの軽減など、開発者がアプリケーションのロジックに集中できる利点があります。これにより、開発者はインフラストラクチャの管理に時間を費やすことなく、より効率的にプッシュ通知の実装に取り組むことができます。

コストの最適化とスケーラビリティ

AWS Lambda は従量課金制であり、実際の実行時間に対してのみ課金されます。このため、通知の送信が少ない場合は低いコストで運用でき、通知の需要が増加した場合でも自動的にスケーリングされるため、柔軟で経済的な運用が可能です。これにより、開発者はインフラストラクチャの設計や調整に頭を悩ませることなく、アプリケーションの成長に対応できます。

このような有用性から、AWS Lambda を活用した APNs によるプッシュ通知は、モバイルアプリケーション開発において強力なツールとなっています。次のセクションでは、実際に AWS Lambda を使用してAPNsを導入する手順について詳しく掘り下げていきます。

本記事では主に AWS Lambda (Python 3.9) の設定に焦点を当てています。そのため、 APNs を使用するには、予め必要な pem ファイル(p12 証明書ファイルを変換したもの)をご用意いただく必要があります。また、今回の手順はMacを使用していることを想定していますので、お手元の Mac をご準備いただき、さらに AWS Lambda のレイヤー作成に必要なファイルは Docker を利用しますので、事前に Mac に Docker をインストールしておいてください。次のセクションで具体的な AWS Lambda の設定手順を詳しく解説していきます。用意ができましたら、一緒に進めていきましょう。

AWS Lambda レイヤー作成

AWS Lambda レイヤーの作成には、今回は「apns2」というライブラリを使用します。ただし、このライブラリはAWS Lambdaで直接サポートされていないため、事前にレイヤーを作成する必要があります。以下に、具体的な手順を順番に実行していきましょう。

  1. ホームディレクトリに python-lib フォルダを作成します。
> cd ~ && mkdir python-lib && cd python-lib
  1. requirements.txtファイルを作成し、「apns2」とだけ記述します。
> echo 'apns2' > requirements.txt
  1. Dockerイメージ(amazon/aws-sam-cli-build-image-python3.9)を利用して、指定したフォルダに必要なライブラリをインストールします。
> docker run -v "$PWD":/var/task "amazon/aws-sam-cli-build-image-python3.9" /bin/sh -c "pip install -r requirements.txt -t python/lib/python3.9/site-packages/; exit"
  1. 最後に、apns2.zipファイルに圧縮します。
> zip -r apns2.zip python

これで、ホームディレクトリにpython-libが作成され、その中にapns2.zipファイルが用意されます。

これをAWS Lambdaコンソールからレイヤーとして作成します。左側のメニューから「レイヤー」を選択します。次に画面右にある「レイヤーの作成」ボタンをクリックします。

「レイヤーの作成」の画面では、レイヤー名を入力します。ここでは「apns2」としました。また先ほどのファイルを「アップロード」ボタンをクリックしてアップロードします。また「apns2.zip」は Python 3.9 で作成したので、ランタイムも Python 3.9 を選択します。そして最後に「作成」ボタンをクリックします。

これにより、AWS Lambdaコンソール上で「apns2」という名前のレイヤーが Python 3.9 ランタイムで作成され、apns2.zipファイルが正常にアップロードされましたね。これで、Lambda関数内でこのレイヤーを利用して、APNs関連の処理を行うことができます。

AWS Lambda 関数作成

それでは AWS Lambda 関数を作成しましょう。
AWS Lambdaコンソール の左から「関数」を選択し、画面右にある「関数の作成」をクリックします。

「関数の作成」の画面では、関数名を入力します。ここでは「push_notification_with_apns2」としました。作成したレイヤーが Python 3.9 ですので、ここでもランタイムは Python 3.9 とします。そして最後に「関数の作成」ボタンをクリックします。

関数の作成が完了したら、次はAWS Lambdaで処理するファイルを用意します。まず、「コード」タブを選択し、プロジェクトのルートディレクトリで右クリックし、「New File」から「apns.pem」ファイルを作成します。このファイルには、事前に用意していたpemファイルの内容をコピー&ペーストなどで書き込んでください。

次に、「lambda_function.py」の内容を記述します。以下は、複数のデバイスにプッシュ通知を送信するためのソースコードの例です。tokensにはデバイスから得られたトークンをリストで記述してください。また、topicも適切に変更してください。

import json

from apns2.client import APNsClient, Notification
from apns2.payload import Payload, PayloadAlert


def lambda_handler(event, context):
    title = 'プッシュ通知テストタイトル'
    body = 'プッシュ通知テストメッセージ'
    tokens = [
        '1234567890123456789012345678901234567890123456789012345678901234',
    ]

    messages = [
        Notification(
            token=token,
            payload=Payload(alert=PayloadAlert(title=title, body=body), sound='default')
        ) for token in tokens
    ]

    topic = 'jp.co.tks2.xxxxx'
    client = APNsClient('apns.pem', use_sandbox=True, use_alternative_port=False)
    response = client.send_notification_batch(messages, topic)
    print('response: ', response)

    return {
        'statusCode': 200
    }

ソースコードの記述が終わったら、「Deploy」ボタンをクリックして変更を保存します。これにより、最新のコードがLambda関数にデプロイされます。

次に、この関数にレイヤーを追加します。「コード」タブを一番下までスクロールすると「レイヤー」の項目が表示されます。その右にある「レイヤーの追加」ボタンをクリックします。

「レイヤーを追加」画面では、「カスタムレイヤー」を選択し、作成したレイヤー「apns2」およびバージョン「1」を選択した後、「追加」ボタンをクリックします。

これで準備は整いましたが、このまま実行するとタイムアウトしてしまう可能性があります。そのため、タイムアウトの値をもう少し長く設定しましょう。「設定」タブを選択し、「編集」ボタンをクリックして、タイムアウトの値を適切な長さに設定します。

それでは、実際に実行してみましょう。「テスト」タブを選択し、「テスト」ボタンをクリックします。正常に実行されると、「実行中の関数: 成功」と表示されます。

まとめ

今回は、AWS Lambdaを利用してAPNsを用いたプッシュ通知の手順を解説しました。これにより、AWS Lambda上で効率的かつ柔軟なAPNs連携が可能となり、近年求められているマイクロサービス化に貢献します。ただし、紹介したソースコードは単純なプッシュ通知の送信のみを対象としており、実際の利用に際しては必要に応じてソースコードを適切に変更してください。