Amazon Pinpointを用いてEmailやLINE通知を自動化した基盤
2019.10.03AWS DevDay Tokyo 2019 C-4株式会社スナックミー CTO & co-founder 三好隼人
•株式会社スナックミー
•三好隼人 co-founder & CTO
•東京生まれ東京育ち
•建築出身エンジニア
•トライアスロンやマラソンを嗜む @miyoshihayato
1. snaq.me(スナックミー) について
1,980円 (税込)100種以上から8種のおやつを一人ひとりにセレクトしてお届け
Real Foodから作った、美味しくてカラダに優しいおやつをお一人ひとりにカスタマイズしてお届けするサブスクリプションサービス
Mission
Vison
新しいおやつ体験を創造し、おやつの時間を価値のあるものにする。
数百億円規模の Real Foodスナック市場を創り、その市場のナンバー1ブランドとなる。
栄養価が高く、それでいて美味しさに妥協しないスナックによって、おやつそのもの質を上げる。また、モノだけではなく、新しいおやつ体験をデザインし、おやつの時間の価値を向上させる。それによって、おやつの時間が彩りとなり、豊かな生活を実現する。
Real Foodスナックとは、形あるReal Foodのみから作られたスナック。素材本来が持つ栄養と美味しさを最大限に活かし、人工的な原料や化学物質は使わない。栄養価が高く健康的で、それでいて美味しさに妥協はしない。
スナックミーの商品開発基準Made From Real Food
化学物質に頼らず、自然な素材から美味しさと栄養を引き出す
Create a New Culture
新しい食文化や食習慣を作り出しうる
Without Compromise
美味しさに妥協しない
ドライフルーツ・ナッツ
トレイルミックス
焼き菓子
チョコ
チップス
米菓
その他フルーツ菓子
季節に合わせた商品100SKU以上を常時在庫。毎月10~20%を入れ替え。
1. snaq.me(スナックミー) について
開発の主なツール- サーバーサイド : Ruby on Rails (PHP)
- フロントエンド言語 : Babel、一部TypeScript
- フロントエンド : React, Redux, webpack
- UIコンポーネントカタログ : Storybook
- データ分析 : python
- データベース : Aurora, DynamoDB
- インフラ : AWS
- 開発環境 : Vagrant, Docker
- リポジトリ管理 : GitHub / codecommit
- CI / CDなど : CodePipeLine / jest / RSpec
- コミュニケーション : Qiita:Team, Slack
Amazon Pinpointを用いてEmailやLINE通知を自動化した基盤の話ここから本題へ
そもそも、なぜLINE(チャットUI)を用いたのか?
2015年の創業前から以下のように考えていました
• UXが明確
• チャットUIは老若男女使える
• これからはチャットUIがベースになる可能性がある
• LINEからpushできる
• LINE上だとフレキシブルにUIを操れないのでwebに案内するようにした
スナックミー当初は?
当初は
やりとり全てチャット形式評価もリクエストも
チャットUIはいいところだけじゃない
目的がしっかりしている場合は回りくどい
初回、初見ユーザーにチャットで案内すると使い勝手向上
2周目(学習済みのUIUX)
CSとしてのコミュニケーション1本に
そのため
LINE Messaging API
用いているのが
• 企業とユーザーの双方コミュニケーションが可能
• プッシュメッセージと応答メッセージ
• 1対1、グループでトーク可能
• さまざまな状況に合わせたメッセージタイプ
• テキスト• スタンプ• 音声• 画像など
LINE Messaging APIでできること
企業とユーザーの双方コミュニケーションが可能
さまざまな状況に合わせたメッセージタイプ
構成図
ユーザー送信スタッフ送信
スタッフへ通知
Amazon Route 53
Elastic Load
Balancing
Elastic Load
Balancing
EC2
EC2
Amazon Aurora
構成図
ユーザー送信スタッフ送信
スタッフへ通知
Amazon Route 53
Elastic Load
Balancing
Elastic Load
Balancing
EC2
EC2
Amazon Aurora
構成図
ユーザー送信スタッフ送信
スタッフへ通知
Amazon Route 53
Elastic Load
Balancing
Elastic Load
Balancing
EC2
EC2
Amazon Aurora
送受信を分けている理由
ユーザーからのメッセージ受信は絶対!落とせない
• サービスがグロースすれば、CSも増やす必要がある
• どこまでアウトバウンド(スタッフ発信)を行うか
• だが、ユーザーとの接点は多く持ちたい
• 新しい施策を試したい
など
課題
• サービスがグロースすれば、CSも増やす必要がある
• どこまでアウトバウンド(スタッフ発信)を行うか
• だが、ユーザーとの接点は多く持ちたい
• 新しい施策を試したい
など
課題
1対1の対応は残し、1対多をできる仕組みの構築
ユーザーと接するには1歩(通)目が大事なので
セグメント対象の1通目はawsを用いたシステム
その後は1対1でメッセージのやり取り
こういうこと
セグメントしたユーザーへ配信を自動化できる基盤が欲しい
Amazon Pinpoint
Amazon Pinpointとはエンゲージメントチャネル
メッセージをひとつのチャネルか、多くのチャネル経由で送るかにかかわらず、世界中の何百万もの顧客に簡単で信頼性高くメッセージを届けることができます。
エンゲージメント管理
適切な顧客に、適切なメッセージを、適切なタイミングで、適切なチャネルを通して送ってください。
分析
顧客と貴社のエンゲージメントに関連したデータを集約、可視化、カスタマイズ。
参照 : https://aws.amazon.com/jp/pinpoint/
Amazon Pinpointとはエンゲージメントチャネル
Eメール、音声、SMS、プッシュ通知、拡張機能(LINEなど)
エンゲージメント管理
キャンペーンのように特定の対象者セグメントに送信するのではなく、特定の受信者に送信するオンデマンドメッセージを送ることも可能
分析
顧客データの収集と理解、およびデータに基づいた行動、エンゲージメントの取り組みのパフォーマンスに対して、さまざまな分析が可能
参照 : https://aws.amazon.com/jp/pinpoint/
Amazon Pinpointとは
参照 : https://docs.aws.amazon.com/ja_jp/aws-mobile/latest/developerguide/mobile-hub-add-aws-mobile-analytics.html
Amazon Pinpointでemail/push通知のユースケース
AWS BatchAmazon Simple Storage Service
(S3)
Amazon Pinpoint
前処理セグメントのユーザーをS3にアップロード
時間指定 or 即時配信
• jsonやcsvファイルがあればGUIから操作することも可能
• 時間指定 or 即時配信が可能
• 1秒間に0 ~ 25,000通まで配信速度を変えらえる
• 開封率やClick率以外の分析を数分以内で分析してくれる
• ファネル分析もできる & Amazon Personalize
Amazon Pinpointの嬉しいポイント
直感で触れる
予約配信(batch処理)や緊急性の高い配信(速報ニュースなど)
アクセス数をコントローロできる
ただ送るだけじゃなく、その後のアクションにもつなげられる
さまざまなCVR調査が可能
ファネル分析
どういう構成図にしようか??
Email or LINE で通知したい
LINE通知をするにはAWS Lambdaを使用したカスタムチャネルでできるらしい!今(2019年10月現在)はパブリックベータ版なので仕様変更の可能性あり
Amazon Pinpointは東京リージョンで利用できない!今(2019年10月現在)
Amazon Pinpointを起動させるにはどうしよう
データは東京リージョンにある
AWS Step Functionsで管理できる?AWS Lambdaは?
AWS Step FunctionsやAWS Lambdaはリージョン間をつなげられない
異なるリージョンのAWS Lambdaを利用する方法がある
参照 : https://dev.classmethod.jp/cloud/trigger-lambda-on-other-regions/
• ユーザーアプリケーションの呼び出しは、PC/サーバー上のAWS SDKまたはスマート
端末上のAWS Mobile SDKで可能
• AWSの通知サービスであるSNSの通知先としてAWS Lambdaを指定する
• S3 Cross-Region ReplicationでAWS Lambda関数と同じリージョンにバケットを複製
し、複製バケットにAWS Lambdaへのイベント通知を設定する
異なるリージョンのAWS Lambdaを利用する方法
参照 : https://dev.classmethod.jp/cloud/trigger-lambda-on-other-regions/
• ユーザーアプリケーションの呼び出しは、PC/サーバー上のAWS SDKまたはスマート
端末上のAWS Mobile SDKで可能
• AWSの通知サービスであるSNSの通知先としてAWS Lambdaを指定する
• S3 Cross-Region ReplicationでAWS Lambda関数と同じリージョンにバケットを複製
し、複製バケットにAWS Lambdaへのイベント通知を設定する
異なるリージョンのAWS Lambdaを利用する方法がある
参照 : https://dev.classmethod.jp/cloud/trigger-lambda-on-other-regions/
セグメント情報から配信までのフローはAWS Step Functionsでしたい
Amazon Pinpoint セグメントをインポートするに時間を要する(長時間ではない)
カスタムチャネルで起動されたAWS Lambdaは50名分で1Lambda起動する
• データベースが東京リージョンのためLambda経由でPinpointを起動できない
• 配信のワークフローをStep Functionsを用いる予定がリージョン間はsetできない
• セグメントしたジョブをインポート完了に時間がかかる
• 最後のLINE配信時では配信人数 / 50名分のLambdaが立ち上がる
• 属性のコントロール
AWS Lambdaと自動化に伴う課題
オレゴンなど同リージョン内であれば起動可能
PinpointのフローだけStep Functionsを用いるなど
インポート完了をポーリングする必要がある
上限緩和または同時に50,000人に送らなければ基本問題ない
属性は40個までなので、計画的な設計が必要
AWS Step Functions
Amazon S3AWS Lambda AWS Lambda Amazon DynamoDB
AWS Lambda
AWS Lambda
AWS Lambda
DONE import?
配信フロー
Amazon Simple Notification Service
Tokyo Region (ap-northeast-1) Oregon Region (us-west-2)
AWS Batch
AWS Step Functions
Amazon S3AWS Lambda AWS Lambda Amazon DynamoDB
AWS Lambda
AWS Lambda
AWS LambdaAWS Lambda
DONE import?
配信フロー
Amazon Simple Notification Service
Tokyo Region (ap-northeast-1) Oregon Region (us-west-2)Oregon Region (us-west-2)
AWS Batch
東京リージョン
AWS Step Functions
Amazon S3AWS Lambda AWS Lambda Amazon DynamoDB
AWS Lambda
AWS Lambda
AWS Lambda
DONE import?
配信フロー
Amazon Simple Notification ServiceNotification Service
Tokyo Region (ap-northeast-1) Oregon Region (us-west-2)
AWS Batch
オレゴンリージョン
AWS Step Functions
Amazon S3AWS Lambda AWS Lambda Amazon DynamoDB
AWS Lambda
AWS Lambda
AWS LambdaAWS Lambda
DONE import?
配信フロー
Amazon Simple Notification ServiceNotification Service
Tokyo Region (ap-northeast-1)Tokyo Region (ap-northeast-1) Oregon Region (us-west-2)Oregon Region (us-west-2)
AWS Batch
ユーザーセグメントしたデータを
S3にputでSNSを着火
SNSはリージョン間は関係ないので、Step Functionsを起動させる
Amazon Pinpointを用いて配信
AWS Step Functions
Amazon DynamoDB
AWS Lambda
AWS Lambda
AWS Lambda
DONE import?
配信 AWS Step Functions
Step FunctionsのスタートはDynamoDBから配信する
pinpointのアプリケーションを取得する
importされたJSONデータを元にセグメントを作成
配信するチャネルタイプからカスタムチャネル標準を取得する
import後は件数が多くなるとimportに時間がかかる(数時間
ではないない)そのため、importが完了したか定期チェックする必要あり
完了後キャンペーンの生成カスタムの場合は
カスタムチャネルで配信するLambdaを起動させる
AWS Step FunctionsAWS Step Functions
Amazon DynamoDB
AWS LambdaAWS Lambda
AWS Lambda
AWS Lambda
DONE import?
配信 AWS Step Functions
Step FunctionsのスタートはのスタートはDynamoDBから配信するから配信する
pinpointのアプリケーションをのアプリケーションを取得する
importされたJSONデータを元にセグメントを作成
配信するチャネルタイプからカスタムチャネル標準を取得する
import後は件数が多くなると後は件数が多くなるとimportに時間がかかる(数時間数時間
ではないない)そのため、importが完了したかが完了したか定期チェックする必要あり定期チェックする必要あり
完了後キャンペーンの生成カスタムの場合は
カスタムチャネルで配信するLambdaを起動させる
AWS Lambda
配信 AWS Step Functions
完了後キャンペーンの生成カスタムの場合は
カスタムチャネルで配信するLambdaを起動させる
import osimport jsonimport boto3
def lambda_handler(event, context): s3 = boto3.client(‘s3') # メッセージ内容 msg = event["Message"]["smsmessage"]["body"] arr = json.loads(msg) # エンドポイント一覧 endpoints = event["Endpoints"]
for item in endpoints: # エンドポイント line_id = endpoints[item][‘Address'] # 配信へ
S3の構造構成
json : 配信データ一覧email_format : 配信内容
配信する上で管理しやすいように設定
なので、会社方針でお任せ
email: メール配信line: LINE配信
email_line: メール & LINE配信
xxxxにはline: LINE配信のフォーマット
html: メールのHTML型txt: メールテキスト型title: メールタイトル
Amazon S3
s3:// BUCKET_NAME / format / 親カテゴリ / ブランド名 / 配信タイプ / 子カテゴリ_xxxx.txt
s3:// BUCKET_NAME / json / 親カテゴリ / ブランド名 /配信タイプ / 子カテゴリ / yyyy-mm-dd.json
json / format 親・子カテゴリブランド名
配信タイプ 子カテゴリー_xxxx.txt
セグメントファイル名
配信ファイル名
AWS Lambda
LINE 配信AWS Lambda
{ "text": { "text": "xxxxxx" }}
テキスト ver. 画像 ver. イメージマップ ver.
{ "image": { "original_content_url": "xxx", "preview_image_url": "yyy" }}
{ "imagemap":{ "alt_text": "ccccccccccccccccccccc", “base_url": "https://snaq.me", "h": xxx, "w": yyyy, "actions": [ { "uri_text": "https://snaq.me", "type": "uri", "x": 0, "y": 0, "w": aaaaa, "h": bbbbb }…….. ] }}
AWS Step Functions
AWS Lambda
AWS Lambda
アプリケーション作成 AWS Step Functions
pinpointのアプリーション作成 作られたアプリケーションをDynamoDBに入れ込む
&状況notificationさせる
有効後の状況をDynamoにput
&状況をnotificationさせる
Amazon DynamoDB
AWS Lambda
AWS Lambda
Amazon DynamoDB
アプリケショーンでEMAILを有効にさせる
通知
AWS Step Functions
AWS Lambda
AWS Lambda
アプリケーション作成 AWS Step Functions
Amazon DynamoDB
AWS Lambda
AWS Lambda
Amazon DynamoDB
{ “app_email": "[email protected]", "app_name": "xxxxxxxxxxx"}
これで最初のユーザーセグメントの部分を入れ替えるだけで自動配信が可能に
Amazon Pinpointで嵌ってしまったこと
• 属性の上限を超えてもエラーが返らない
• 構文ミスはエラーだが、対象項目の上限文字数を超えてもエラーは返らない
• 属性が対象ユーザーによって空の場合、CSVだと[]として残るがjsonは平気
Amazon Pinpointを嵌ってしまったこと
上記2つはエンドポイントに対象者がいるか確認が必要。1つでもoutだと全て送れない
CSV管理は後々マーケが扱いやすいが、jsonは組み込みやすい
Amazon Pinpointの制限 (主に注意が必要なpoint)
リソース デフォルトの制限 増加の対象
Attributes、Metrics、UserAttributes パラメータにまとめて割り当てられた属性
アプリごとに 40 いいえ
属性値の長さ 100 文字 いいえ
同じユーザー ID を持つエンドポイント ユーザー ID ごとに 10 個の一意のエンドポイント
いいえ
セグメントの作成に使用できるディメンションの最大数 セグメントごとに 100 いいえ
セグメント内に同一のエンドポイント 重複は削除される いいえ
まとめ• Amazon Pinpointでさまざまなチャネルへ通知が可能
• カスタムチャネルを用いればLINE配信も可能("版なので変わることも)
• 属性の上限からアプリケーションの管理方法を考える必要がある
• エラーじゃないが送れてないことがあるので、確認のフローは必須
• AWS Step Functionsにまとめることで一元管理
• リージョン間はSNSサブスクライブを用いることでスムーズに
今後したいこと• Amazon Personalizeを用いてより確度の高い通知を
• お菓子の選定の強化
• OEM先のシステム
• パティシエ向けの新商品開発システム
• 自動発送
• 評価をしなくても自動で好き嫌いを判断できる仕組み
など