Slide 1

Slide 1 text

1

Slide 2

Slide 2 text

本ハンズオンでは、擬似的な広告配信とそれに対するフィードバックの受付までの部 分の仮想的な流れをSNS, SQS, Lambdaを使って実装します。 広告出稿元が、広告業者に広告メッセージを渡し、それを広告業者が配布先(今回 はAとBの2つが存在)に配信します。 広告配布先は、配信された広告メッセージの金額と自身の予算に合わせて紹介結 果のフィードバックをフィードバック窓口に投げ入れます。 広告業者は広告配信先の特性(今回は予算額)に合わせた広告配信を実現するこ とで不要な広告を配信しないことを実現しようとします。 2

Slide 3

Slide 3 text

先程のスライドをAWSのコンポーネントに落とし込むと上図のようになります。 広告業者は入稿された広告メッセージをSNSトピックを介してサブスクリプション先 (広告配布先A, B)に配信します。 広告配布先A, Bでは配信されたメッセージをSQSのキューに格納し、Lambdaで処 理をします。処理結果は連絡窓口のS3バケットに格納します。 3

Slide 4

Slide 4 text

なお、広告配布先で生成されるフィードバックは、商品の価格が予算額にフィットしな い場合はネガティブなフィードバックが届いてしまうので、それを減らすためにも配信 をある程度フィルタする必要があります。 4

Slide 5

Slide 5 text

5

Slide 6

Slide 6 text

最初は広告業者のSNSトピックを作成します。 6

Slide 7

Slide 7 text

SNSの画面に移動し、トピックメニューを選択(①)してトピック一覧の画面に移動し ます。トピックの作成ボタンをクリック(②)します。 7

Slide 8

Slide 8 text

トピックの作成画面では、トピックの名前を設定します。 ここでは、advertisement-distribution-topicと設定(①)します。 (d"e"stributionとなってますがtypoです) 名前を設定したらトピックの作成ボタンをクリック(②)します。 8

Slide 9

Slide 9 text

SNSトピックの作成が完了しました。 9

Slide 10

Slide 10 text

次は、広告配布先AのSQSキューを作成します。 10

Slide 11

Slide 11 text

SQSのサービスに移動し、キューの一覧画面に移動します。 キューを作成ボタンをクリック(赤枠)します。 11

Slide 12

Slide 12 text

標準キューを指定(①)します 名前にsubscriber-a-queueを指定(②)します。 設定部分で可視性タイムアウトとして1分を指定(③)します。 ①〜③が終わったらキューを作成ボタンをクリック(④)します。 12

Slide 13

Slide 13 text

キューの作成が完了しました。 広告業者のSNSトピックをサブスクライブしたいので、 SNSサブスクリプションタブを選択(①)し、AmazonSNSトピックにサブスクライブボ タンをクリック(②)します。 13

Slide 14

Slide 14 text

SNSトピックのサブスクライブ画面が表示されるので、 adversisement-distribution-topicをサブスクライブするようにトピックを指定 (①)します。 指定したら、保存ボタンをクリック(②)します。 14

Slide 15

Slide 15 text

広告業者のSNSトピックと、広告配布先AのSQSキューが接続されました。 次はほぼ同様の手順で広告配布先BのSQSキューを作成します。 15

Slide 16

Slide 16 text

SQSキューの一覧画面からキューを作成ボタンをクリック(赤枠)します。 16

Slide 17

Slide 17 text

標準キューを選択(①)し、名前としてsubscriber-b-queueを指定(②)します。 可視性タイムアウトで1分を指定(③)します。 ①〜③までが完了したら、キューを作成ボタンをクリック(④)します。 17

Slide 18

Slide 18 text

SNSサブスクリプションタブを選択(①)し、Amazon SNS トピックにサブスクライブ ボタンをクリック(②)します。 18

Slide 19

Slide 19 text

SNSトピックのサブスクライブ画面が表示されるので、 adversisement-distribution-topicをサブスクライブするようにトピックを指定 (①)します。 指定したら、保存ボタンをクリック(②)します。 19

Slide 20

Slide 20 text

はれて、広告配布先A, BのSQSキューが広告業者のSNSトピックをサブスクライブ している状態になりました。 ここまでの動作確認をしていきます。 広告業者のSNSトピックにメッセージを投入してSQSに届くことを確認します。 20

Slide 21

Slide 21 text

SNSトピックの一覧画面に移動し、advertisement-distribution-topicのリンク をクリック(赤枠)します。 21

