Memo

メモ > サーバ > サービス: AWS > SNS

■SNS
※メールに通知する場合、 「トピック作成 → AWSにメールアドレス登録 → AWSから送信される英語メールでURLをクリックして送信承認」 という承認が必要なフローとなるので注意 通常のメール送信の代替になるものではないみたい。関係者への一斉通知などに使うものみたい [基本操作]Amazon SNSでメールを送信する | Developers.IO https://dev.classmethod.jp/cloud/aws/amazon-sns-2017/ ■トピックの作成 Simple Notification Service → 今すぐ始める → トピック → 新しいトピックの作成 トピック名: SNS-Sample (半角英数字で入力) 表示名: SNSの動作テスト 入力したら「トピックの作成」をクリックする ■送信先の追加(Emailの場合) 作成したトピックを選択し、「アクション → トピックへのサブスクリプション」を選択する プロトコル: Email エンドポイント: (送信先となる任意のメールアドレス) 入力したら「サブスクリプションの作成」をクリックする 登録したメールアドレスに「AWS Notification - Subscription Confirmation」というメールが送信される 本文に記載されているURLをクリックすると「Subscription confirmed!」と表示され、承認される 追加したメールアドレスは、トピック一覧で「ARN」のリンクをクリックすると確認できる ■通知の作成と送信(Emailの場合) トピック一覧画面でトピックを選択し、「トピックに発行」ボタンを押す もしくは各々のトピックの画面で「トピックに発行」ボタンを押す 件名: Amazon SNS のテスト(メールの件名) メッセージ形式: Raw メッセージ: テスト。これは Amazon SNS のテストです。(メールの本文) と入力し、「メッセージの発行」ボタンを押す 登録したメールアドレスに対し、一斉にメールが送信される 届いたメールの最後には、以下の文言が挿入されている 前のURLは配信停止を行うためのリンク。クリックすると、メッセージの送信先から直ちに削除された
If you wish to stop receiving notifications from this topic, please click or visit the link below to unsubscribe: https://sns.ap-northeast-1.amazonaws.com/unsubscribe.html?SubscriptionArn=<URL略> Please do not reply directly to this email. If you have any questions or comments regarding this email, please contact us at https://aws.amazon.com/support
メッセージを変更したり削除したり…という機能は見当たらない ただしCLIから「トピック所有者のみ購読解除できる」という設定にできるみたい Amazon SNSのUnsubscribeのリンクを無効化する - Qiita https://qiita.com/mitsubachi/items/ac0bd90e15ce6098cb87 「その他トピックの操作」にある「トピックのポリシーの編集」や「トピックの配信ポリシーの編集」から設定できるかも?要調査 ■送信先の追加(HTTPの場合) プロトコル: HTTP エンドポイント: http://example.com/aws-sns/post.php 入力したら「サブスクリプションの作成」をクリックする なお、post.php にはあらかじめ以下を記述しておく post.txt も作成しておき、書き込み権限を与えておく
file_put_contents('post.txt', file_get_contents('php://input')); exit('OK');
サブスクリプション一覧に表示されたら、それに対して「リクエストの確認」を行う post.txt に以下の内容が記録された
{ "Type" : "SubscriptionConfirmation", "MessageId" : "079b5019-25a3-444e-a2a4-97f6e2755001", "Token" : "2336412f37fb687f5d51e6e241da92fd72d76856412a51e0d9c1e0c2b2f8910cb52e3563d2b095c292b263025a160cf0c180dde14d6e40577ee2736bf042f3b4db127384b2f1526966f79855f573ecfad373c2e26ca0934996c4fe3bb5be7f776bd242ae06e4ecbe5a94ebd928d56e226b31e659713311827387cf248b983444", "TopicArn" : "arn:aws:sns:ap-northeast-1:123456789012:SNS-Sample", "Message" : "You have chosen to subscribe to the topic arn:aws:sns:ap-northeast-1:123456789012:SNS-Sample.\nTo confirm the subscriptionDataBuilder, visit the SubscribeURL included in this message.", "SubscribeURL" : "https://sns.ap-northeast-1.amazonaws.com/?Action=ConfirmSubscription&TopicArn=arn:aws:sns:ap-northeast-1:123456789012:SNS-Sample&Token=2336412f37fb687f5d51e6e241da92fd72d76856412a51e0d9c1e0c2b2f8910cb52e3563d2b095c292b263025a160cf0c180dde14d6e40577ee2736bf042f3b4db127384b2f1526966f79855f573ecfad373c2e26ca0934996c4fe3bb5be7f776bd242ae06e4ecbe5a94ebd928d56e226b31e659713311827387cf248b983444", "Timestamp" : "2018-07-11T12:48:47.567Z", "SignatureVersion" : "1", "Signature" : "Od9wdcWzD6THORNxKZPRrmLUOVda3sTXU6ArwgblXitZfXOP/D+s+qlKq28euDRvdUGUddYl7C8W/IWZE/OQ0JYG0ttt4g1M0kqd9jtuHhW4kYuvrY4uFVVLpJFgzw+jtwBsVDGS1tHkQpgpEFghupv7jqYPr8BxVpRXXgaLtdMqlQmRH/lTjo+HITVhY0bHSG+9fAOLCDmX+LfJuJ82lLgu/1qnz5YvooPhVnqXTrAdqWsHmFrA4xsR9+4HgbQrmp6G430kq2OJK+KJ1RSTwrKoSQaaep5c8s9wkuouwW7IGK5HAcc668g5+1GDzynvsSg5FlE+V5ZptT+2b+ZWuw==", "SigningCertURL" : "https://sns.ap-northeast-1.amazonaws.com/SimpleNotificationService-eaea6120e66ea12e88dcd8bcbddca752.pem" }
「SubscribeURL」に表示されているURLをクリックすると、以下のXMLが表示された
<ConfirmSubscriptionResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/"> <ConfirmSubscriptionResult> <SubscriptionArn>arn:aws:sns:ap-northeast-1:123456789012:SNS-Sample:944c1604-8850-45bc-83f7-1fbf6039332c</SubscriptionArn> </ConfirmSubscriptionResult> <ResponseMetadata> <RequestId>880508cb-93cc-59af-82f2-5b0b93eadc77</RequestId> </ResponseMetadata> </ConfirmSubscriptionResponse>
これにより、登録したサブスクリプションが有効になった。これでEmailの場合と同様、認証できた状態 (実際は、「リクエストの確認」に対して自動でSubscribeURLにアクセスするようにプログラムを作成する) 以降はEmailとまったく同じ手順で、通知の作成と送信ができる メッセージを送信すると、post.txt に以下の内容が記録された
{ "Type" : "Notification", "MessageId" : "e9ee5726-caf2-555c-bc7b-04e6ca1bb18b", "TopicArn" : "arn:aws:sns:ap-northeast-1:123456789012:SNS-Sample", "Subject" : "HTTPテスト", "Message" : "テスト。\nこれはテストです。", "Timestamp" : "2018-07-11T12:57:13.404Z", "SignatureVersion" : "1", "Signature" : "hEZhRORitFvXUaDN/9vQTenHBXIAjEhGg+cx3GFYwvT2iBx3aEPI+Aioj8LhaRLwZQLDu71UMvhOlUNpHPnhFBWXarmn2zrgfbWcdaLfLWTyZpHk+G8gqQ2yTnkP7x0UL3KBfMSe7lY5NmsK+zpn2CnvHXLxoB+caSVhqw3BFCWHcVLxdguFQoLRmPqxJ6DfgyByQoJ6RipZndYMMjgNSbBwT4zIHN09z75wOsBuDiRyhOr6j+RTdPbRYz3J5vmzDcGloO2yZDWh6xrlQoyXPAihI5mtqmT+OOjQmADtyDaMBCewy6/493uOvC3WQRXcP8n4+lQ0kRlqjsSC4w97HQ==", "SigningCertURL" : "https://sns.ap-northeast-1.amazonaws.com/SimpleNotificationService-eaea6120e66ea12e88dcd8bcbddca752.pem", "UnsubscribeURL" : "https://sns.ap-northeast-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:ap-northeast-1:123456789012:SNS-Sample:944c1604-8850-45bc-83f7-1fbf6039332c" }
SigningCertURLにアクセスすると、メッセージの送信先から直ちに削除された Amazon SNS のHTTP(S)通知を試す - 続 カッコの付け方 http://iga-ninja.hatenablog.com/entry/2014/08/15/205625 ■SMSへの送信 Amazon SNSでメールとSMS通知を飛ばす | It works for me https://www.blog.danishi.net/2019/06/02/post-1360/ ※以下、上の解説に合わせてメールの送信から検証している ※トピックはメールとSMSで共通のものを使えるため、「トピック名に『Mail』や『SMS』を入れると不自然かもしれない」 □メールアドレスへの送信 Amazon SNS → トピック → トピックの作成 名前: Mail-Test 表示名: (空欄) 「トピックの作成」をクリックし、完了すると「Mail-Test」の画面へ遷移する 「サブスクリプションの作成」をクリック トピック ARN: (変更せず) プロトコル: Eメール エンドポイント: info@refirio.net (送信先のメールアドレス) 「サブスクリプションの作成」をクリック 「AWS Notification - Subscription Confirmation」という確認メールが送られてくるので、本文内のURLをクリックして承認する 「Subscription confirmed!」と表示されれば成功 トピックの画面に戻り、「メッセージの発行」をクリックする 件名: Test for Amazon SNS(日本語は不可) メッセージ構造: すべての配信プロトコルに同一のペイロード。 エンドポイントに送信するメッセージ本文: テストメッセージ。 「メッセージの発行」をクリックするとメールが送信される 以下のメールが届く
件名: Test for Amazon SNS 送信元: AWS Notifications <no-reply@sns.amazonaws.com> 本文: テストメッセージ。 -- If you wish to stop receiving notifications from this topic, please click or visit the link below to unsubscribe: https://sns.ap-northeast-1.amazonaws.com/unsubscribe.html?SubscriptionArn=xxxxxxxxxx Please do not reply directly to this email. If you have any questions or comments regarding this email, please contact us at https://aws.amazon.com/support
□SMSへの送信 引き続き、SMSへの送信を試す 「サブスクリプションの作成」をクリック トピック ARN: (変更せず) プロトコル: SMS エンドポイント: +819012345678 (送信先の電話番号) 「サブスクリプションの作成」をクリック SMSの場合、特に認証は無い トピックの画面に戻り、「メッセージの発行」をクリックする 件名: Test for Amazon SNS(日本語は不可) メッセージ構造: すべての配信プロトコルに同一のペイロード。 エンドポイントに送信するメッセージ本文: テストメッセージ2。 「メッセージの発行」をクリックするとメールが送信される 先に登録したメールアドレスにメールが届き、さらにSMSに以下のメッセージが届く
送信元: NOTICE 本文: テストメッセージ2。
SMSには件名は反映されないみたい □SMSへの送信元の名前を変更する AWS SNSを利用しSMS送信に任意の送信者名を利用する | Skyarch Broadcasting https://www.skyarch.net/blog/?p=13041 Amazon SNS → Mobile → テキストメッセージング(SMS) 「テキストメッセージングの優先設定」欄にある「編集」をクリック デフォルトの送信者 ID: Sample(日本語は不可) この状態でメッセージを発行すると、SMSでは送信元が「Sample」と表示される (メールの内容には反映されない) □SMSの文字数制限 何文字まで送信可能?SMSで送信できる文字数を徹底解説 | SMS送信サービス「空電プッシュ」 https://www.karaden.jp/column/sms-word-count.html 携帯キャリア、SMSの送信文字数上限を70文字→670文字に拡大 - iPhone Mania https://iphone-mania.jp/news-258353/ 現在では全角670文字まで送信できるとなっているが、古い機種では全角70文字(半角英数字で160文字)という制限がある iPhoneの場合、iPhone4Sとそれ以前の機種は全角70文字が最大とされている ただしiPhone4Sは8年ほど前の機種で、Appleからもサポートが打ち切られている Androidの場合、2017年4月以前の端末だと機種によっては全角70文字制限にひっかかる可能性があるらしい 3年半前の機種を優先してメッセージを短くするか否かで対応がわかれるが、 より多くの人に届けたいなら全角70文字以内にしておくと無難 □SMSの利用料金 以下で紹介されている キャリアによって金額が異なり、以下のようになっている。SMSの場合、無料利用枠は無い NTTドコモ ... $0.07098/通 au ... $0.07985/通 Softbank ... $0.04983/通 SMS(ショートメッセージ)送信サービス - Qiita https://qiita.com/kidatti/items/93832b9959d3ad2390dd 以下に公式の記載がある 料金 - Amazon SNS | AWS https://aws.amazon.com/jp/sns/pricing/ 以下のページで「1通あたり0.7円」程度となっている? …と思ったが、これはあくまでも米国内での利用料金 「Enter your country / region」に「Japan」を入力すると日本での利用金が表示され、$0.07451(8円程度)となる Amazon Simple Notification Service (SNS) SMS Pricing - AWS https://aws.amazon.com/jp/sns/sms-pricing/ 公式のPricingのページでは以下のように書かれている 「米国の電話番号に送信された最初の100件のSMSメッセージは無料です。」 「この価格設定は定期的に変更されます。」 「月間300万通以上のSMSメッセージを送信する場合は、カスタム価格についてお問い合わせください。」 よくある質問 - Amazon SNS | AWS https://aws.amazon.com/jp/sns/faqs/#SMS_pricing 以下のように記載されている。やはり無料利用枠は米国内への配信限定みたい 「米国内の送信先に送信される SMS メッセージは、毎月 100 件まで AWS 無料利用枠に含まれています。 この利用枠には有効期限はありません。ここでの「メッセージ」とは、以前の質問の回答で説明したように、140 バイト以下の情報を含む 1 つの送信を指します。 米国内で複数の宛先に 100 通を超えるメッセージを送信する場合、または米国外の宛先にメッセージを送信する場合には、現在の料金に基づいて、送信される各メッセージが課金されます。」 1ヶ月の上限は、デフォルトで1USDに設定されているみたい(10通ほど送信できる) 申請すれば100USDに引き上げてもらえるみたい(1000通ほど送信できる) 上限に引っかかっても、SDKからの送信時は特別なエラーメッセージは確認できなかったので注意 AWSコンソールの「Amazon SNS → テキストメッセージング(SMS → 配信統計(UTC))」ではエラーがあったことを確認できる 申請については「SMS送信数の制限緩和」の項目を参照 Amazon SNSを使い、RailsからSMSを送信する - Qiita https://qiita.com/tomoeine/items/76a633809af3fea1643d □送信元電話番号 ソフトバンクにSMSを送信すると、送信元電話番号は以下になった 837727678 電話をかけてみると「こちらはソフトバンクです。おかけになった電話番号は現在使われておりません。」と自動応答された つまり、その番号は送信専用のものとなる キャリアの持つ電話番号から送られているのかもしれないが、上の自動応答は単に「ソフトバンクの携帯からかけたから」というだけの可能性はある 要調査 □トピックではなく電話番号に対して直接送信 Amazon SNS → Mobile → テキストメッセージング(SMS) → テキストメッセージの発行 メッセージのタイプ: プロモーション(特に変更せず) 電話番号: +819012345678 (送信先の電話番号) メッセージ: AWSのダッシュボードから電話番号に対して直接送信。 「メッセージの発行」をクリックすると、SMSを直接送信できる □PHPのSDKからトピックに対して送信 以下のようにして送信できる
<?php require_once '/var/www/html/aws/html/vendor/autoload.php'; use Aws\Sns\SnsClient; /* アクセスキー */ $aws_access_key = 'XXXXX'; $aws_secret_access_key = 'YYYYY'; /* AmazonSNS */ $snsClient = new SnsClient([ 'version' => 'latest', 'credentials' => [ 'key' => $aws_access_key, 'secret' => $aws_secret_access_key, ], 'region' => 'ap-northeast-1', ]); $result = null; $code = null; $data = null; try { $result = $snsClient->publish([ 'Message' => 'トピックを指定して一斉送信。', 'TopicArn' => 'arn:aws:sns:ap-northeast-1:0123456789:Mail-Test', ]); $code = $result->get('@metadata')['statusCode']; $data = $result['MessageId']; } catch (Exception $e) { $result = $e->getMessage(); }
□PHPのSDKから電話番号に対して送信 以下のようにして送信できる 電話番号は「09012345678」なら「+819012345678」のように指定する
<?php require_once '/var/www/html/aws/html/vendor/autoload.php'; use Aws\Sns\SnsClient; /* アクセスキー */ $aws_access_key = 'XXXXX'; $aws_secret_access_key = 'YYYYY'; /* AmazonSNS */ $snsClient = new SnsClient([ 'version' => 'latest', 'credentials' => [ 'key' => $aws_access_key, 'secret' => $aws_secret_access_key, ], 'region' => 'ap-northeast-1', ]); $result = null; $code = null; $data = null; try { $result = $snsClient->publish([ 'Message' => '電話番号を直接指定してSMSに個別送信。', 'PhoneNumber' => '+819012345678', ]); $code = $result->get('@metadata')['statusCode']; $data = $result['MessageId']; } catch (Exception $e) { $result = $e->getMessage(); }
以下のようにすれば、送信元の名前をプログラムから直接指定できる ただしプログラムからの指定は、東京リージョンでは正式にサポートされていないかもしれない その影響か、指定して送信すると電話番号が国外と思われるものからになる
$result = $snsClient->publish([ 'Message' => '電話番号を直接指定してSMSに個別送信。', 'PhoneNumber' => '+819012345678', 'MessageAttributes' => [ 'AWS.SNS.SMS.SenderID' => [ 'DataType' => 'String', 'StringValue' => 'SendTester', ], ], ]);
□引き続き要調査 ・各キャリアに送れるか(Softbankのみ検証した) ■アプリへの送信 以下が参考になりそう。検証したい amazon SNSでiOSアプリにプッシュ通知を送る!画像つきで詳しく使い方もまとめました! | イリテク https://iritec.jp/app_dev/16197/ Rails + Swiftのプッシュ通知をAmazonSNSで実現する - Qiita https://qiita.com/3kuni/items/62c4739cf1316b2c2ef4 トピック型のモバイルPush通知をRails + Amazon SNSで実装する - メドピア開発者ブログ https://tech.medpeer.co.jp/entry/2018/03/15/080000 Amazon SNS で、iOS・Androidにpush通知する方法 - Qiita https://qiita.com/papettoTV/items/f45f75ce00157f87e41a [Swift] Amazon SNS で iOSアプリにPush通知を送信する #アドカレ2015 | Developers.IO https://dev.classmethod.jp/cloud/aws/aws-amazon-sns-mobile-push-swift/ Apple Push Notification Service の使用開始 - Amazon Simple Notification Service https://docs.aws.amazon.com/ja_jp/sns/latest/dg/mobile-push-apns.html 以下はAmazonSNSでは無いが参考になりそう 【Swift】いまさらですがiOS10でプッシュ通知を実装したサンプルアプリを作ってみた - Qiita https://qiita.com/natsumo/items/ebba9664494ce64ca1b8 プッシュ通知に必要な証明書の作り方2018 - Qiita https://qiita.com/natsumo/items/d5cc1d0be427ca3af1cb 以下は大量送信についての考察 大規模ネイティブアプリへのプッシュ通知機能導入にあたって考えたこと - Qiita https://qiita.com/gomi_ningen/items/ab31aa2b3d46bb6ffa5e [AWS][iOS] Amazon SNS で APNs に大量 Publish してみた http://dev.classmethod.jp/cloud/aws/sns-apns-push/

Advertisement