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
Azure Functions HTTPトリガーにおけるタイムアウトでハマったこと
recruitengineers
PRO
2
150
実務につなげる数理最適化
recruitengineers
PRO
6
690
うちにも入れたいDatadog
recruitengineers
PRO
2
380
リクルートのデータ基盤 Crois 年3倍成長!1日40,000コンテナの実行を支える AWS 活用とプラットフォームエンジニアリング
recruitengineers
PRO
2
330
Splunk Enterpriseで S3のデータを直接検索してみた!
recruitengineers
PRO
2
150
Looker APIを使い倒す ユーザーフィードバックを基にした継続的改善サイクル
recruitengineers
PRO
3
57
Kaggleふりかえり会〜LLM 20 Questions & ISIC 2024
recruitengineers
PRO
2
230
Balancing Revenue Goals and Off-Policy Evaluation Performance in Coupon Allocation
recruitengineers
PRO
2
51
Flutterによる 効率的なAndroid・iOS・Webアプリケーション開発の事例
recruitengineers
PRO
0
390
Other Decks in Technology
See All in Technology
podman_update_2024-12
orimanabu
1
260
AWS re:Invent 2024 ふりかえり
kongmingstrap
0
130
どちらを使う?GitHub or Azure DevOps Ver. 24H2
kkamegawa
0
680
.NET 9 のパフォーマンス改善
nenonaninu
0
730
KubeCon NA 2024 Recap / Running WebAssembly (Wasm) Workloads Side-by-Side with Container Workloads
z63d
1
240
生成AIをより賢く エンジニアのための RAG入門 - Oracle AI Jam Session #20
kutsushitaneko
4
220
C++26 エラー性動作
faithandbrave
2
700
Oracle Cloud Infrastructure:2024年12月度サービス・アップデート
oracle4engineer
PRO
0
170
AIのコンプラは何故しんどい?
shujisado
1
190
watsonx.ai Dojo #5 ファインチューニングとInstructLAB
oniak3ibm
PRO
0
160
Microsoft Azure全冠になってみた ~アレを使い倒した者が試験を制す!?~/Obtained all Microsoft Azure certifications Those who use "that" to the full will win the exam! ?
yuj1osm
1
110
サーバレスアプリ開発者向けアップデートをキャッチアップしてきた #AWSreInvent #regrowth_fuk
drumnistnakano
0
190
Featured
See All Featured
The Cult of Friendly URLs
andyhume
78
6.1k
Stop Working from a Prison Cell
hatefulcrawdad
267
20k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
8
1.2k
Art, The Web, and Tiny UX
lynnandtonic
298
20k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.3k
It's Worth the Effort
3n
183
28k
The Cost Of JavaScript in 2023
addyosmani
45
7k
Done Done
chrislema
181
16k
Designing Experiences People Love
moore
138
23k
Building Your Own Lightsaber
phodgson
103
6.1k
How to Ace a Technical Interview
jacobian
276
23k
Optimizing for Happiness
mojombo
376
70k
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