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
580
【自己流 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
880
【僕はこれでハードシングスを乗り越えた。 ~空のコアバリュー「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
1k
【プロダクトから顧客や様々な職種へ】CTO of the year 2018【株式会社空】
hirontan
0
380
Other Decks in Technology
See All in Technology
FinOps について (ちょっと) 本気出して考えてみた
skmkzyk
0
190
AIエージェント入門 〜基礎からMCP・A2Aまで〜
shukob
0
130
OAuthからOIDCへ ― 認可の仕組みが認証に拡張されるまで
yamatai1212
0
150
Railsの話をしよう
yahonda
0
170
Node.js 2025: What's new and what's next
ruyadorno
0
790
Linux カーネルが支えるコンテナの仕組み / LF Japan Community Days 2025 Osaka
tenforward
1
100
Claude Codeを駆使した初めてのiOSアプリ開発 ~ゼロから3週間でグローバルハッカソンで入賞するまで~
oikon48
10
5.2k
AI時代の開発を加速する組織づくり - ブログでは書けなかったリアル
hiro8ma
1
220
AIとともに歩んでいくデザイナーの役割の変化
lycorptech_jp
PRO
0
770
「最速」で Gemini CLI を使いこなそう! 〜Cloud Shell/Cloud Run の活用〜 / The Fastest Way to Master the Gemini CLI — with Cloud Shell and Cloud Run
aoto
PRO
0
140
Claude Code Subagents 再入門 ~cc-sddの実装で学んだこと~
gotalab555
10
17k
エンタメとAIのための3Dパラレルワールド構築(GPU UNITE 2025 特別講演)
pfn
PRO
0
620
Featured
See All Featured
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
9.7k
GraphQLとの向き合い方2022年版
quramy
49
14k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
10
880
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
657
61k
BBQ
matthewcrist
89
9.8k
Designing Experiences People Love
moore
142
24k
The Illustrated Children's Guide to Kubernetes
chrisshort
49
51k
How GitHub (no longer) Works
holman
315
140k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
46
7.7k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
15k
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