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
Flutterによる 効率的なAndroid・iOS・Webアプリケーション開発の事例
recruitengineers
PRO
0
75
VPC Traffic Mirroring とOSS を利⽤した ネットワークフォレンジック基盤の構築・運⽤
recruitengineers
PRO
1
44
スタサプ ForSCHOOLアプリのシンプルな設計
recruitengineers
PRO
3
1k
リクルート流データ基盤塾~鶴谷と学ぶ~
recruitengineers
PRO
5
240
『SUUMO』 スマホサイト デザインリニューアルへの挑戦
recruitengineers
PRO
5
340
『リクルートダイレクトスカウト』 のリニューアルから振り返る: ビジョンドリブンの可能性
recruitengineers
PRO
3
310
負債あるモノリスのオブザーバビリティに組織で向き合う
recruitengineers
PRO
9
400
あなたの知らないiOS開発の世界
recruitengineers
PRO
4
330
大規模プロダクトにおける組織作りと技術ポートフォリオマネジメント
recruitengineers
PRO
4
490
Other Decks in Technology
See All in Technology
Terraform未経験の御様に対してどの ように導⼊を進めていったか
tkikuchi
2
430
【若手エンジニア応援LT会】ソフトウェアを学んできた私がインフラエンジニアを目指した理由
kazushi_ohata
0
150
元旅行会社の情シス部員が教えるおすすめなre:Inventへの行き方 / What is the most efficient way to re:Invent
naospon
2
330
SSMRunbook作成の勘所_20241120
koichiotomo
2
130
Shopifyアプリ開発における Shopifyの機能活用
sonatard
4
250
Terraform CI/CD パイプラインにおける AWS CodeCommit の代替手段
hiyanger
1
240
TanStack Routerに移行するのかい しないのかい、どっちなんだい! / Are you going to migrate to TanStack Router or not? Which one is it?
kaminashi
0
580
ドメイン名の終活について - JPAAWG 7th -
mikit
33
20k
いざ、BSC討伐の旅
nikinusu
2
780
オープンソースAIとは何か? --「オープンソースAIの定義 v1.0」詳細解説
shujisado
5
630
iOSチームとAndroidチームでブランチ運用が違ったので整理してます
sansantech
PRO
0
130
複雑なState管理からの脱却
sansantech
PRO
1
140
Featured
See All Featured
Measuring & Analyzing Core Web Vitals
bluesmoon
4
120
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
31
2.7k
Making Projects Easy
brettharned
115
5.9k
Practical Orchestrator
shlominoach
186
10k
Navigating Team Friction
lara
183
14k
BBQ
matthewcrist
85
9.3k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.3k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
109
49k
Bash Introduction
62gerente
608
210k
Why Our Code Smells
bkeepers
PRO
334
57k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
10
720
Build The Right Thing And Hit Your Dates
maggiecrowley
33
2.4k
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