Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
AWS研修ハンズオン サーバーレスハンズオン / AWS Serverless Hands On
Search
Recruit
PRO
August 20, 2021
Technology
4
6.1k
AWS研修ハンズオン サーバーレスハンズオン / AWS Serverless Hands On
2021年度リクルート エンジニアコース新人研修の講義資料です
Recruit
PRO
August 20, 2021
Tweet
Share
More Decks by Recruit
See All by Recruit
Balancing Revenue Goals and Off-Policy Evaluation Performance in Coupon Allocation
recruitengineers
PRO
1
25
Flutterによる 効率的なAndroid・iOS・Webアプリケーション開発の事例
recruitengineers
PRO
0
160
VPC Traffic Mirroring とOSS を利⽤した ネットワークフォレンジック基盤の構築・運⽤
recruitengineers
PRO
2
53
スタサプ ForSCHOOLアプリのシンプルな設計
recruitengineers
PRO
3
1.1k
リクルート流データ基盤塾~鶴谷と学ぶ~
recruitengineers
PRO
5
250
『SUUMO』 スマホサイト デザインリニューアルへの挑戦
recruitengineers
PRO
5
350
『リクルートダイレクトスカウト』 のリニューアルから振り返る: ビジョンドリブンの可能性
recruitengineers
PRO
3
320
負債あるモノリスのオブザーバビリティに組織で向き合う
recruitengineers
PRO
9
400
あなたの知らないiOS開発の世界
recruitengineers
PRO
4
340
Other Decks in Technology
See All in Technology
BLADE: An Attempt to Automate Penetration Testing Using Autonomous AI Agents
bbrbbq
0
340
適材適所の技術選定 〜GraphQL・REST API・tRPC〜 / Optimal Technology Selection
kakehashi
1
740
電話を切らさない技術 電話自動応答サービスを支える フロントエンド
barometrica
2
500
Platform Engineering for Software Developers and Architects
syntasso
1
580
リンクアンドモチベーション ソフトウェアエンジニア向け紹介資料 / Introduction to Link and Motivation for Software Engineers
lmi
4
300k
Engineer Career Talk
lycorp_recruit_jp
0
200
Python(PYNQ)がテーマのAMD主催のFPGAコンテストに参加してきた
iotengineer22
0
570
Application Development WG Intro at AppDeveloperCon
salaboy
0
210
Lambda10周年!Lambdaは何をもたらしたか
smt7174
2
140
Exadata Database Service on Dedicated Infrastructure(ExaDB-D) UI スクリーン・キャプチャ集
oracle4engineer
PRO
2
3.2k
型チェック 速度改善 奮闘記⌛
tocomi
1
190
OOM発生時のトラブルシューティング Profilerを活用できるか調査してみた
atsushii
0
140
Featured
See All Featured
Designing for humans not robots
tammielis
250
25k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
111
49k
Intergalactic Javascript Robots from Outer Space
tanoku
269
27k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
159
15k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
506
140k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
10
730
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
8
910
Optimizing for Happiness
mojombo
376
70k
A Modern Web Designer's Workflow
chriscoyier
693
190k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
25
1.8k
YesSQL, Process and Tooling at Scale
rocio
169
14k
Git: the NoSQL Database
bkeepers
PRO
427
64k
Transcript
1
本ハンズオンでは、擬似的な広告配信とそれに対するフィードバックの受付までの部 分の仮想的な流れをSNS, SQS, Lambdaを使って実装します。 広告出稿元が、広告業者に広告メッセージを渡し、それを広告業者が配布先(今回 はAとBの2つが存在)に配信します。 広告配布先は、配信された広告メッセージの金額と自身の予算に合わせて紹介結 果のフィードバックをフィードバック窓口に投げ入れます。 広告業者は広告配信先の特性(今回は予算額)に合わせた広告配信を実現するこ とで不要な広告を配信しないことを実現しようとします。
2
先程のスライドをAWSのコンポーネントに落とし込むと上図のようになります。 広告業者は入稿された広告メッセージをSNSトピックを介してサブスクリプション先 (広告配布先A, B)に配信します。 広告配布先A, Bでは配信されたメッセージをSQSのキューに格納し、Lambdaで処 理をします。処理結果は連絡窓口のS3バケットに格納します。 3
なお、広告配布先で生成されるフィードバックは、商品の価格が予算額にフィットしな い場合はネガティブなフィードバックが届いてしまうので、それを減らすためにも配信 をある程度フィルタする必要があります。 4
5
最初は広告業者のSNSトピックを作成します。 6
SNSの画面に移動し、トピックメニューを選択(①)してトピック一覧の画面に移動し ます。トピックの作成ボタンをクリック(②)します。 7
トピックの作成画面では、トピックの名前を設定します。 ここでは、advertisement-distribution-topicと設定(①)します。 (d"e"stributionとなってますがtypoです) 名前を設定したらトピックの作成ボタンをクリック(②)します。 8
SNSトピックの作成が完了しました。 9
次は、広告配布先AのSQSキューを作成します。 10
SQSのサービスに移動し、キューの一覧画面に移動します。 キューを作成ボタンをクリック(赤枠)します。 11
標準キューを指定(①)します 名前にsubscriber-a-queueを指定(②)します。 設定部分で可視性タイムアウトとして1分を指定(③)します。 ①〜③が終わったらキューを作成ボタンをクリック(④)します。 12
キューの作成が完了しました。 広告業者のSNSトピックをサブスクライブしたいので、 SNSサブスクリプションタブを選択(①)し、AmazonSNSトピックにサブスクライブボ タンをクリック(②)します。 13
SNSトピックのサブスクライブ画面が表示されるので、 adversisement-distribution-topicをサブスクライブするようにトピックを指定 (①)します。 指定したら、保存ボタンをクリック(②)します。 14
広告業者のSNSトピックと、広告配布先AのSQSキューが接続されました。 次はほぼ同様の手順で広告配布先BのSQSキューを作成します。 15
SQSキューの一覧画面からキューを作成ボタンをクリック(赤枠)します。 16
標準キューを選択(①)し、名前としてsubscriber-b-queueを指定(②)します。 可視性タイムアウトで1分を指定(③)します。 ①〜③までが完了したら、キューを作成ボタンをクリック(④)します。 17
SNSサブスクリプションタブを選択(①)し、Amazon SNS トピックにサブスクライブ ボタンをクリック(②)します。 18
SNSトピックのサブスクライブ画面が表示されるので、 adversisement-distribution-topicをサブスクライブするようにトピックを指定 (①)します。 指定したら、保存ボタンをクリック(②)します。 19
はれて、広告配布先A, BのSQSキューが広告業者のSNSトピックをサブスクライブ している状態になりました。 ここまでの動作確認をしていきます。 広告業者のSNSトピックにメッセージを投入してSQSに届くことを確認します。 20
SNSトピックの一覧画面に移動し、advertisement-distribution-topicのリンク をクリック(赤枠)します。 21
トピックの詳細画面が表示されるので、 メッセージの発行ボタンをクリック(赤枠)します。 22
メッセージ本文で、 すべての配信プロトコルに同一のペイロードのラジオボックスを選択(①)します。 メッセージ本文に以下の内容を入力(②)します。 { "price": 25000000, "name": "シーガルズグランドガーデン(架空)", "message": "適切なマンションポエムをここに入れる"
} ②までが完了したらメッセージの発行(③)ボタンをクリックします。 これでSNSトピックへのメッセージの投入は完了です。 広告配布先A, Bのキューにメッセージが配信されているかを確認していきましょう。 23
SQSキュー一覧画面を表示します。 subscriber-a-queueとsubscriber-b-queueの利用可能なメッセージが1と なっていることを確認(①)します。 さらに詳細に確認する場合はキューのいずれかのリンクをクリック(②)します 24
メッセージをポーリングボタンをクリック(①)するとキューに格納されたメッセージが 取得できます。メッセージの一覧からリンクをクリック(②)すると実際にキューに格納 されたメッセージが確認できます。 25
フィードバックを受け付けるためのバケットを作成します。 26
S3バケットの一覧画面に移動し、バケットを作成ボタンをクリック(①)します。 バケットの名前にadvertisement-feedback-{ランダム文字列}を指定(②)します。 リージョンはap-northeast-1を指定(③)します。 ①〜③が完了したらバケットを作成ボタンをクリック(④)します。 27
フィードバックを受け付けるためのバケットの作成が完了したので、結果のフィード バック用のLambda関数を作成します。 28
まずは、広告配布先Aに付与するLambda関数を作成します。 29
Lambdaサービスの画面に移動し、関数一覧を表示します。関数の作成ボタンをク リック(①)します。 作成画面に遷移したら、関数名としてreview-function-aを指定(②)します。 ランタイムとしてPython3.8または3.7を指定(③)します。 30
次に関数コードの設定を行います。 コードタブを選択(①)し、コードーソースのコード欄に https://github.com/Fufuhu/bootcamp-2021- sample/blob/main/lambda/subscriber.pyのコードを貼り付け(②)します。 貼り付けしたら、Deployボタンをクリック(③)します。 31
設定タブをクリック(①)します。 一般設定を選択(②)し、編集ボタンをクリック(③)します。 32
タイムアウトの値として30秒を指定(①)し、保存ボタンをクリック(②)します。 33
次に関数の実行に必要なアクセス権限をIAMロールに付与します。 アクセス権限メニューを選択(①)し、ロール名をクリック(②)して、IAMロールの詳細 画面を開きます。 34
インラインポリシーの追加リンク(赤枠)をクリックします。 35
サービスにS3(①)アクションにPutObject(②)、 リソースとしてすべてのリソース(③)を選択し、 ポリシーの確認ボタンをクリック(④)します。 36
ポリシーの名前としてPutObjectPolicyを指定(①)し、 ポリシーの作成ボタンをクリック(②)します。 37
続けてSQSキューにアクセスするためのインラインポリシーの追加を行います。 サービスとしてSQS(①)、アクションとしてGetQueueAttrributes, ReceiveMessage, DeleteMessage(②)、リソースとしてすべてのリソース(③)を 選択します。 ①〜③が完了したら、ポリシーの確認ボタンをクリック(④)します。 38
ポリシーの確認画面では、名前としてSQSAccessPolicyを指定(①)します。 名前を指定したらポリシーの作成ボタンをクリック(②)します。 39
はれて、IAMロールにLambda関数を正しく動かすのに必要なポリシーの付与が完 了しました。 40
もとから存在しているポリシー(AWSLambdaBasicExecutionRole-〜)を修正し ます 左側の▼をクリックします。 41
ポリシーの編集ボタンをクリックします。 42
対象リソースをすべてのリソースに変更します。 ポリシーの確認ボタンをクリックします。 43
IAMロールの設定変更が完了したら、環境変数を設定します。 環境設定メニューを選択(①)し、編集ボタンをクリック(②)します。 44
環境変数としてFEEDBACK_UPLOAD_BUCKETとその値を指定(①)します。この ときの値は、先程作成したS3バケットの名前を指定します。 次にPRICE_UPPER_LIMITを指定します。広告配布先Aは予算額が3000万円な ので、30000000を指定(②)します。 指定が終わったら保存ボタンをクリック(③)します。 45
最後に関数を実行するためのトリガーとしてSQSキューを指定します。 トリガーを追加ボタンをクリック(赤枠)します。 46
トリガーの設定で、SQSを指定(①)します。 SQSキューとしてsubscriber-a-queueを指定(②)します。 ここまで完了したら追加ボタンをクリック(③)します。 47
ここまでの作業で広告配布先AのLambda関数が作成できました。 48
以降は、広告配布先BのLambda関数を作成します。 49
Lambdaサービスの画面から関数一覧を表示します。 関数の作成ボタンをクリック(①)します。 関数名としてreview-function-bを指定(②)します。 ランタイムとしてPython3.8またはPython3.7を指定(③)します。 実行ロールとしては既存のロールを使用するを選択(④)し、 review-function-aに紐付けたロールを指定(⑤)します。 ①〜⑤が完了したら関数の作成をクリック(⑥)します。 50
コードタブを選択(①)して、https://github.com/Fufuhu/bootcamp-2021- sample/blob/main/lambda/subscriber.py のコードを貼り付け(②)ます。 Deployボタンをクリック(④)します。 51
設定タブをクリック(①)して、一般設定メニューを選択(②)します。 編集ボタンをクリック(③)してLambda関数の一般設定画面を表示します。 52
タイムアウトの値を30秒に設定(①)します。 保存ボタンをクリック(②)します。 53
次に環境変数を設定します。 設定タブを選択(①)し、環境変数メニューをクリック(②)します。 編集ボタンをクリック(③)します。 54
環境変数としてFEEDBACK_UPLOAD_BUCKETとその値を指定(①)します。この ときの値は、先程作成したS3バケットの名前を指定します。 次にPRICE_LOWER_LIMITを指定します。広告配布先Aは1億円以上の商品を 希望なので、100000000を指定(②)します。 指定が終わったら保存ボタンをクリック(③)します。 55
関数を実行するためのトリガーとしてSQSキューを追加します。 トリガーを追加ボタンをクリック(赤枠)します。 56
トリガーの設定で、SQSを指定(①)します。 SQSキューとしてsubscriber-a-queueを指定(②)します。 ここまで完了したら追加ボタンをクリック(③)します。 57
はれて広告配布先A, Bの両方にフィードバック用のLambda関数が作成できました。 58
それではここまでの動作確認をしていきます。 59
作成したSNSトピックに広告メッセージを投入します。 SNSサービスの画面を開いてSNSトピックの一覧画面を表示します。 作成したSNSトピックを選択(①)して、メッセージの発行ボタンをクリック(②)します。 60
すべての配信プロトコルに〜を選択(①)します。 メッセージ本文に以下の内容を入力(②)します。 { "price": 40000000, "name": "シーガルズグランドガーデン(架空)", "message": "適切なマンションポエムをここに入れる" }
入力が終わったらメッセージの発行ボタンをクリック(③)します。 61
S3サービスの画面に移動し、作成したS3バケットをクリック(①)します。 作成されたオブジェクトのうち、最新のものを2つ確認(②)します。 オブジェクトをダウンロードしてみましょう。 62
広告配布先A, Bから届いたとみられるメッセージがあります。 残念ながら、A、B両方の要件に合致しない広告メッセージを送ったために、ネガティ ブなメッセージが返ってきています。 63
広告配布先Aは3000万円以下、広告配布先Bは1億円以上とのことなので、4000 万円の広告情報は両者ともに流してはいけませんでした。 64
余分なメッセージをSNSから流さないようにするにはサブスクリプションフィルターを 利用します。 65
広告配布先Aのサブスクリプションフィルターを作成していきます。 3000万円以下の広告のみが配布されるようにします。 66
SNSトピックの一覧を表示します。 advertisement-distribution-topicを選択(赤枠)します。 67
サブスクリプションタブを選択(①)してサブスクリプションの一覧を表示します。 エンドポイントがsubscriber-a-queueとなっているものを選択(②)します。 68
サブスクリプションフィルターポリシータブを選択(①)し、 編集ボタンをクリック(②)します。 69
JSONエディタ画面に以下を入力(①)します。 { "price": [{"numeric": ["<=", 30000000]}] } 入力したら変更の保存ボタンをクリック(②)します。 70
すべての配信プロトコルに〜を選択(①)します。 サブスクリプションフィルターポリシーの動作確認のために以下のSNSトピックに以 下のメッセージを投入(②)します。 { "price": 40000000, "name": "シーガルズコート二番館(空想)", "message": "すごいマンションポエム"
} メッセージ本文を設定したら、メッセージの発行ボタンをクリック(③)します。 71
上記にある通り、メッセージが広告配布先Aに流れた場合は、予算額にたいして紹介 した商品の価格が高すぎる旨のメッセージがS3バケットに格納されるはずです。 ここまでで正しく設定できている場合は、広告配布先Aにはメッセージが配信されず、 広告配布先Bにのみメッセージが配信されて"安価に過ぎる"旨のフィードバックのみ がS3バケットに格納されます。 72
広告配布先Bのサブスクリプションフィルターを作成します。 1億円以上の広告メッセージのみが配信されるように設定します。 73
トピック一覧画面からadvertisement-distribution-topicを選択(赤枠)します。 74
サブスクリプションタブを選択(①)し、エンドポイントがsubscriber-b-queueとなっ ているものを選択(②)します。 75
サブスクリプションフィルターポリシータブを選択(①)し、編集ボタンをクリック(②)し ます。 76
JSONエディタに以下の内容を設定(①)します。 { "price": [{"numeric": [">=", 100000000]}] } 設定したら変更の保存ボタンをクリック(②)します。 77
動作確認をしていきます。 すべての配信プロトコルに〜を選択(①)します。 下記メッセージをSNSトピックに投入(②)します。 { "price": 400000000, "name": "シーガルズコート二番館(空想)", "message": "すごいマンションポエム"
} その上で、メッセージ属性のタイプにNumber、名前にprice、値に400000000 メッセージの発行ボタンをクリック(④)します。 すると⑤のようなメッセージがS3バケットに格納されているはずです。 このようにサブスクリプションフィルタポリシーと、メッセージ属性を組み合わせること で、 特定のサブスクライバ(この場合はSubscriber B)のみにメッセージを送信すること ができます。 (Subscriber Aのイベントが発火していないことは、Lambdaのメトリクスなどをベー スに確認してください。) 78
ここまでで一通りの実装が完了しました。 SNSとSQS、Lambdaを使ってメッセージ配信を実現するとともに、サブスクリプショ ンフィルターポリシーを用いて不要なメッセージ配信をなくすことができました。 79
80
81
82