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大会 Coral Developers Night
Search
Hironori Tanaka
February 27, 2020
Technology
1
380
【自己流 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
160
【ちょっとしたカスタマイズが大事なエンジニア採用】CTO・CPOが語る!エンジニア採用を成功させる採用オペレーション【LAPRASxHERP】
hirontan
1
740
【僕はこれでハードシングスを乗り越えた。 ~空のコアバリュー「LiveDirect」の正体~】「10名、50名、100名規模それぞれのB2B SaaS技術組織に聞く、フェーズ別ハードシングス」 〜組織拡大中の3社が向き合うエンジニア組織デザイン〜
hirontan
0
1.2k
【AWS Lambda(SAM)でつくるクローラー】Crawler Night 2020 Winter
hirontan
0
2.5k
株式会社空紹介_SIer脱出を語る_SIerで働くU30エンジニア限定イベント_kiitokMeetUp___配布用_.pdf
hirontan
0
150
【「不足している箇所はないか」を考えてきた結果】プロダクトマネージャーがキャリアを語る。U35のPdM志望エンジニア限定【kiitokMeetup】
hirontan
1
850
【プロダクトから顧客や様々な職種へ】CTO of the year 2018【株式会社空】
hirontan
0
260
Other Decks in Technology
See All in Technology
疲弊しない!AWSセキュリティ統制の考え方 #devio_osakaday1
masahirokawahara
6
5.9k
巨大なテーブルのテーブル定義を無停止で安全に誰でも変更できるようにする / Table-definitions-for-huge-tables-can-be-modified-by-anyone-safely-and-non-disruptively
freee
1
740
オーナーシップを持つ領域を明確にする
konifar
11
2.6k
カオナビの利用実績をアウトカムへつなげる旅 / example-of-data-management-startup-in-kaonavi
kaonavi
0
120
検証を通して見えてきたTiDBの性能特性
lycorptech_jp
PRO
6
3.4k
LLM とプロンプトエンジニアリング/チューターをビルドする / LLM and Prompt Engineering and Building Tutors
ks91
PRO
0
220
開発生産性向上サービスを作るFindyが自分たちで開発生産性を爆上げした組織づくりの歩み / Findy's path to boosting its own development productivity 2024-04-17
ma3tk
3
340
AWS を使う上で知っておきたいオンプレミス知識/aws-on-premise-essentials
emiki
1
4.2k
ChatGPT for IT Service Management (IT Pro)
dahatake
2
200
Databricks:『生成AI World Cup』のご案内
databricksjapan
2
150
GraphQL 成熟度モデルの紹介と、プロダクトに当てはめた事例 / GraphQL maturity model
mh4gf
4
120
TransitGatewayの基礎
toru_kubota
0
230
Featured
See All Featured
Being A Developer After 40
akosma
56
580k
Gamification - CAS2011
davidbonilla
76
4.6k
Six Lessons from altMBA
skipperchong
20
3k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
60
14k
Web development in the modern age
philhawksworth
202
10k
No one is an island. Learnings from fostering a developers community.
thoeni
14
2.1k
Automating Front-end Workflow
addyosmani
1355
200k
The Straight Up "How To Draw Better" Workshop
denniskardys
227
130k
Teambox: Starting and Learning
jrom
128
8.4k
Agile that works and the tools we love
rasmusluckow
324
20k
Build The Right Thing And Hit Your Dates
maggiecrowley
23
2k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
29
6k
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