Slide 22

Slide 22 text

トピックの詳細画面が表示されるので、 メッセージの発行ボタンをクリック(赤枠)します。 22

Slide 23

Slide 23 text

メッセージ本文で、 すべての配信プロトコルに同一のペイロードのラジオボックスを選択(①)します。 メッセージ本文に以下の内容を入力(②)します。 { "price": 25000000, "name": "シーガルズグランドガーデン(架空)", "message": "適切なマンションポエムをここに入れる" } ②までが完了したらメッセージの発行(③)ボタンをクリックします。 これでSNSトピックへのメッセージの投入は完了です。 広告配布先A, Bのキューにメッセージが配信されているかを確認していきましょう。 23

Slide 24

Slide 24 text

SQSキュー一覧画面を表示します。 subscriber-a-queueとsubscriber-b-queueの利用可能なメッセージが1と なっていることを確認(①)します。 さらに詳細に確認する場合はキューのいずれかのリンクをクリック(②)します 24

Slide 25

Slide 25 text

メッセージをポーリングボタンをクリック(①)するとキューに格納されたメッセージが 取得できます。メッセージの一覧からリンクをクリック(②)すると実際にキューに格納 されたメッセージが確認できます。 25

Slide 26

Slide 26 text

フィードバックを受け付けるためのバケットを作成します。 26

Slide 27

Slide 27 text

S3バケットの一覧画面に移動し、バケットを作成ボタンをクリック(①)します。 バケットの名前にadvertisement-feedback-{ランダム文字列}を指定(②)します。 リージョンはap-northeast-1を指定(③)します。 ①〜③が完了したらバケットを作成ボタンをクリック(④)します。 27

Slide 28

Slide 28 text

フィードバックを受け付けるためのバケットの作成が完了したので、結果のフィード バック用のLambda関数を作成します。 28

Slide 29

Slide 29 text

まずは、広告配布先Aに付与するLambda関数を作成します。 29

Slide 30

Slide 30 text

Lambdaサービスの画面に移動し、関数一覧を表示します。関数の作成ボタンをク リック(①)します。 作成画面に遷移したら、関数名としてreview-function-aを指定(②)します。 ランタイムとしてPython3.8または3.7を指定(③)します。 30

Slide 31

Slide 31 text

次に関数コードの設定を行います。 コードタブを選択(①)し、コードーソースのコード欄に https://github.com/Fufuhu/bootcamp-2021- sample/blob/main/lambda/subscriber.pyのコードを貼り付け(②)します。 貼り付けしたら、Deployボタンをクリック(③)します。 31

Slide 32

Slide 32 text

設定タブをクリック(①)します。 一般設定を選択(②)し、編集ボタンをクリック(③)します。 32

Slide 33

Slide 33 text

タイムアウトの値として30秒を指定(①)し、保存ボタンをクリック(②)します。 33

Slide 34

Slide 34 text

次に関数の実行に必要なアクセス権限をIAMロールに付与します。 アクセス権限メニューを選択(①)し、ロール名をクリック(②)して、IAMロールの詳細 画面を開きます。 34

Slide 35

Slide 35 text

インラインポリシーの追加リンク(赤枠)をクリックします。 35

Slide 36

Slide 36 text

サービスにS3(①)アクションにPutObject(②)、 リソースとしてすべてのリソース(③)を選択し、 ポリシーの確認ボタンをクリック(④)します。 36

Slide 37

Slide 37 text

ポリシーの名前としてPutObjectPolicyを指定(①)し、 ポリシーの作成ボタンをクリック(②)します。 37

Slide 38

Slide 38 text

続けてSQSキューにアクセスするためのインラインポリシーの追加を行います。 サービスとしてSQS(①)、アクションとしてGetQueueAttrributes, ReceiveMessage, DeleteMessage(②)、リソースとしてすべてのリソース(③)を 選択します。 ①〜③が完了したら、ポリシーの確認ボタンをクリック(④)します。 38

Slide 39

Slide 39 text

ポリシーの確認画面では、名前としてSQSAccessPolicyを指定(①)します。 名前を指定したらポリシーの作成ボタンをクリック(②)します。 39

Slide 40

Slide 40 text

はれて、IAMロールにLambda関数を正しく動かすのに必要なポリシーの付与が完 了しました。 40

Slide 41

Slide 41 text

