Slide 1

Slide 1 text

for PHPカンファレンス沖縄 2022 テスト環境のインフラ・運用コストを下げたい話 〜全部入りEC2を超えていけ 2022年8月27日 (土) 株式会社Nextat 中榮健二 Nextat Inc. 1

Slide 2

Slide 2 text

自己紹介 from 京都 - 中榮健二 (なかえけんじ) - twitter: @n_1215  - 株式会社Nextat 取締役 - Webアプリのバックエンドがメインのはず。インフラ専任ではない - ここ最近はGoを使ったりUnityを使ってクライアント側をやったりPHP以 外の仕事も増加 Nextat Inc. 2

Slide 3

Slide 3 text

発表概要 1. 本発表の背景 2. Webアプリケーションサーバから見る選択肢 3. DBサーバから見る選択肢 4. その他 5. まとめ Nextat Inc. 3

Slide 4

Slide 4 text

1. 本発表の背景 Nextat Inc. 4

Slide 5

Slide 5 text

本発表が想定する環境 テスト環境や社内システムの運用環境 個人開発サービスの環境も似たような問題はあるはず VPSやクラウドサービス(IaaS)のVM1台で運用 ある程度の規模のサービスの本番環境に比べて 保守について考えていない インフラコストはかけない 属人性が高い ことが多い 【要出典】 インフラ専任の技術者がチームにいない Nextat Inc. 5

Slide 6

Slide 6 text

例1. 弊社の場合 全部入りEC2 nginx + PHP-FPM + MySQL + Redis 複数サービスが同居している 勤怠管理システム、プロジェクトAのテスト環境 etc. EC2の時限起動・停止によるコスト削減 社内システムの場合は 定期DBバックアップ(cron)-> S3 アクセス元IPアドレス制限やBasic認証 リモートワークの時代だが? Nextat Inc. 6

Slide 7

Slide 7 text

例2. どこかのプロジェクトで見たテスト環境の場合 全部入りEC2 1台 ドメインを当てていないのでIPアドレスでアクセス 非HTTPS 担当者しかデプロイできない Nextat Inc. 7

Slide 8

Slide 8 text

弊社の事情 インフラ専任の開発者はいない Webアプリ開発の片手間にできる人がやる 特定の人に偏りがち 「これのデプロイどうするんだっけ?」 創業初期はWebサイト製作の比率も高かった 共用レンタルサーバ → VPS → IaaSと変遷してきた 本番環境はコンテナを使う比率が高い ただテスト環境や社内システムの場合はEC2で良くない?となりがち 医者の不養生 Nextat Inc. 8

Slide 9

Slide 9 text

人的コストや保守の問題 VM 1台だとインフラコストは安い(1環境あたり数百円/月〜) だがしかし 隠れた人件費を考慮するとそちらのほうが高い 小さい組織にありがちな「役員がやれば実質人件費ゼロ」 テスト環境の保守にかける時間を他の開発に当ててもらいたい 精神的な負担もある 保守の悪循環 EC2の中身がごった煮であまり触りたくない 触りたくないので現状維持され続ける悪循環 Nextat Inc. 9

Slide 10

Slide 10 text

大雑把な目標 社内の人間がインフラの保守に割く時間を減らしたい 複数のシステムの環境が密結合しないようにしたい 属人性を減らしたい インフラの知識があまりなくてもデプロイできる環境にしたい コンテナについてちょっと分かるくらい 触っていて楽しい(重要) ローカル開発用にコンテナを使うのであまり差異がないほうが良い インフラコストもなるべく抑える Nextat Inc. 10

Slide 11

Slide 11 text

Q. 全部入りEC2のままでもある程度改善は可能では? それはそう ドキュメントの作成 コンテナ on VMでミドルウェアのバージョンの密結合を緩和 EC2運用でももちろんデプロイは自動化できる でもこの方向性だと僕のモチベーションがわかない Nextat Inc. 11

Slide 12

Slide 12 text

補足 クラウドプロバイダはAWSやGCPの話が多くなります PHP以外の言語を利用する場合でも大筋は同じですが、一部PHP特有の事情も入 ります 調査段階なので詳しい料金計算までは含みません Nextat Inc. 12

Slide 13

Slide 13 text

2. Webアプリケーションサーバから見る選択肢 Nextat Inc. 13

Slide 14

Slide 14 text

共用レンタルサーバ 今回はコンテナを使いたいのでパス 1つの契約で複数アプリケーション配置も可能なのでインフラコストは安い IaaSより保守コストは安い EC2以外のIaaSやVPS EC2利用と手間はあまり変わらずなのでパス Nextat Inc. 14

Slide 15

Slide 15 text

