F.Ko-Jiの「一秒後は未来」

Amazon Simple Notification Service(Amazon SNS)をPHPから使ってみる

Amazon Web Servicesの中にAmazon Simple Notification Service (Amazon SNS)という通知サービスがあります。今年の4月に発表されたものです。

» アマゾン、クラウドサービスにメッセージ送信機能「Amazon SNS」を追加:ニュース – CNET Japan

アプリケーションなどからAmazon SNSに「トピック」を作成し、そのトピックにユーザーが「Subscribe」します。そしてアプリケーションがトピックに対して「publish」すると、トピックをSubscribeしているユーザーすべてに通知が届くという仕組みです。

Meityの更新通知の仕組みとして使えるかなと思って調べていたので、その際に利用したPHPのライブラリとサンプルコードを紹介しておきます。

ライブラリは「ukd1’s Amazon-SNS-client-for-PHP at master – GitHub」にひとつ公開されていたので、これを使ってみました。

  • class.amazon_sns_helper.php
  • class.amazon_sns_topic.php
  • class.amazon_sns_subscriber.php

ライブラリには上の3つのファイルがあります。

準備

準備としてAmazon Web Servicesを利用するためのアクセスキーとシークレットキーを取得しておく必要があります。

仮に config.php というファイルにそれらを定義しておきます。

<?php
// アクセスキー
define('AWS_ACCESS_KEY', 'your amazon access key');
// シークレットキー
define('AWS_PRIVATE_KEY', 'your amazon secret key');

トピックを作成する

amazon_sns_topic::create()でトピックを作成します。作成が成功するとgetArn()でトピックのリソース名を取得できます。

<?php
require_once('config.php');
require_once('class.amazon_sns_helper.php');
require_once('class.amazon_sns_topic.php');

$topic = amazon_sns_topic::create('topic title');
echo 'ARN:' . $topic->getArn();

ARNは「arn:aws:sns:us-west-1:xxxxxxxxxxx:topic-title」のような形式です。

トピックのSubscribe(購読)

次にSubscribeですが、ここではメールでの購読サンプルを紹介しておきます。

require_once('config.php');
require_once('class.amazon_sns_helper.php');
require_once('class.amazon_sns_topic.php');
require_once('class.amazon_sns_subscriber.php');

$topic = new amazon_sns_topic('先ほど取得したARN');
$subscriber = amazon_sns_subscriber::create($topic, 'メールアドレス');

トピックの作成時に取得したARNを引数にして amazon_sns_topic クラスのオブジェクトを生成、そのオブジェクトと通知を受けたいメールアドレスを引数に、amazon_sns_subscriber::create()を実行します。

これを実行すると確認メールが届きます。

amazon-sns-mail-1.gif

↑ 確認メール。「Confirm subscription」をクリックする。

amazon-sns-mail-2.gif

↑ これで登録完了。

トピックのPublish

トピックの更新を通知するには、先ほどと同様にARNを引数にして amazon_sns_topicのオブジェクトを作成し、publish()メソッドにSubjectと本文をセットして実行します。

require_once('config.php');
require_once('class.amazon_sns_helper.php');
require_once('class.amazon_sns_topic.php');

$topic = new amazon_sns_topic('先ほど取得したARN');
$topic->publish(mb_encode_mimeheader('タイトル', 'ISO-2022-JP'), '本文');

日本語のSubjectを設定する場合は mb_encode_mimeheader でMIMEエンコードしておく必要があります。

実行すると、先ほど登録したメールアドレス宛てに AWS Notifications <no-reply@sns.amazonaws.com> から通知メールが届きます。

amazon-sns-mail-3.gif

↑ こんなメールが届く。

こんな感じでアプリケーションの更新通知を送ることができます。

気になったところ

このようにアプリケーション側でメール配信の仕組みを持たなくてもメール通知が簡単に実現できるのですが、確認メールや通知メールのFromがamazonのままだったり、確認メールの本文が英語だったりするので、いきなりアプリケーションからこんなメールが届くのは微妙かなと思います。

メールじゃなくてHTTPプロトコルの場合どうなるのかは、まだ調べていません。

ちなみにAPIドキュメントも公開されているので、これを見れば自分でライブラリを作ることもできるんじゃないかと思います。

» Amazon Simple Notification Service (Amazon SNS)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

著者について

fkoji

F.Ko-Ji

Webエンジニアやってます。最近は ドットインストール の開発がお仕事です。その傍ら、個人で Meity電車遅延なう梅酒.in#グラドル自画撮り部 の部室といったネットサービスを開発・運営してます。梅酒と草野球とリアル脱出ゲームが好きです。

» 詳しいプロフィールや運営サービスの一覧など