もとから存在しているポリシー(AWSLambdaBasicExecutionRole-〜)を修正し ます 左側の▼をクリックします。 41

Slide 42

Slide 42 text

ポリシーの編集ボタンをクリックします。 42

Slide 43

Slide 43 text

対象リソースをすべてのリソースに変更します。 ポリシーの確認ボタンをクリックします。 43

Slide 44

Slide 44 text

IAMロールの設定変更が完了したら、環境変数を設定します。 環境設定メニューを選択(①)し、編集ボタンをクリック(②)します。 44

Slide 45

Slide 45 text

環境変数としてFEEDBACK_UPLOAD_BUCKETとその値を指定(①)します。この ときの値は、先程作成したS3バケットの名前を指定します。 次にPRICE_UPPER_LIMITを指定します。広告配布先Aは予算額が3000万円な ので、30000000を指定(②)します。 指定が終わったら保存ボタンをクリック(③)します。 45

Slide 46

Slide 46 text

最後に関数を実行するためのトリガーとしてSQSキューを指定します。 トリガーを追加ボタンをクリック(赤枠)します。 46

Slide 47

Slide 47 text

トリガーの設定で、SQSを指定(①)します。 SQSキューとしてsubscriber-a-queueを指定(②)します。 ここまで完了したら追加ボタンをクリック(③)します。 47

Slide 48

Slide 48 text

ここまでの作業で広告配布先AのLambda関数が作成できました。 48

Slide 49

Slide 49 text

以降は、広告配布先BのLambda関数を作成します。 49

Slide 50

Slide 50 text

Lambdaサービスの画面から関数一覧を表示します。 関数の作成ボタンをクリック(①)します。 関数名としてreview-function-bを指定(②)します。 ランタイムとしてPython3.8またはPython3.7を指定(③)します。 実行ロールとしては既存のロールを使用するを選択(④)し、 review-function-aに紐付けたロールを指定(⑤)します。 ①〜⑤が完了したら関数の作成をクリック(⑥)します。 50

Slide 51

Slide 51 text

コードタブを選択(①)して、https://github.com/Fufuhu/bootcamp-2021- sample/blob/main/lambda/subscriber.py のコードを貼り付け(②)ます。 Deployボタンをクリック(④)します。 51

Slide 52

Slide 52 text

設定タブをクリック(①)して、一般設定メニューを選択(②)します。 編集ボタンをクリック(③)してLambda関数の一般設定画面を表示します。 52

Slide 53

Slide 53 text

タイムアウトの値を30秒に設定(①)します。 保存ボタンをクリック(②)します。 53

Slide 54

Slide 54 text

次に環境変数を設定します。 設定タブを選択(①)し、環境変数メニューをクリック(②)します。 編集ボタンをクリック(③)します。 54

Slide 55

Slide 55 text

環境変数としてFEEDBACK_UPLOAD_BUCKETとその値を指定(①)します。この ときの値は、先程作成したS3バケットの名前を指定します。 次にPRICE_LOWER_LIMITを指定します。広告配布先Aは1億円以上の商品を 希望なので、100000000を指定(②)します。 指定が終わったら保存ボタンをクリック(③)します。 55

Slide 56

Slide 56 text

関数を実行するためのトリガーとしてSQSキューを追加します。 トリガーを追加ボタンをクリック(赤枠)します。 56

Slide 57

Slide 57 text

トリガーの設定で、SQSを指定(①)します。 SQSキューとしてsubscriber-a-queueを指定(②)します。 ここまで完了したら追加ボタンをクリック(③)します。 57

Slide 58

Slide 58 text

はれて広告配布先A, Bの両方にフィードバック用のLambda関数が作成できました。 58

Slide 59

Slide 59 text

それではここまでの動作確認をしていきます。 59

Slide 60

Slide 60 text

作成したSNSトピックに広告メッセージを投入します。 SNSサービスの画面を開いてSNSトピックの一覧画面を表示します。 作成したSNSトピックを選択(①)して、メッセージの発行ボタンをクリック(②)します。 60

Slide 61

Slide 61 text

すべての配信プロトコルに〜を選択(①)します。 メッセージ本文に以下の内容を入力(②)します。 { "price": 40000000, "name": "シーガルズグランドガーデン(架空)", "message": "適切なマンションポエムをここに入れる" } 入力が終わったらメッセージの発行ボタンをクリック(③)します。 61

Slide 62

Slide 62 text