PaaS アプリケーション開発に集中したいならば本命の一つ 特にデプロイはGitHubなどに連携できることがほとんどなので楽 スタンダードなプランを利用する想定だとDBまで含め、3000〜5000円/月くら いはかかるのではという感じ 人的コストに比べれば安い 円安注意 ホビープラン的なもので済ませられるならもう少し安くなる Nextat Inc. 15

Slide 16

Slide 16 text

PaaSの例1 Heroku https://heroku.com/ Freeプランもあるがスリープあり Hobbyプランで$7/dyno/月、Standardプラン $25/dyno/月 レイテンシ USで動いているのでレイテンシは大きい Heroku Enterpriseなら東京リージョンが使えるがお高い Nextat Inc. 16

Slide 17

Slide 17 text

PaaSの例1 Heroku HerokuのBuildpackはCloud Native Buildpacksに対応しているので、PaaSで はあるがローカルで同じ環境を動かしやすい https://buildpacks.io/ この前のインシデントが気にはなるところ Nextat Inc. 17

Slide 18

Slide 18 text

PaaSの例2 Render https://render.com/ Buildpacksには対応していないがDockerfile対応なのでローカルでの再現は楽 Background Workerあり(キューワーカーに使える) Cron Jobあり(定時バッチに使える) リージョンは今の所シンガポールが日本から近いが、東京対応予定はあるそう シンガポールリージョンでもHeroku程はレイテンシは気にならない Nextat Inc. 18

Slide 19

Slide 19 text

PaaSの例3 Fly.io https://fly.io/ アクセスしたユーザに近いリージョンでサービス(コンテナ)を実行するという 一風変わったPaaS。CDNに近い発想 Buildpacks・Dockerfile対応でローカルでの再現が楽 Nextat Inc. 19

Slide 20

Slide 20 text

PaaSの例4 Google App Engine https://cloud.google.com/appengine 無料枠あり コールドスタートでも速い ローカルでの再現に難あり。SDKで専用のエミュレータを使う GAEスタンダード環境のPHPのバージョンが長らく更新されていなかった。現在 は8.1対応 GAEフレキシブル環境は自由度が高いがCloud Runがあるのでもはや Nextat Inc. 20

Slide 21

Slide 21 text

FaaS AWS Lambda や Google Cloud Functions 無料枠は大きい場合が多い AWS LambdaはPHPの公式対応がない リクエストを処理している時間だけの課金も選べるため、リクエストが少ないサ ービスで非常に安上がり EC2を使う時間だけ起動・停止するよりも高い効果が得られる 普段慣れているアプリケーション開発の構成を変える必要がある FaaS特有の知識が必要になるので必要なインフラ知識はむしろ増える ローカルでの再現に難あり 今回はこれもパス スケーラビリティ重視の場合やインフラコスト削減への強い要望がある場合 はAWS縛りの中のLambdaは強力な選択肢 Nextat Inc. 21

Slide 22

Slide 22 text

クラウドプロバイダのコンテナ系マネージドサービス AWS ECS、App Runner、Cloud Runあたり ローカルでの再現は比較的楽 デプロイパイプラインの一部は自前になるのでPaaSより少し手間 大抵はコンテナイメージをビルドしてコンテナレジストリに保存するくらい 料金について ECS on Fargate: リクエストがなくてもお金はかかる+ロードバランサの 料金 App Runner: リクエストがなくても待機状態。コンテナインスタンス数を 完全に0にはできないが今後に期待 Cloud Run:無料枠あり。コンテナインスタンス数の最小を0にできるので その点はFaaSの特性にも近い Nextat Inc. 22

Slide 23

Slide 23 text

補足) PHPの場合のPaaSやコンテナ系のマネージ ドサービス利用の注意点 1コンテナにWebサーバとPHP-FPM または Apache httpd + mod_phpとなる ことが多い 1コンテナ1プロセスの教えには反するが、Herokuで実績は十分あるので…… Nextat Inc. 23

Slide 24

Slide 24 text

3. DBサーバから見る選択肢 Nextat Inc. 24

Slide 25

Slide 25 text

DBサーバの選択肢 DBサーバのコストは全体に占める割合が比較的高いのでここも重要 PaaSはRDBサーバやRedisも対応していることが多い クラウドプロバイダのコンテナ系のマネージドサービスを使う場合は、同じプロ バイダで済ませるのが一番楽 Nextat Inc. 25

Slide 26

Slide 26 text

非RDBのデータベース 必要な知識が増加するので今回はパスだが一応触れる 価格が安く無料枠もあることが多い アプリケーションの構成を変える必要がある 各サービスにロックイン気味にはなる場合も DynamoDB ローカルでもそれなりにかんたんに再現可 Firestore ローカルでの再現に難あり エミュレータ MongoDB Atlas https://www.mongodb.com/ja-jp/atlas/database MongoDBのマネージドサービス ロックイン度合いは低い Nextat Inc. 26

