Cloud Operator Days Tokyo 2023でのオンデマンドセッションにて使用したスライドです。
https://cloudopsdays.com/
Cloud Operator Days Tokyo 2023 @02AWS Lambdaから始めるDevチームの小さなDevOps改善〜QCDどれも諦めない運用を目指して〜
View Slide
© 2012-2023 BASE, Inc.#CODT2023Web Application Enginner02 大津 和槻:@cocoeyes022021/02~ BASE, Inc.自己紹介PHP系カンファレンス登壇 執筆 登壇応援中!
© 2012-2023 BASE, Inc.#CODT2023とあるしくじり話と小さなDevOps改善について話します3今回のトークでは
今回の話に出てくるサービスについて
© 2012-2023 BASE, Inc.#CODT2023BASEとは?5コンセプト:誰でも簡単に使えるネットショップ作成サービス● 商品・注文管理● ショップデザイン● 顧客情報管理などを行うショップオーナー向け機能+● 商品検索● 決済・注文(カート)などを行う購入者(カスタマー)向け機能ネットショップ作成サービス「BASE」
© 2012-2023 BASE, Inc.#CODT2023拡張機能「BASE Apps」6ショップ運営に必須な機能とは別に、ショップオーナーが自身のショップに必要な機能だけを選択して利用できるようにする仕組み抽選販売 App クーポン App 広告効果測定AppメッセージApp他にも外部サービスとの連携Appも多数…
© 2012-2023 BASE, Inc.#CODT2023Google商品連携・広告 AppGoogle ショッピング広告の一種であるキャンペーンがかんたんに出稿・管理できるApp2021年10月にリリースされ、現在でもショップや商品の認知につながり集客・販路拡大へ大きく貢献している
© 2012-2023 BASE, Inc.#CODT2023Google商品連携・広告 AppGoogle 広告、Google Merchant Center etc...のAPI(Googleが提供するライブラリを含む)※Batch, Workerなども存在するが割愛簡易的な構成図ショップオーナーログ収集サーバ(中略)Webサーバ
ある日、問題が発生
© 2012-2023 BASE, Inc.#CODT2023Google商品連携・広告 Appが動かなくなってしまう!?10Google広告APIのバージョンには以下の仕様があった● 3~4ヶ月ごとに新バージョンがリリースされる● 基本的に、新バージョンがリリースされてから約9ヶ月~1年後に廃止される● 廃止されたバージョンでは、Google広告のAPIが使用できなくなるhttps://developers.google.com/google-ads/api/docs/sunset-dates?hl=ja
© 2012-2023 BASE, Inc.#CODT2023Google商品連携・広告 Appが動かなくなってしまう!?11公式Google 広告APIクライアントライブラリ (googleads/google-ads-php)にも、バージョンに関する仕様と傾向があった● APIクライアントライブラリのバージョンによって、使用できるGoogle広告APIのバージョンも変わる● 現状約1年おきに、phpのrequireのバージョンが上がっている
© 2012-2023 BASE, Inc.#CODT2023Google商品連携・広告 Appが動かなくなってしまう!?12定期的にPHPのバージョンを上げないと、ライブラリのバージョンが上げられない≒Google広告APIのバージョンが上げられず、廃止によってAppが動かなくなる
© 2012-2023 BASE, Inc.#CODT2023Google商品連携・広告 Appが動かなくなってしまう!?13定期的にPHPのバージョンを上げないと、ライブラリのバージョンが上げられない≒Google広告APIのバージョンが上げられず、廃止によってAppが動かなくなるBASE全体の開発基盤を触るチームへ、PHPのバージョンを上げるように依頼あと約2ヶ月で上げなければいけない状況になっていた(当時PHP7.3 -> 7.4)なんとか、ギリギリでバージョンは上がった次は7.4 -> 8.0に上げなければいけない過去10年もののコードかつメジャーバージョンアップなので、難易度は高い前もって依頼をしよう・・・果たして本当にそれでいいのだろうか?
© 2012-2023 BASE, Inc.#CODT2023ふと振り返る14そもそもとしてビジネスの命運を他チームが握っている状況は、あまりにも不確実性が高くないか?(例えばバージョンを上げている時に、優先度がもっと高いインシデント対応が入ってしまったら?)
© 2012-2023 BASE, Inc.#CODT2023ふと振り返る15そもそもとしてビジネスの命運を他チームが握っている状況は、あまりにも不確実性が高くないか?(例えばバージョンを上げている時に、優先度がもっと高いインシデント対応が入ってしまったら?)確かに言語のバージョンは定期的に上げていくべきではあるものの、1つのApp(機能)のために他全て巻き込まなければいけないのは影響範囲が広い(ハードルが高い)のではないか?そもそもその状況は健全なのか?
ビジネスを止めず確実に自チームでコントロールできる状況を作りたい...!
© 2012-2023 BASE, Inc.#CODT2023案:ライブラリ部分を 別サーバーに切り出す17● 自分たちでGoogle 広告ライブラリやGoogle 広告 APIのバージョンを上げていくことができるようにしたい● でもサーバー管理はなるべくしたくない○ 必要以上の運用の負荷でチームのリソースを圧迫することも望んではいない● 運用の知見のないようなdevチームでもやっていけるようにしたいGoogle 広告 APIwebサーバGoogle 広告ライブラリを含む運用負荷の少ないサーバ??
© 2012-2023 BASE, Inc.#CODT2023案:ライブラリ部分を 別サーバーに切り出す18どうするか● Devチーム(自チーム)でEC2インスタンスに切り出して運用していく● Devチーム(自チーム)でECS on fargateに切り出して運用していく● DevチームでAWS Lambdaを運用していく
© 2012-2023 BASE, Inc.#CODT2023案:ライブラリ部分を 別サーバーに切り出す19どうするか● Devチーム(自チーム)でEC2インスタンスに切り出して運用していく →プロビジョニング、管理、スケーリングなど運用負荷がチームのリソースを圧迫● Devチーム(自チーム)でECS on fargateに切り出して運用していく● DevチームでAWS Lambdaを運用していく
© 2012-2023 BASE, Inc.#CODT2023案:ライブラリ部分を 別サーバーに切り出す20どうするか● Devチーム(自チーム)でEC2インスタンスに切り出して運用していく →プロビジョニング、管理、スケーリングなど運用負荷がチームのリソースを圧迫● Devチーム(自チーム)でECS on fargateに切り出して運用していく ▲→EC2よりだいぶ管理コストは少ないが、クラスターやタスク定義はちょっと面倒● DevチームでAWS Lambdaを運用していく
© 2012-2023 BASE, Inc.#CODT2023案:ライブラリ部分を 別サーバーに切り出す21どうするか● Devチーム(自チーム)でEC2インスタンスに切り出して運用していく →プロビジョニング、管理、スケーリングなど運用負荷がチームのリソースを圧迫● Devチーム(自チーム)でECS on fargateに切り出して運用していく ▲→EC2よりだいぶ管理コストは少ないが、クラスターやタスク定義はちょっと面倒● DevチームでAWS Lambdaを運用していく ⭕→管理コストは一番少ない→リクエスト数分だけしか金額がかからず、ECS on fargateよりも安く済みそう→AWS Lambda特有の制約も、今回の要件から考えるとクリアしている
選ばれたのはAWS Lambda
© 2012-2023 BASE, Inc.#CODT2023AWS Lambdaとは23実行環境のプロビジョニングや管理をすることなく、アプリケーションコードを実行できるAWSサービスオートスケーリングしてくれる、可用性や耐障害性を考慮したインフラ構成が手に入る(自分でOSを更新したり、使用量の増加に合わせてサーバーのサイズ変更や追加を考えたりする必要がない)様々なAWSのサービスやSaaSアプリケーションから、イベントを設定してトリガーすることができるのでイベント駆動型アプリケーションが実現できる詳しくはAWS公式サイトへ (詳細の説明は割愛します)
© 2012-2023 BASE, Inc.#CODT2023Google商品連携・広告 Appの新しい構成図Google 広告 API(Google 広告以外のGoogleが提供するライブラリを含む)※Batch, Workerなども存在するが割愛ショップオーナーログ収集サーバGoogle 広告以外のGoogle APIwebサーバ(中略)Google 広告APIにリクエストを送るlambda
© 2012-2023 BASE, Inc.#CODT2023Google商品連携・広告 Appの新しい構成図Google 広告 API(Google 広告以外のGoogleが提供するライブラリを含む)※Batch, Workerなども存在するが割愛ショップオーナーログ収集サーバGoogle 広告以外のGoogle APIwebサーバ(中略)Google 広告APIにリクエストを送るlambdaAPI Gatewayは使用せず、AWS Lambda Function URLsを使ってコストを抑える● そこまでリクエスト数が多いわけではない● 実質社内サーバーとなる今回のケースにおいて、API Gatewayで使いたい機能が限られているGithub Actionによるデプロイへ● 元々はChatOpsによるデプロイだった
© 2012-2023 BASE, Inc.#CODT2023Google商品連携・広告 Appの新しい構成図Google 広告 API(Google 広告以外のGoogleが提供するライブラリを含む)※Batch, Workerなども存在するが割愛ショップオーナーログ収集サーバGoogle 広告以外のGoogle APIwebサーバ(中略)Google 広告APIにリクエストを送るlambdaPHP → Pythonに言語を変更● 大前提、公式ライブラリが提供されている言語にしたい● lambdaの最新機能をすぐ使える言語にしたい● 組織の変更によって他のチームが管理することになっても管理できる言語にしたい● 採用戦略に沿う、さらには社内でも知見がある言語
© 2012-2023 BASE, Inc.#CODT2023Google商品連携・広告 Appの新しい構成図Google 広告 API(Google 広告以外のGoogleが提供するライブラリを含む)※Batch, Workerなども存在するが割愛ショップオーナーログ収集サーバGoogle 広告以外のGoogle APIwebサーバ(中略)Google 広告APIにリクエストを送るlambdaLambdaの監視もNew Relicで● アクセスログやアプリケーションログ● リクエスト数や平均実行時間LogをNew Relicで同期するのもLambdaで実施
© 2012-2023 BASE, Inc.#CODT2023新しい構成になってから変わったこと28Quality● アプリケーションエラーだけでなく、リクエスト数や平均実行時間もNew Relicで見るようにCost● デプロイ時間は以前に比べると、1/5に短縮● 別サーバに切り出しつつも、リクエスト数分だけの金額だけで済んでいる● AWS Lambdaに切り出した分の運用負荷も必要最小限にDelivery● 言語のバージョンやライブラリのバージョンアップ作業が自チーム内で完結するように
© 2012-2023 BASE, Inc.#CODT2023最後に29結果だけ見ると、単にAWS Lambdaを取り入れただけのありふれた事例と言えるしかし、1つAWS Lambdaを取り入れるだけでもたくさんの意思決定や環境の変化があった今後、リクエスト数が増えてlambdaのコストが増えてきた時、キャッシュ戦略を取り入れる・非同期にするなどで構成が変わることはありうるビジネスを守るために必要なことであれば、どんどん取り入れて変化していきたい
© 2012-2023 BASE, Inc.#CODT2023最後にバックエンドエンジニアSREフロントエンドエンジニアセキュリティエンジニアQAエンジニアデータエンジニアetc…We are hiring!https://binc.jp/jobs