S3サービスの画面に移動し、作成したS3バケットをクリック(①)します。 作成されたオブジェクトのうち、最新のものを2つ確認(②)します。 オブジェクトをダウンロードしてみましょう。 62

Slide 63

Slide 63 text

広告配布先A, Bから届いたとみられるメッセージがあります。 残念ながら、A、B両方の要件に合致しない広告メッセージを送ったために、ネガティ ブなメッセージが返ってきています。 63

Slide 64

Slide 64 text

広告配布先Aは3000万円以下、広告配布先Bは1億円以上とのことなので、4000 万円の広告情報は両者ともに流してはいけませんでした。 64

Slide 65

Slide 65 text

余分なメッセージをSNSから流さないようにするにはサブスクリプションフィルターを 利用します。 65

Slide 66

Slide 66 text

広告配布先Aのサブスクリプションフィルターを作成していきます。 3000万円以下の広告のみが配布されるようにします。 66

Slide 67

Slide 67 text

SNSトピックの一覧を表示します。 advertisement-distribution-topicを選択(赤枠)します。 67

Slide 68

Slide 68 text

サブスクリプションタブを選択(①)してサブスクリプションの一覧を表示します。 エンドポイントがsubscriber-a-queueとなっているものを選択(②)します。 68

Slide 69

Slide 69 text

サブスクリプションフィルターポリシータブを選択(①)し、 編集ボタンをクリック(②)します。 69

Slide 70

Slide 70 text

JSONエディタ画面に以下を入力(①)します。 { "price": [{"numeric": ["<=", 30000000]}] } 入力したら変更の保存ボタンをクリック(②)します。 70

Slide 71

Slide 71 text

すべての配信プロトコルに〜を選択(①)します。 サブスクリプションフィルターポリシーの動作確認のために以下のSNSトピックに以 下のメッセージを投入(②)します。 { "price": 40000000, "name": "シーガルズコート二番館(空想)", "message": "すごいマンションポエム" } メッセージ本文を設定したら、メッセージの発行ボタンをクリック(③)します。 71

Slide 72

Slide 72 text

上記にある通り、メッセージが広告配布先Aに流れた場合は、予算額にたいして紹介 した商品の価格が高すぎる旨のメッセージがS3バケットに格納されるはずです。 ここまでで正しく設定できている場合は、広告配布先Aにはメッセージが配信されず、 広告配布先Bにのみメッセージが配信されて"安価に過ぎる"旨のフィードバックのみ がS3バケットに格納されます。 72

Slide 73

Slide 73 text

広告配布先Bのサブスクリプションフィルターを作成します。 1億円以上の広告メッセージのみが配信されるように設定します。 73

Slide 74

Slide 74 text

トピック一覧画面からadvertisement-distribution-topicを選択(赤枠)します。 74

Slide 75

Slide 75 text

サブスクリプションタブを選択(①)し、エンドポイントがsubscriber-b-queueとなっ ているものを選択(②)します。 75

Slide 76

Slide 76 text

サブスクリプションフィルターポリシータブを選択(①)し、編集ボタンをクリック(②)し ます。 76

Slide 77

Slide 77 text

JSONエディタに以下の内容を設定(①)します。 { "price": [{"numeric": [">=", 100000000]}] } 設定したら変更の保存ボタンをクリック(②)します。 77

Slide 78

Slide 78 text

動作確認をしていきます。 すべての配信プロトコルに〜を選択(①)します。 下記メッセージをSNSトピックに投入(②)します。 { "price": 400000000, "name": "シーガルズコート二番館(空想)", "message": "すごいマンションポエム" } その上で、メッセージ属性のタイプにNumber、名前にprice、値に400000000 メッセージの発行ボタンをクリック(④)します。 すると⑤のようなメッセージがS3バケットに格納されているはずです。 このようにサブスクリプションフィルタポリシーと、メッセージ属性を組み合わせること で、 特定のサブスクライバ(この場合はSubscriber B)のみにメッセージを送信すること ができます。 (Subscriber Aのイベントが発火していないことは、Lambdaのメトリクスなどをベー スに確認してください。) 78

Slide 79

Slide 79 text

ここまでで一通りの実装が完了しました。 SNSとSQS、Lambdaを使ってメッセージ配信を実現するとともに、サブスクリプショ ンフィルターポリシーを用いて不要なメッセージ配信をなくすことができました。 79

Slide 80

Slide 80 text

80

Slide 81

Slide 81 text

81

Slide 82

Slide 82 text

82