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
570
【自己流 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
180
【ちょっとしたカスタマイズが大事なエンジニア採用】CTO・CPOが語る!エンジニア採用を成功させる採用オペレーション【LAPRASxHERP】
hirontan
1
870
【僕はこれでハードシングスを乗り越えた。 ~空のコアバリュー「LiveDirect」の正体~】「10名、50名、100名規模それぞれのB2B SaaS技術組織に聞く、フェーズ別ハードシングス」 〜組織拡大中の3社が向き合うエンジニア組織デザイン〜
hirontan
0
1.4k
【AWS Lambda(SAM)でつくるクローラー】Crawler Night 2020 Winter
hirontan
0
3k
株式会社空紹介_SIer脱出を語る_SIerで働くU30エンジニア限定イベント_kiitokMeetUp___配布用_.pdf
hirontan
0
240
【「不足している箇所はないか」を考えてきた結果】プロダクトマネージャーがキャリアを語る。U35のPdM志望エンジニア限定【kiitokMeetup】
hirontan
1
990
【プロダクトから顧客や様々な職種へ】CTO of the year 2018【株式会社空】
hirontan
0
360
Other Decks in Technology
See All in Technology
普通のチームがスクラムを会得するたった一つの冴えたやり方 / the best way to scrum
okamototakuyasr2
0
100
これでもう迷わない!Jetpack Composeの書き方実践ガイド
zozotech
PRO
0
1k
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
10
75k
職種の壁を溶かして開発サイクルを高速に回す~情報透明性と職種越境から考えるAIフレンドリーな職種間連携~
daitasu
0
170
なぜスクラムはこうなったのか?歴史が教えてくれたこと/Shall we explore the roots of Scrum
sanogemaru
5
1.6k
なぜテストマネージャの視点が 必要なのか? 〜 一歩先へ進むために 〜
moritamasami
0
230
Evolución del razonamiento matemático de GPT-4.1 a GPT-5 - Data Aventura Summit 2025 & VSCode DevDays
lauchacarro
0
210
未経験者・初心者に贈る!40分でわかるAndroidアプリ開発の今と大事なポイント
operando
5
710
【NoMapsTECH 2025】AI Edge Computing Workshop
akit37
0
220
サラリーマンの小遣いで作るtoCサービス - Cloudflare Workersでスケールする開発戦略
shinaps
2
460
初めてAWSを使うときのセキュリティ覚書〜初心者支部編〜
cmusudakeisuke
1
270
Agile PBL at New Grads Trainings
kawaguti
PRO
1
440
Featured
See All Featured
Embracing the Ebb and Flow
colly
87
4.8k
Building a Modern Day E-commerce SEO Strategy
aleyda
43
7.6k
Building Flexible Design Systems
yeseniaperezcruz
329
39k
It's Worth the Effort
3n
187
28k
Java REST API Framework Comparison - PWX 2021
mraible
33
8.8k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
1.9k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.1k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
Agile that works and the tools we love
rasmusluckow
330
21k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Large-scale JavaScript Application Architecture
addyosmani
513
110k
Facilitating Awesome Meetings
lara
55
6.5k
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