Slide 27

Slide 27 text

RDBの選択肢 PaaSの無料枠や安いプラン HerokuでPostgreSQL Render $7/month Fly.io $6.88/month Nextat Inc. 27

Slide 28

Slide 28 text

PlanetScale https://planetscale.com/ スケーラビリティが売りだそうなので本発表の要件とは少し合わないか 従量課金 無料のプランもあるが、Scalerプランだと $29/月〜 SQLite コンテナでSQLiteを動かし、LitestreamでS3にバックアップするなどして運用 する方法が一時期話題になっていた https://litestream.io/ 確かにコストは安くなるけど人間が考えることが増えるのでパス Nextat Inc. 28

Slide 29

Slide 29 text

クラウドプロバイダのRDBサービス AWSのRDS https://aws.amazon.com/jp/rds/ GCPのCloud SQL https://cloud.google.com/sql?hl=ja 定期バックアップ機能が大抵ついている フルに動かすと安くとも1000〜2000円/月くらいはかかる EC2のように時限停止させるともう少し減らせるが手間 DBサーバだけ複数サービスで共有するという手がある データベースだけ分ける 共用レンタルサーバと同じ発想 Nextat Inc. 29

Slide 30

Slide 30 text

Amazon Aurora Serverless https://aws.amazon.com/jp/rds/aurora/serverless/ v1はコールドスタートがかなり遅い v2に期待していたがは結構お高い。こちらもApp Runnerと同じく非利用時の料 金が完全に0にはならない スケーラビリティを重視するなら Nextat Inc. 30

Slide 31

Slide 31 text

Redis 地味に高い セッションストア・キャッシュストア用途(シェアードナッシング) AWS: ElastiCache for Redis https://aws.amazon.com/jp/elasticache/redis/ GCP: Memorystore for Redis https://cloud.google.com/memorystore?hl=ja Redis Enterprise Cloud(AWS/GCP/Azure対応) https://redis.com/redis-enterprise-cloud/overview/ セッション情報もRDBに入れてしまう手もある。特にテスト環境 Upstashってどうなの? https://upstash.com/ Nextat Inc. 31

Slide 32

Slide 32 text

4. その他(できればなかったことにしたい部分) Nextat Inc. 32

Slide 33

Slide 33 text

Webアプリ以外のワーカーもコンテナにしたい HTTPリクエストの同期処理だけで済むなら不要ではある コンテナを使う上で結構悩ましい点の一つ PaaSは定時処理、ワーカーのための機能を独自に用意している場合もある Nextat Inc. 33

Slide 34

Slide 34 text

定時処理(cron代替) AWS: ECSタスク GCP: Cloud Run + Cloud SchedulerはHTTPエンドポイントからの実行 若干構成の変更が要る点やセキュリティ面の考慮でマイナス Cloud Run Jobs + Cloud Scheduler まだ試していないが良さそう Nextat Inc. 34

Slide 35

Slide 35 text

非同期処理・キュー AWS ECSでキューワーカー起動 + SQS SQSは無料枠が割と大きい ECSを常時起動させる分で料金がかかってくる GCP Cloud Runでキューワーカー起動 + Pub/Sub Webアプリ用とは異なり、CPUを常に割り当てる設定が必要になる分で料金 がかかる GCP Cloud Tasks 料金的には期待できそう GCPへのロックインにはなるのでローカルでの再現率は落ちる Nextat Inc. 35

Slide 36

Slide 36 text

アクセス元IPアドレス制限 サービスによってはロードバランサやCDNが必要になり、その分のお金はかかる 最悪Webアプリ側で実装してくださいで押し通す手もある リモートワーク時代なので、GCPの Identity-Aware Proxyを使うなどアクセス 元IPアドレス制限以外の方法も選択肢 ゼロトラストセキュリティ Nextat Inc. 36

Slide 37

Slide 37 text

5. まとめ Nextat Inc. 37

Slide 38

Slide 38 text

まとめ インフラにかかるコストは人件費も忘れずに PaaSかコンテナ系マネージドサービスがおすすめ DBサーバはコストが高いが、PaaSの安いプランやDBサーバの共有などの手あり 定時処理や非同期処理も含めるとコストが上がる 個人的にはFly.ioかCloud Runが好み Nextat Inc. 38

Slide 39

Slide 39 text

PR: ITエンジニアを募集しています 株式会社Nextat nextat.co.jp 受託開発 業務システム、ECサイト、スマホアプリ、VR... 本社は京都ですが、東京・名古屋・北海道などフルリモート勤務の実績あり 設計の話に付き合ってくれる方大歓迎! Nextat Inc. 39

Slide 40

Slide 40 text

ご清聴ありがとうございました Nextat Inc. 40