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.3k
AWS研修ハンズオン サーバーレスハンズオン / AWS Serverless Hands On
2021年度リクルート エンジニアコース新人研修の講義資料です
Recruit
PRO
August 20, 2021
Tweet
Share
More Decks by Recruit
See All by Recruit
Browser
recruitengineers
PRO
8
2.2k
JavaScript 研修
recruitengineers
PRO
6
1.4k
TypeScript入門
recruitengineers
PRO
35
11k
モダンフロントエンド 開発研修
recruitengineers
PRO
9
6.1k
Webアクセシビリティ入門
recruitengineers
PRO
3
1.5k
攻撃と防御で実践するプロダクトセキュリティ演習~導入パート~
recruitengineers
PRO
3
1.8k
モバイルアプリ研修
recruitengineers
PRO
5
1.7k
事業価値と Engineering
recruitengineers
PRO
8
5.4k
制約理論(ToC)入門
recruitengineers
PRO
9
3.7k
Other Decks in Technology
See All in Technology
ここ一年のCCoEとしてのAWSコスト最適化を振り返る / CCoE AWS Cost Optimization devio2025
masahirokawahara
1
1.1k
新規案件の立ち上げ専門チームから見たAI駆動開発の始め方
shuyakinjo
0
640
生成AI時代に必要な価値ある意思決定を育てる「開発プロセス定義」を用いた中期戦略
kakehashi
PRO
1
240
DuckDB-Wasmを使って ブラウザ上でRDBMSを動かす
hacusk
1
140
「魔法少女まどか☆マギカ Magia Exedra」のグローバル展開を支える、開発チームと翻訳チームの「意識しない協創」を実現するローカライズシステム
gree_tech
PRO
0
430
Grafana Meetup Japan Vol. 6
kaedemalu
1
200
コスト削減の基本の「キ」~ コスト消費3大リソースへの対策 ~
smt7174
2
320
異業種出身エンジニアが気づいた、転向して十数年経っても変わらない自分の武器とは
macnekoayu
0
260
個人CLAUDE.md紹介と設定から学んだこと/introduce-my-claude-md
shibayu36
0
160
Nstockの一人目エンジニアが 3年間かけて向き合ってきた セキュリティのこととこれから〜あれから半年〜
yo41sawada
0
170
ライブサービスゲームQAのパフォーマンス検証による品質改善の取り組み
gree_tech
PRO
0
430
ガチな登山用デバイスからこんにちは
halka
1
200
Featured
See All Featured
The Language of Interfaces
destraynor
160
25k
Build The Right Thing And Hit Your Dates
maggiecrowley
37
2.8k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
36
2.5k
BBQ
matthewcrist
89
9.8k
The Cult of Friendly URLs
andyhume
79
6.6k
How GitHub (no longer) Works
holman
315
140k
Intergalactic Javascript Robots from Outer Space
tanoku
272
27k
Building a Modern Day E-commerce SEO Strategy
aleyda
43
7.5k
Optimizing for Happiness
mojombo
379
70k
A Tale of Four Properties
chriscoyier
160
23k
Optimising Largest Contentful Paint
csswizardry
37
3.4k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
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