amazon pinpointを用いてemailやline通知を 自動 … › rs › 112-tzm-766 › images ›...

Post on 04-Jul-2020

1 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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(スナックミー) について

1. snaq.me(スナックミー) について

製造指示書作成 製造 在庫登録 アサイン ピッキング 発送

製造から発送準備まで一貫

1. snaq.me(スナックミー) について

分析

snack box

おやつの評価/リクエスト

新商品開発おやつのA/Bテスト

お届けするおやつを決定

開発の主なツール- サーバーサイド : 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": "noreply@snaq.me", "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先のシステム

• パティシエ向けの新商品開発システム

• 自動発送

• 評価をしなくても自動で好き嫌いを判断できる仕組み

など

新しいおやつ体験を創造し、おやつの時間を価値のあるものに

ご静聴ありがとうございましたご興味ある方は snaq.me (スナックミー) へ

top related