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
【自己流 Lambda(SAM)活用のTips】スタートアップ×AWS オンラインLT大会 C...
Search
Hironori Tanaka
February 27, 2020
Technology
1
470
【自己流 Lambda(SAM)活用のTips】スタートアップ×AWS オンラインLT大会 Coral Developers Night
Lambda 活用の Tips 紹介してきました。
https://coralcapital.connpass.com/event/165260/
#CoralDevelopers
Hironori Tanaka
February 27, 2020
Tweet
Share
More Decks by Hironori Tanaka
See All by Hironori Tanaka
ビジネスサイドと共創し、チーム連動性を高める「Tech2Biz」
hirontan
0
170
【ちょっとしたカスタマイズが大事なエンジニア採用】CTO・CPOが語る!エンジニア採用を成功させる採用オペレーション【LAPRASxHERP】
hirontan
1
800
【僕はこれでハードシングスを乗り越えた。 ~空のコアバリュー「LiveDirect」の正体~】「10名、50名、100名規模それぞれのB2B SaaS技術組織に聞く、フェーズ別ハードシングス」 〜組織拡大中の3社が向き合うエンジニア組織デザイン〜
hirontan
0
1.3k
【AWS Lambda(SAM)でつくるクローラー】Crawler Night 2020 Winter
hirontan
0
2.7k
株式会社空紹介_SIer脱出を語る_SIerで働くU30エンジニア限定イベント_kiitokMeetUp___配布用_.pdf
hirontan
0
200
【「不足している箇所はないか」を考えてきた結果】プロダクトマネージャーがキャリアを語る。U35のPdM志望エンジニア限定【kiitokMeetup】
hirontan
1
930
【プロダクトから顧客や様々な職種へ】CTO of the year 2018【株式会社空】
hirontan
0
300
Other Decks in Technology
See All in Technology
WACATE2024冬セッション資料(ユーザビリティ)
scarletplover
0
200
AI時代のデータセンターネットワーク
lycorptech_jp
PRO
1
280
Opcodeを読んでいたら何故かphp-srcを読んでいた話
murashotaro
0
230
KubeCon NA 2024 Recap / Running WebAssembly (Wasm) Workloads Side-by-Side with Container Workloads
z63d
1
250
10個のフィルタをAXI4-Streamでつなげてみた
marsee101
0
170
マイクロサービスにおける容易なトランザクション管理に向けて
scalar
0
130
LINE Developersプロダクト(LIFF/LINE Login)におけるフロントエンド開発
lycorptech_jp
PRO
0
120
GitHub Copilot のテクニック集/GitHub Copilot Techniques
rayuron
36
13k
継続的にアウトカムを生み出し ビジネスにつなげる、 戦略と運営に対するタイミーのQUEST(探求)
zigorou
0
540
ずっと昔に Star をつけたはずの思い出せない GitHub リポジトリを見つけたい!
rokuosan
0
150
Google Cloud で始める Cloud Run 〜AWSとの比較と実例デモで解説〜
risatube
PRO
0
100
5分でわかるDuckDB
chanyou0311
10
3.2k
Featured
See All Featured
It's Worth the Effort
3n
183
28k
How GitHub (no longer) Works
holman
311
140k
Statistics for Hackers
jakevdp
796
220k
GraphQLとの向き合い方2022年版
quramy
44
13k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.2k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
38
1.9k
Into the Great Unknown - MozCon
thekraken
33
1.5k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
45
2.2k
StorybookのUI Testing Handbookを読んだ
zakiyama
27
5.3k
Building Better People: How to give real-time feedback that sticks.
wjessup
365
19k
No one is an island. Learnings from fostering a developers community.
thoeni
19
3k
Optimizing for Happiness
mojombo
376
70k
Transcript
⾃⼰流 Lambda(SAM)活⽤のTips 株式会社空 ⽥仲 紘典
⾃⼰紹介 2 2012年〜2016年 ヤフー アドテクのインフラエンジニアや社内システムの開 発・保守を主に担当。 その他に、新卒研修のメンター・次世代リーダー育成 Yahoo!アカデミアにも参加をし、育成⼒とリーダーシ ップ⼒を向上させる。 2013年頃から副業も⾏い、AWSや開発などの技術サ
ポートを初めて経験。 2016年〜 空 ホテル向け料⾦設定サービス「MagicPrice」の⽴ち上 げ期からエンジニアとして携り、2016年6⽉取締役兼 エンジニアとして参画。現在はプロダクト責任者 (Chief Production Officer)。
3 「Crawler Night 2020」と重複ありです
会社紹介 4
5 社名︓株式会社空 代表者︓松村⼤貴 設⽴︓2015年 従業員︓30名(⾮正規社員含む) URL︓https://www.sora.flights/
Vision 6 ⾰新的なサービスをつくりながら、幸せな働き⽅を世界に広めます
7 世界中の価格を最適化し、売り⼿も買い⼿も嬉しい世界を作る Mission
8 「MagicPrice」ホテルの料⾦設定をとことんシンプルに Service
9 MagicPrice for xxx 駐⾞場 ⾼速バス
Lambda をどこで利⽤しているのか 10
Research 11 予約 状況 ⾃ホテル︓⾃ホテルの予約データを連携 競合ホテル︓マーケット情報を収集 予約 プラン 予約 金額
・・・ 掲載 状況 掲載 プラン 掲載 金額 ・・・
Components Frontend クローリング結果 Backend 顧客データDB クローリング結果 DB Proxy Crawler Batch
クロール対象の⼀部 ログ保存 集計結果保存 MagicPrice 共通基盤 Machine Learning データ基盤 予約サイト イベント 予約台帳・料⾦更新連携 サイトコントローラ PMS Batch 12
マーケット情報のクローリングに Lambda(SAM)を利⽤ 13
クローリングに利⽤している構成 14 AWS Lambda Amazon S3 Amazon SQS queue クロール対象サイト
1. ホテル単位など分割して、 SQSにキューを貯める 2. キューをフックにLambdaを 起動させ、クローリングする 3. 2と同時にスクレイピングし、 S3にデータを保存する
【個⼈的に】インフラの前提として、気にしていること • ローカルで単体テスト + 周辺の結合テストまで実⾏できる ◦ クラウド環境でできるだけ動かさない ▪ 開発に可能な限りコストかけない ◦
周辺の結合テストはできる限り • 可能な限りデフォルトを利⽤する ◦ あれこれライブラリ入れない ◦ 小難しいことしない 15
ローカル開発︓SAM(サーバーレスアプリケーションモデル) 16
ローカル開発︓SAM(サーバーレスアプリケーションモデル) 17
Lambda(SAM)活⽤のTips 18
sam コマンドで実⾏ 19 • sam local invoke で簡単に実⾏できる。
Makefile にまとめる 20 • コマンド⻑くなりがち • 他社に実⾏してもらう時、簡単に実⾏してもらいたい • 実⾏ディレクトリに、Makefile ファイルを作成して、コマンド格納していくだけ
• `make invoke` だけで実⾏できます ※ Makefile ファイルそのものは調べてください
LocalStackと繋げる(1) 21 • AWSサービスを疑似的に環境構築 • よく利⽤するサービスはオールインワンで備わ っている • Lambdaあるけど、sam を利⽤しているのは、
- sam init でデフォルトの環境構築 - zipで固めて、LocalStack上のLambdaに展開 など 実⾏に⼿間がかかるので、利⽤していません • よく利⽤するサービスは、S3 / SQS / ElasticSearch あたりです。
LocalStackと繋げる(2) 22 Makefile docker-compose • docker-compose に実⾏記述 • aws コマンドの
--endpoint-url オプションで接続先を指定する • この環境では、`make start-platform` で準備完了
LocalStackと繋げる(3) 23 Makefile • LocalStack と SAM を同⼀ネットワークにする必要がある • Dockerで構築されている
LocalStack の NETWORK ID を取得して `sam local invoke` 実⾏時に `--docker-network` オプションで 同⼀ネットワークに所属させて実⾏する • この環境では、`make invoke` で実⾏可能
LocalStackと繋げる(4) 24 Makefile Cloudformation • 実際にプログラム上で利⽤する場合、 環境変数の準備を⾏う必要がある - 主にAWSサービス接続URL •
sam コマンドに `--env-vars`オプションがあるので、 作成したJSONファイルを読み込んで、 利⽤してください
ライブラリは、Layer 使おう(1) 25 • インストールしたライブラリのパス追加や イメージビルドなどしなくても、 デフォルトでパス追加されている • 別のLambda関数で利⽤したい場合、 共通で扱うこともできます。
⾃作したライブラリの共通化もできる • バイナリやスクリプトも配置できる 例.クローリングでは、HeadlessChromeで遷 移していきたいケースがある (参考︓https://github.com/hirontan/sam- template/tree/master/scraping_using_headless_c hrome_from_lambda) CloudFormation
ライブラリは、Layer 使おう(2) 26 • ライブラリの配置先は決まっている(/opt 配下に)
ライブラリは、Layer 使おう(3) 27 • あまりにも⼤きすぎるライブラリを同時に本番環境にアップロードすると 本番でしか確認できなさそうな⼀時修正ができなくなってしまう • インラインコード編集を有効にできる
⼀つだけ、Layer のハマりポイント 28 • Rubyのバージョンが揃っていないとライブラリの読み込みされない可能性がある。 • イメージ「 lambci/lambda:build-ruby2.5 」を利⽤して、ビルドした結果をローカルに配置 し直した結果を利⽤する
• スクリプト⽤意しているので参考にしてください layers/ ├── builds │ └── build_ruby-serverless-crawling-gems.sh ├── docker │ └── Dockerfile_ruby-serverless-crawling-gems └── gemfiles ├── Gemfile_ruby-serverless-crawling-gems └── Gemfile_ruby-serverless-crawling-gems.lock https://github.com/hirontan/sam-template/tree/master/scraping_from_lambda/layers
イベント︓⾮同期的に呼び出す(1) 29 • リアルタイムに実⾏できる • S3 / SQS / CloudWatch
Events など 扱えるイベントはデフォルトで備わっている • ローカルでは、JSONファイルで擬似的に実⾏でき る sam local generate-event でイベント作成 • 本番環境では、プロパティに Events を書いて、 デプロイする。CloudFormationの yaml ファイル に記述するだけ CloudFormation
イベント︓⾮同期的に呼び出す(2) 30 • キューの受け取りは event[ʻRecordsʼ] 簡単に受け取れる • ⼀度にキューを複数受け取り できる設定も、SQS・Kinesis などでも、
プロパティに BatchSize と記述すると 設定できる ソースコード
Cron 実⾏ 31 • CloudWatch Event使えば設定できます Cloudformation https://github.com/hirontan/sam- template/blob/master/cloudformation_template/setting_cron_template.yaml#L20-L28
同時実⾏数 32 • クローリング対象サイトにダメージを与えない ように同時アクセス数は気にしなければいけない。 そのコントロールとして、同時実⾏数の制御を⾏う (もちろんソースコード内でもスリープも考える) • プロパティ ReservedConcurrentExecutions
で 同時実⾏の予約数を制御することを忘れない • もしRDSも接続するなら、データベースへの 同時接続数制御にも。 情報があまり変わらないのであれば、 DataPipelineなどでデータベースのテーブルを CSV化して、CSVにアクセスする⽅法もあります。 CloudFormation
本番環境との切り分けとデプロイ 33 • Cloudformationによるデプロイを⾏うことで、 可能な限り冪等性を保つ (Lambdaの利⽤する周辺サービスまで) • 本番との切り分けが必要になるケースがあるので、 `--parameter-overrides` で
Env=xxx などでデプロイしてください Makefile Cloudformation
本⽇、利⽤していたコード 34 https://github.com/hirontan/sam- template/tree/master/scraping_fr om_lambda
まとめ • Lambda(SAM) x LocalStack でローカル開発が簡単に • Lambda(SAM) x Layer
で共有して、同⼀ソースコードを防ぐ • CloudFormation・AWSサービスを理解していれば、 組み合わせだけで簡単に仕組みが作れる • (全然話していなかったですが、、、) Lambda使いはじめてから、⼤規模な開発でなければ、 100⾏もソースコード書かずに開発済んでます 35
36
参考⽂献 • AWS サーバーレスアプリケーションモデル https://aws.amazon.com/jp/serverless/sam/ • AWS Lambda レイヤー https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-
layers.html • AWS CloudFormation https://aws.amazon.com/jp/cloudformation/ • AWS::Lambda::EventSourceMapping https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/User Guide/aws-resource-lambda-eventsourcemapping.html 37