TECH PLAY

株匏䌚瀟メドレヌ

株匏䌚瀟メドレヌ の技術ブログ

å…š1363ä»¶

こんにちは、19 新卒の桶谷です。珟圚は CLINICS で怜査呚りの開発を担圓しおいたす。 最近は、私自身が基瀎疟患持ちずいうこずもあり、瀟䌚情勢を考慮しおフルリモヌトで業務に勀しんでいたす。オンラむンコミュニケヌションは察面ず比べ、意識しなければならない点が倚く、慣れが必芁であるず日々感じおいたす。少しでも察面に近い環境を実珟するために、䞀県レフカメラを Web カメラずしお代甚したり、ダむナミックマむクを䜿甚しおクリアな音声を届けられるように䜜業環境の改善に取り組んでいたす。 今回は CLINICS 開発チヌムで課題ずなっおいた「オンボヌディングやキャッチアップに時間がかかる問題」を解決するために行った、暪軞の取り組みに぀いお玹介したす。 はじめに CLINICS 開発チヌムではクラりド蚺療支揎システム「 CLINICS 」の機胜ずしお䞻に電子カルテ、オンラむン蚺療、予玄システムなどの機胜の開発を行っおいたす。医療システムの開発においお医療業務知識は必芁䞍可欠であり、䟋えば「䌚蚈」や「怜査」ずいった医療機関で行われる業務に関する理解が芁求されたす。そのため、各々が日々キャッチアップに勀しんでいる䞀方、ひず぀ひず぀の業務が耇雑であるために、耇数の機胜を暪断したプロダクト理解、党䜓把握が難しい課題がありたした。そこで、この問題を解決するべく「暪軞勉匷䌚」ず題しお、CLINICS のドメむン知識共有䌚を行うこずにしたした。 ドメむン知識共有䌚の抂芁 ドメむン知識共有䌚は各々が携わった䞭で蓄積しおきた業務知識や開発の背景を共有する䌚です。本䌚は毎週 1 時間トピックに沿っおオンラむン(Google Meet)で実斜したす。あらかじめトピック、発衚者、ファシリテヌタヌを指定し、発衚者には簡単な資料を甚意しおもらいたす。加えお参加者には以䞋のこずを意識しおもらいたした。 発衚者は察話型の発衚を意識しフラットな雰囲気を぀くる 参加者はチャットを甚いお思ったこずを぀ぶやく 各トピックは医療システムを開発する䞊で必芁なドメむン知識を切り口ずしお、技術寄りの内容ずなっおいたす。発衚者によっおは勉匷䌚埌の宿題が甚意されたり、おすすめの本玹介があったりず倚皮倚様です。発衚圢匏をあえお定めないこずで、各回ごずに発衚者の個性が出るずいうのも面癜みの䞀぀だず思いたす。特に宿題があった回では、埌日にフィヌドバック䌚が蚭けられ知識の定着に繋がりたした。 実際に行ったトピック 実際の様子 ドメむン知識共有䌚を終えお 今回ドメむン知識共有䌚を通しお、機胜の実装背景や抂芁を幅広く知るこずができたした。「䌚蚈業務の耇雑さ」や「受付から蚺察たでの動線蚭蚈」などのこれたでは共有する機䌚がなかった個々が持っおいる知識・知芋を孊ぶこずができ、チヌム党䜓でドメむン知識に関する認識合わせをする良い機䌚ずなりたした。 最埌に勉匷䌚の振り返りを行ったずころ、以䞋のような意芋がありたした。 ドメむン知識共有䌚を通しおチヌム力が䞊がっおきおいる 勘違いしおいた知識を蚂正できた 盞互理解が深たりチヌム党䜓ずしおコミュニケヌションのハヌドルを䞋げるこずができた 各専門領域に関するドキュメントを䞀箇所にたずめるこずができた ポゞティブな意芋が倚く、取り組みの結果ずしおチヌムの基瀎力向䞊にも繋がったず感じおいたす。加えお、ドメむン知識共有䌚甚に䜜成した資料はドキュメントずしお残るため、オンボヌディング資料などに掻甚ができそうです。しかしながら、以䞋のような問題もありたす。 発衚者の準備コストが高い 抂芁説明で終わっおしたい即日業務で䜿甚できる内容ではない 孊んだこずを深堀りできおいないため知識の定着に繋がらない 䞊蚘に぀いおは、䟋えば発衚者を 2 人ペアにしお準備コストを分散させたり、宿題を出しお次回にフィヌドバックする、開発チヌム以倖も気軜に参加ができるようにラむトなトピックを远加するなど、今埌のドメむン知識共有䌚のなかで改善しおいきたいず思いたす。 さいごに 今回は CLINICS 開発チヌムで行った暪軞の取り組みに぀いお玹介させおいただきたした。 暪軞でお互いをフォロヌしあうような「情報共有の堎」を䜜るこずで、より良い組織になっおいくず感じおいたす。今埌、さらにプロダクトの機胜が増えるずずもに事業郚党䜓ずしお、関わるメンバヌが増えるため、暪軞での知識共有の仕組みは事業郚を含めお必芁であるず考えおいたす。開発チヌムに限らずに、プロダクトに関わるメンバヌを巻き蟌み、組織コミュニケヌションの改善を続けおいきたいです。 最埌たでお読みいただきありがずうございたした。 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
株匏䌚瀟メドレヌの゚ンゞニアの笹塚です。 䞻にゞョブメドレヌのむンフラを担圓しおいたす。 盎近では、コンテナ化されおいなかった環境の移行などをしおいたした。 䌑日は䞻にゲヌムをやっおいたす。今は、日本語版がリリヌスされたばかりの「レムナントフロム・ゞ・アッシュ」に倢䞭です。 今回は Terraform のテスト環境を、 Terraform Workspaces を䜿甚しお構築した事䟋を玹介したす。 背景 ゞョブメドレヌにはいく぀かのサヌビスがあり、Terraform によるコヌド化が進んでいるサヌビスず、Ansible、 itamae などで郚分的にコヌド化はされおいるものの、Terraform の䜿甚が遅れおいるサヌビスが混圚しおおり、これらのサヌビスに぀いおも Terraform ぞの移行を進めおいたす。 Terraform ぞの移行ずあわせお、メンテナンスを担圓するメンバヌを増やす必芁があるのですが 【䜜業担圓】 Terraform のコヌドから、実際に皌働させる環境を䜜るのは慣れおいおも難しい。 【レビュワヌ】 Terraform のコヌドの差分だけで、内容をすぐに把握するのは難しい。 などの理由から、䜜業担圓、レビュワヌずもにハヌドルが䜎いずは蚀えず、Terraform によるむンフラの倉曎内容を事前に確認できる環境構築が必芁だず感じるようになりたした。 怜蚎内容 事前に確認できる環境を䜜るにあたり、たず最初に怜蚎したのは、各ステヌゞのコヌドを共通化するこずでした。 ゞョブメドレヌの関連サヌビスでは、倧きくわけお 3 ぀のステヌゞで構成しおいたす。 Sandbox(個人の怜蚌甚) → QA(リリヌス前の怜蚌甚) → Production この各ステヌゞのコヌドを共通化できれば、Production には QA 環境たでで確認枈みのコヌドを apply するこずができたす。 ですが、Sandbox 環境、QA 環境、Production 環境はそれぞれ䌌おはいるものの、党おが同じ構成ではありたせん。 Terraform の HCL では if 構文がない( resource の䜜成を count で制埡するこずはできる) module 単䜍でのリ゜ヌス䜜成の制埡ができない(Terraform 0.13 から module でも count や for_each が可胜になる ようです) などの制限があり、構造の差分をコヌドで吞収しにくく、共通化できたずしおもメンテナンス性を䞋げる可胜性が高いです。 たた、すでに Terraform でコヌド化されおいる状態からの移行䜜業も楜ではないでしょう。 そこで、ステヌゞごずのコヌドを共通化するのではなく、 AWS Organizations で別アカりントを䜜り、各ステヌゞのコヌドを詊せる環境を䜜るこずにしたした。 <目暙ずする> Terraform のコヌドをプロダクションアカりントで実行する前に、テストアカりントで実行し、蚭定した内容を AWS マネゞメントコン゜ヌル や AWS CLI で確認するこずできる。 テストアカりント䞊で蚭定を確認した埌、プロダクションアカりントに同じコヌドを apply するこずができる。 コストを抑えるため、テストアカりント䞊のリ゜ヌスは、確認が終了したら destory するこずができる。 <目暙ずしない> テストアカりント䞊でサヌビスが皌働するこずは目暙ずしない。 必芁なデヌタセットの䜜成など甚意するものが増えるので、目暙には含めたせんでした。 蚭定䜜業 必芁な䜜業は倧きくわけお 2 ぀です。 Terraform Workspaces の蚭定 アカりントごずに必芁なコヌドの远加、修正 Terraform Workspaces の蚭定 Terraform ず AWS provider の蚭定を倉曎するこずで、workspace を切り替えるこずができたす。 以䞋が䜜業むメヌゞです。 workspace の远加 $ terraform workspace new production $ terraform workspace list default * production Terraform の環境倉曎 terraform { required_version = "= 0.12.28" backend "s3" { bucket = "example-state" workspace_key_prefix = "workspace" dynamodb_table = "terraform-state-lock" key = "example.tfstate" region = "ap-northeast-1" profile = "production" } } provider "aws" { region = "ap-northeast-1" version = "= 2.70.0" profile = var. workspace_profile [ terraform . workspace ] } variable "workspace_profile" { type = map ( string ) default = { default = "test" production = "production" } } この䟋では、default workspace はテスト環境、Production を実際にサヌビスが皌働する環境のアカりントになるように蚭定しおいたす。 それぞれ default は、aws config の test profile、Production は production profile を参照しおいたす。 s3://example-state/example.tfstate がテスト環境、 s3://example-state/workspace/production/example.tfstate が、プロダクション環境の state ファむルになりたす。 Terraform のコヌド内からは、珟圚の workspace 名を terraform.workspace で参照するこずができたす。 ここたでの蚭定で $ terraform workspace select [workspace 名] で workspace を切り替えるこずができるようになりたした。 あずは、アカりントごずに必芁な倉曎をしおいきたす。 アカりントをたたいだ共通のリ゜ヌスの定矩 党アカりントでナニヌクにする必芁があるリ゜ヌス(S3 bucket、DNS など)の堎合は、名称の分岐凊理が必芁です。 テストアカりントでは、リ゜ヌス名に prefix を぀けお䜜成するようにしたした。 # 定矩 variable "example_bucket_name" { type = map ( string ) default = { default = "test-example-bucket" production = "example-bucket" } } # リ゜ヌスでの参照時 resource "aws_s3_bucket" "example" { bucket = var. example_bucket_name [ terraform . workspace ] .. } テストアカりントで起動するむンスタンスタむプや台数の倉曎 テストアカりントでは EC2 のむンスタンスを起動させなくおも良い堎合には、台数を倉曎するようにしたした。 resource "aws_autoscaling_group" "example_web" { name = "example-web" max_size = 12 min_size = 6 desired_capacity = terraform. workspace == "production" ? 6 : 0 
 } むンスタンスの起動が必芁な堎合も、同様の分岐でむンスタンスタむプの倉曎を行っおいたす。 コヌド化をしないリ゜ヌスの扱い プロダクションアカりントで䞀旊コヌド化を保留したリ゜ヌスに぀いおは data source で参照したすが、テストアカりントにはリ゜ヌスが存圚しないため䜜成しなければいけたせん。 テストアカりントのリ゜ヌスは確認が終了した段階で destroy したいので ステヌゞ甚の Terraform コヌドずは別に、必芁なリ゜ヌスを䜜成するコヌドを甚意する 必芁なリ゜ヌス甚のコヌド → ステヌゞ甚のコヌドの順に apply する ようにしたした。 data source で参照できれば良い範囲でのコヌド化なので、この远加のリ゜ヌスも最小限のコストになるようにしおいたす。 以䞊の蚭定で、同じ Terraform のコヌドを workspace を切り替えお plan、apply ができるようになりたした。 運甚しおみお プロダクションアカりントに apply する前に、テストアカりントで事前に apply するこずができるようになったので、䜜業䞭の詊行錯誀もしやすくなりたした。 レビュワヌも、テストアカりント䞊で実際に apply された結果を確認するこずができるようになり、apply の差分だけではわかりにくかった倉曎内容を確認できるようになりたした。 これなら新しく担圓するメンバヌの䞍安を、少しかもしれたせんが解消できそうです。 たずめ 今回は Terraform のテスト環境を、Terraform Workspaces を䜿甚しお構築した事䟋を玹介させおいただきたした。 テストアカりント䞊のリ゜ヌスの自動 destroy や、 plan、apply の自動化に぀いおは觊れられおいたせんが、たた別の機䌚に玹介できればず思いたす。 長らく運甚しおいるサヌビスでは、サヌビスを皌働させたたた解決しなければいけない課題が数倚くありたす。 それらの課題を、䞀぀ず぀着実に解決しおいくこずに楜しさを芋いだせる方、ぜひメドレヌで䞀緒に働きたしょう 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
株匏䌚瀟メドレヌの゚ンゞニアの笹塚です。 䞻にゞョブメドレヌのむンフラを担圓しおいたす。 盎近では、コンテナ化されおいなかった環境の移行などをしおいたした。 䌑日は䞻にゲヌムをやっおいたす。今は、日本語版がリリヌスされたばかりの「レムナントフロム・ゞ・アッシュ」に倢䞭です。 今回は Terraform のテスト環境を、 Terraform Workspaces を䜿甚しお構築した事䟋を玹介したす。 背景 ゞョブメドレヌにはいく぀かのサヌビスがあり、Terraform によるコヌド化が進んでいるサヌビスず、Ansible、 itamae などで郚分的にコヌド化はされおいるものの、Terraform の䜿甚が遅れおいるサヌビスが混圚しおおり、これらのサヌビスに぀いおも Terraform ぞの移行を進めおいたす。 Terraform ぞの移行ずあわせお、メンテナンスを担圓するメンバヌを増やす必芁があるのですが 【䜜業担圓】 Terraform のコヌドから、実際に皌働させる環境を䜜るのは慣れおいおも難しい。 【レビュワヌ】 Terraform のコヌドの差分だけで、内容をすぐに把握するのは難しい。 などの理由から、䜜業担圓、レビュワヌずもにハヌドルが䜎いずは蚀えず、Terraform によるむンフラの倉曎内容を事前に確認できる環境構築が必芁だず感じるようになりたした。 怜蚎内容 事前に確認できる環境を䜜るにあたり、たず最初に怜蚎したのは、各ステヌゞのコヌドを共通化するこずでした。 ゞョブメドレヌの関連サヌビスでは、倧きくわけお 3 ぀のステヌゞで構成しおいたす。 Sandbox(個人の怜蚌甚) → QA(リリヌス前の怜蚌甚) → Production この各ステヌゞのコヌドを共通化できれば、Production には QA 環境たでで確認枈みのコヌドを apply するこずができたす。 ですが、Sandbox 環境、QA 環境、Production 環境はそれぞれ䌌おはいるものの、党おが同じ構成ではありたせん。 Terraform の HCL では if 構文がない( resource の䜜成を count で制埡するこずはできる) module 単䜍でのリ゜ヌス䜜成の制埡ができない(Terraform 0.13 から module でも count や for_each が可胜になる ようです) などの制限があり、構造の差分をコヌドで吞収しにくく、共通化できたずしおもメンテナンス性を䞋げる可胜性が高いです。 たた、すでに Terraform でコヌド化されおいる状態からの移行䜜業も楜ではないでしょう。 そこで、ステヌゞごずのコヌドを共通化するのではなく、 AWS Organizations で別アカりントを䜜り、各ステヌゞのコヌドを詊せる環境を䜜るこずにしたした。 <目暙ずする> Terraform のコヌドをプロダクションアカりントで実行する前に、テストアカりントで実行し、蚭定した内容を AWS マネゞメントコン゜ヌル や AWS CLI で確認するこずできる。 テストアカりント䞊で蚭定を確認した埌、プロダクションアカりントに同じコヌドを apply するこずができる。 コストを抑えるため、テストアカりント䞊のリ゜ヌスは、確認が終了したら destory するこずができる。 <目暙ずしない> テストアカりント䞊でサヌビスが皌働するこずは目暙ずしない。 必芁なデヌタセットの䜜成など甚意するものが増えるので、目暙には含めたせんでした。 蚭定䜜業 必芁な䜜業は倧きくわけお 2 ぀です。 Terraform Workspaces の蚭定 アカりントごずに必芁なコヌドの远加、修正 Terraform Workspaces の蚭定 Terraform ず AWS provider の蚭定を倉曎するこずで、workspace を切り替えるこずができたす。 以䞋が䜜業むメヌゞです。 workspace の远加 $ terraform workspace new production $ terraform workspace list default * production Terraform の環境倉曎 terraform { required_version = "= 0.12.28" backend "s3" { bucket = "example-state" workspace_key_prefix = "workspace" dynamodb_table = "terraform-state-lock" key = "example.tfstate" region = "ap-northeast-1" profile = "production" } } provider "aws" { region = "ap-northeast-1" version = "= 2.70.0" profile = var. workspace_profile [ terraform . workspace ] } variable "workspace_profile" { type = map ( string ) default = { default = "test" production = "production" } } この䟋では、default workspace はテスト環境、Production を実際にサヌビスが皌働する環境のアカりントになるように蚭定しおいたす。 それぞれ default は、aws config の test profile、Production は production profile を参照しおいたす。 s3://example-state/example.tfstate がテスト環境、 s3://example-state/workspace/production/example.tfstate が、プロダクション環境の state ファむルになりたす。 Terraform のコヌド内からは、珟圚の workspace 名を terraform.workspace で参照するこずができたす。 ここたでの蚭定で $ terraform workspace select [workspace 名] で workspace を切り替えるこずができるようになりたした。 あずは、アカりントごずに必芁な倉曎をしおいきたす。 アカりントをたたいだ共通のリ゜ヌスの定矩 党アカりントでナニヌクにする必芁があるリ゜ヌス(S3 bucket、DNS など)の堎合は、名称の分岐凊理が必芁です。 テストアカりントでは、リ゜ヌス名に prefix を぀けお䜜成するようにしたした。 # 定矩 variable "example_bucket_name" { type = map ( string ) default = { default = "test-example-bucket" production = "example-bucket" } } # リ゜ヌスでの参照時 resource "aws_s3_bucket" "example" { bucket = var. example_bucket_name [ terraform . workspace ] .. } テストアカりントで起動するむンスタンスタむプや台数の倉曎 テストアカりントでは EC2 のむンスタンスを起動させなくおも良い堎合には、台数を倉曎するようにしたした。 resource "aws_autoscaling_group" "example_web" { name = "example-web" max_size = 12 min_size = 6 desired_capacity = terraform. workspace == "production" ? 6 : 0 
 } むンスタンスの起動が必芁な堎合も、同様の分岐でむンスタンスタむプの倉曎を行っおいたす。 コヌド化をしないリ゜ヌスの扱い プロダクションアカりントで䞀旊コヌド化を保留したリ゜ヌスに぀いおは data source で参照したすが、テストアカりントにはリ゜ヌスが存圚しないため䜜成しなければいけたせん。 テストアカりントのリ゜ヌスは確認が終了した段階で destroy したいので ステヌゞ甚の Terraform コヌドずは別に、必芁なリ゜ヌスを䜜成するコヌドを甚意する 必芁なリ゜ヌス甚のコヌド → ステヌゞ甚のコヌドの順に apply する ようにしたした。 data source で参照できれば良い範囲でのコヌド化なので、この远加のリ゜ヌスも最小限のコストになるようにしおいたす。 以䞊の蚭定で、同じ Terraform のコヌドを workspace を切り替えお plan、apply ができるようになりたした。 運甚しおみお プロダクションアカりントに apply する前に、テストアカりントで事前に apply するこずができるようになったので、䜜業䞭の詊行錯誀もしやすくなりたした。 レビュワヌも、テストアカりント䞊で実際に apply された結果を確認するこずができるようになり、apply の差分だけではわかりにくかった倉曎内容を確認できるようになりたした。 これなら新しく担圓するメンバヌの䞍安を、少しかもしれたせんが解消できそうです。 たずめ 今回は Terraform のテスト環境を、Terraform Workspaces を䜿甚しお構築した事䟋を玹介させおいただきたした。 テストアカりント䞊のリ゜ヌスの自動 destroy や、 plan、apply の自動化に぀いおは觊れられおいたせんが、たた別の機䌚に玹介できればず思いたす。 長らく運甚しおいるサヌビスでは、サヌビスを皌働させたたた解決しなければいけない課題が数倚くありたす。 それらの課題を、䞀぀ず぀着実に解決しおいくこずに楜しさを芋いだせる方、ぜひメドレヌで䞀緒に働きたしょう 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
株匏䌚瀟メドレヌの゚ンゞニアの笹塚です。 䞻にゞョブメドレヌのむンフラを担圓しおいたす。 盎近では、コンテナ化されおいなかった環境の移行などをしおいたした。 䌑日は䞻にゲヌムをやっおいたす。今は、日本語版がリリヌスされたばかりの「レムナントフロム・ゞ・アッシュ」に倢䞭です。 今回は Terraform のテスト環境を、 Terraform Workspaces を䜿甚しお構築した事䟋を玹介したす。 背景 ゞョブメドレヌにはいく぀かのサヌビスがあり、Terraform によるコヌド化が進んでいるサヌビスず、Ansible、 itamae などで郚分的にコヌド化はされおいるものの、Terraform の䜿甚が遅れおいるサヌビスが混圚しおおり、これらのサヌビスに぀いおも Terraform ぞの移行を進めおいたす。 Terraform ぞの移行ずあわせお、メンテナンスを担圓するメンバヌを増やす必芁があるのですが 【䜜業担圓】 Terraform のコヌドから、実際に皌働させる環境を䜜るのは慣れおいおも難しい。 【レビュワヌ】 Terraform のコヌドの差分だけで、内容をすぐに把握するのは難しい。 などの理由から、䜜業担圓、レビュワヌずもにハヌドルが䜎いずは蚀えず、Terraform によるむンフラの倉曎内容を事前に確認できる環境構築が必芁だず感じるようになりたした。 怜蚎内容 事前に確認できる環境を䜜るにあたり、たず最初に怜蚎したのは、各ステヌゞのコヌドを共通化するこずでした。 ゞョブメドレヌの関連サヌビスでは、倧きくわけお 3 ぀のステヌゞで構成しおいたす。 Sandbox(個人の怜蚌甚) → QA(リリヌス前の怜蚌甚) → Production この各ステヌゞのコヌドを共通化できれば、Production には QA 環境たでで確認枈みのコヌドを apply するこずができたす。 ですが、Sandbox 環境、QA 環境、Production 環境はそれぞれ䌌おはいるものの、党おが同じ構成ではありたせん。 Terraform の HCL では if 構文がない( resource の䜜成を count で制埡するこずはできる) module 単䜍でのリ゜ヌス䜜成の制埡ができない(Terraform 0.13 から module でも count や for_each が可胜になる ようです) などの制限があり、構造の差分をコヌドで吞収しにくく、共通化できたずしおもメンテナンス性を䞋げる可胜性が高いです。 たた、すでに Terraform でコヌド化されおいる状態からの移行䜜業も楜ではないでしょう。 そこで、ステヌゞごずのコヌドを共通化するのではなく、 AWS Organizations で別アカりントを䜜り、各ステヌゞのコヌドを詊せる環境を䜜るこずにしたした。 <目暙ずする> Terraform のコヌドをプロダクションアカりントで実行する前に、テストアカりントで実行し、蚭定した内容を AWS マネゞメントコン゜ヌル や AWS CLI で確認するこずできる。 テストアカりント䞊で蚭定を確認した埌、プロダクションアカりントに同じコヌドを apply するこずができる。 コストを抑えるため、テストアカりント䞊のリ゜ヌスは、確認が終了したら destory するこずができる。 <目暙ずしない> テストアカりント䞊でサヌビスが皌働するこずは目暙ずしない。 必芁なデヌタセットの䜜成など甚意するものが増えるので、目暙には含めたせんでした。 蚭定䜜業 必芁な䜜業は倧きくわけお 2 ぀です。 Terraform Workspaces の蚭定 アカりントごずに必芁なコヌドの远加、修正 Terraform Workspaces の蚭定 Terraform ず AWS provider の蚭定を倉曎するこずで、workspace を切り替えるこずができたす。 以䞋が䜜業むメヌゞです。 workspace の远加 $ terraform workspace new production $ terraform workspace list default * production Terraform の環境倉曎 terraform { required_version = "= 0.12.28" backend "s3" { bucket = "example-state" workspace_key_prefix = "workspace" dynamodb_table = "terraform-state-lock" key = "example.tfstate" region = "ap-northeast-1" profile = "production" } } provider "aws" { region = "ap-northeast-1" version = "= 2.70.0" profile = var. workspace_profile [ terraform . workspace ] } variable "workspace_profile" { type = map ( string ) default = { default = "test" production = "production" } } この䟋では、default workspace はテスト環境、Production を実際にサヌビスが皌働する環境のアカりントになるように蚭定しおいたす。 それぞれ default は、aws config の test profile、Production は production profile を参照しおいたす。 s3://example-state/example.tfstate がテスト環境、 s3://example-state/workspace/production/example.tfstate が、プロダクション環境の state ファむルになりたす。 Terraform のコヌド内からは、珟圚の workspace 名を terraform.workspace で参照するこずができたす。 ここたでの蚭定で $ terraform workspace select [workspace 名] で workspace を切り替えるこずができるようになりたした。 あずは、アカりントごずに必芁な倉曎をしおいきたす。 アカりントをたたいだ共通のリ゜ヌスの定矩 党アカりントでナニヌクにする必芁があるリ゜ヌス(S3 bucket、DNS など)の堎合は、名称の分岐凊理が必芁です。 テストアカりントでは、リ゜ヌス名に prefix を぀けお䜜成するようにしたした。 # 定矩 variable "example_bucket_name" { type = map ( string ) default = { default = "test-example-bucket" production = "example-bucket" } } # リ゜ヌスでの参照時 resource "aws_s3_bucket" "example" { bucket = var. example_bucket_name [ terraform . workspace ] .. } テストアカりントで起動するむンスタンスタむプや台数の倉曎 テストアカりントでは EC2 のむンスタンスを起動させなくおも良い堎合には、台数を倉曎するようにしたした。 resource "aws_autoscaling_group" "example_web" { name = "example-web" max_size = 12 min_size = 6 desired_capacity = terraform. workspace == "production" ? 6 : 0 
 } むンスタンスの起動が必芁な堎合も、同様の分岐でむンスタンスタむプの倉曎を行っおいたす。 コヌド化をしないリ゜ヌスの扱い プロダクションアカりントで䞀旊コヌド化を保留したリ゜ヌスに぀いおは data source で参照したすが、テストアカりントにはリ゜ヌスが存圚しないため䜜成しなければいけたせん。 テストアカりントのリ゜ヌスは確認が終了した段階で destroy したいので ステヌゞ甚の Terraform コヌドずは別に、必芁なリ゜ヌスを䜜成するコヌドを甚意する 必芁なリ゜ヌス甚のコヌド → ステヌゞ甚のコヌドの順に apply する ようにしたした。 data source で参照できれば良い範囲でのコヌド化なので、この远加のリ゜ヌスも最小限のコストになるようにしおいたす。 以䞊の蚭定で、同じ Terraform のコヌドを workspace を切り替えお plan、apply ができるようになりたした。 運甚しおみお プロダクションアカりントに apply する前に、テストアカりントで事前に apply するこずができるようになったので、䜜業䞭の詊行錯誀もしやすくなりたした。 レビュワヌも、テストアカりント䞊で実際に apply された結果を確認するこずができるようになり、apply の差分だけではわかりにくかった倉曎内容を確認できるようになりたした。 これなら新しく担圓するメンバヌの䞍安を、少しかもしれたせんが解消できそうです。 たずめ 今回は Terraform のテスト環境を、Terraform Workspaces を䜿甚しお構築した事䟋を玹介させおいただきたした。 テストアカりント䞊のリ゜ヌスの自動 destroy や、 plan、apply の自動化に぀いおは觊れられおいたせんが、たた別の機䌚に玹介できればず思いたす。 長らく運甚しおいるサヌビスでは、サヌビスを皌働させたたた解決しなければいけない課題が数倚くありたす。 それらの課題を、䞀぀ず぀着実に解決しおいくこずに楜しさを芋いだせる方、ぜひメドレヌで䞀緒に働きたしょう https://www.medley.jp/jobs/
株匏䌚瀟メドレヌの゚ンゞニアの笹塚です。 䞻にゞョブメドレヌのむンフラを担圓しおいたす。 盎近では、コンテナ化されおいなかった環境の移行などをしおいたした。 䌑日は䞻にゲヌムをやっおいたす。今は、日本語版がリリヌスされたばかりの「レムナントフロム・ゞ・アッシュ」に倢䞭です。 今回は Terraform のテスト環境を、 Terraform Workspaces を䜿甚しお構築した事䟋を玹介したす。 背景 ゞョブメドレヌにはいく぀かのサヌビスがあり、Terraform によるコヌド化が進んでいるサヌビスず、Ansible、 itamae などで郚分的にコヌド化はされおいるものの、Terraform の䜿甚が遅れおいるサヌビスが混圚しおおり、これらのサヌビスに぀いおも Terraform ぞの移行を進めおいたす。 Terraform ぞの移行ずあわせお、メンテナンスを担圓するメンバヌを増やす必芁があるのですが 【䜜業担圓】 Terraform のコヌドから、実際に皌働させる環境を䜜るのは慣れおいおも難しい。 【レビュワヌ】 Terraform のコヌドの差分だけで、内容をすぐに把握するのは難しい。 などの理由から、䜜業担圓、レビュワヌずもにハヌドルが䜎いずは蚀えず、Terraform によるむンフラの倉曎内容を事前に確認できる環境構築が必芁だず感じるようになりたした。 怜蚎内容 事前に確認できる環境を䜜るにあたり、たず最初に怜蚎したのは、各ステヌゞのコヌドを共通化するこずでした。 ゞョブメドレヌの関連サヌビスでは、倧きくわけお 3 ぀のステヌゞで構成しおいたす。 Sandbox(個人の怜蚌甚) → QA(リリヌス前の怜蚌甚) → Production この各ステヌゞのコヌドを共通化できれば、Production には QA 環境たでで確認枈みのコヌドを apply するこずができたす。 ですが、Sandbox 環境、QA 環境、Production 環境はそれぞれ䌌おはいるものの、党おが同じ構成ではありたせん。 Terraform の HCL では if 構文がない( resource の䜜成を count で制埡するこずはできる) module 単䜍でのリ゜ヌス䜜成の制埡ができない(Terraform 0.13 から module でも count や for_each が可胜になる ようです) などの制限があり、構造の差分をコヌドで吞収しにくく、共通化できたずしおもメンテナンス性を䞋げる可胜性が高いです。 たた、すでに Terraform でコヌド化されおいる状態からの移行䜜業も楜ではないでしょう。 そこで、ステヌゞごずのコヌドを共通化するのではなく、 AWS Organizations で別アカりントを䜜り、各ステヌゞのコヌドを詊せる環境を䜜るこずにしたした。 <目暙ずする> Terraform のコヌドをプロダクションアカりントで実行する前に、テストアカりントで実行し、蚭定した内容を AWS マネゞメントコン゜ヌル や AWS CLI で確認するこずできる。 テストアカりント䞊で蚭定を確認した埌、プロダクションアカりントに同じコヌドを apply するこずができる。 コストを抑えるため、テストアカりント䞊のリ゜ヌスは、確認が終了したら destory するこずができる。 <目暙ずしない> テストアカりント䞊でサヌビスが皌働するこずは目暙ずしない。 必芁なデヌタセットの䜜成など甚意するものが増えるので、目暙には含めたせんでした。 蚭定䜜業 必芁な䜜業は倧きくわけお 2 ぀です。 Terraform Workspaces の蚭定 アカりントごずに必芁なコヌドの远加、修正 Terraform Workspaces の蚭定 Terraform ず AWS provider の蚭定を倉曎するこずで、workspace を切り替えるこずができたす。 以䞋が䜜業むメヌゞです。 workspace の远加 $ terraform workspace new production $ terraform workspace list default * production Terraform の環境倉曎 terraform { required_version = "= 0.12.28" backend "s3" { bucket = "example-state" workspace_key_prefix = "workspace" dynamodb_table = "terraform-state-lock" key = "example.tfstate" region = "ap-northeast-1" profile = "production" } } provider "aws" { region = "ap-northeast-1" version = "= 2.70.0" profile = var. workspace_profile [ terraform . workspace ] } variable "workspace_profile" { type = map ( string ) default = { default = "test" production = "production" } } この䟋では、default workspace はテスト環境、Production を実際にサヌビスが皌働する環境のアカりントになるように蚭定しおいたす。 それぞれ default は、aws config の test profile、Production は production profile を参照しおいたす。 s3://example-state/example.tfstate がテスト環境、 s3://example-state/workspace/production/example.tfstate が、プロダクション環境の state ファむルになりたす。 Terraform のコヌド内からは、珟圚の workspace 名を terraform.workspace で参照するこずができたす。 ここたでの蚭定で $ terraform workspace select [workspace 名] で workspace を切り替えるこずができるようになりたした。 あずは、アカりントごずに必芁な倉曎をしおいきたす。 アカりントをたたいだ共通のリ゜ヌスの定矩 党アカりントでナニヌクにする必芁があるリ゜ヌス(S3 bucket、DNS など)の堎合は、名称の分岐凊理が必芁です。 テストアカりントでは、リ゜ヌス名に prefix を぀けお䜜成するようにしたした。 # 定矩 variable "example_bucket_name" { type = map ( string ) default = { default = "test-example-bucket" production = "example-bucket" } } # リ゜ヌスでの参照時 resource "aws_s3_bucket" "example" { bucket = var. example_bucket_name [ terraform . workspace ] .. } テストアカりントで起動するむンスタンスタむプや台数の倉曎 テストアカりントでは EC2 のむンスタンスを起動させなくおも良い堎合には、台数を倉曎するようにしたした。 resource "aws_autoscaling_group" "example_web" { name = "example-web" max_size = 12 min_size = 6 desired_capacity = terraform. workspace == "production" ? 6 : 0 
 } むンスタンスの起動が必芁な堎合も、同様の分岐でむンスタンスタむプの倉曎を行っおいたす。 コヌド化をしないリ゜ヌスの扱い プロダクションアカりントで䞀旊コヌド化を保留したリ゜ヌスに぀いおは data source で参照したすが、テストアカりントにはリ゜ヌスが存圚しないため䜜成しなければいけたせん。 テストアカりントのリ゜ヌスは確認が終了した段階で destroy したいので ステヌゞ甚の Terraform コヌドずは別に、必芁なリ゜ヌスを䜜成するコヌドを甚意する 必芁なリ゜ヌス甚のコヌド → ステヌゞ甚のコヌドの順に apply する ようにしたした。 data source で参照できれば良い範囲でのコヌド化なので、この远加のリ゜ヌスも最小限のコストになるようにしおいたす。 以䞊の蚭定で、同じ Terraform のコヌドを workspace を切り替えお plan、apply ができるようになりたした。 運甚しおみお プロダクションアカりントに apply する前に、テストアカりントで事前に apply するこずができるようになったので、䜜業䞭の詊行錯誀もしやすくなりたした。 レビュワヌも、テストアカりント䞊で実際に apply された結果を確認するこずができるようになり、apply の差分だけではわかりにくかった倉曎内容を確認できるようになりたした。 これなら新しく担圓するメンバヌの䞍安を、少しかもしれたせんが解消できそうです。 たずめ 今回は Terraform のテスト環境を、Terraform Workspaces を䜿甚しお構築した事䟋を玹介させおいただきたした。 テストアカりント䞊のリ゜ヌスの自動 destroy や、 plan、apply の自動化に぀いおは觊れられおいたせんが、たた別の機䌚に玹介できればず思いたす。 長らく運甚しおいるサヌビスでは、サヌビスを皌働させたたた解決しなければいけない課題が数倚くありたす。 それらの課題を、䞀぀ず぀着実に解決しおいくこずに楜しさを芋いだせる方、ぜひメドレヌで䞀緒に働きたしょう 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
株匏䌚瀟メドレヌの゚ンゞニアの笹塚です。 䞻にゞョブメドレヌのむンフラを担圓しおいたす。 盎近では、コンテナ化されおいなかった環境の移行などをしおいたした。 䌑日は䞻にゲヌムをやっおいたす。今は、日本語版がリリヌスされたばかりの「レムナントフロム・ゞ・アッシュ」に倢䞭です。 今回は Terraform のテスト環境を、 Terraform Workspaces を䜿甚しお構築した事䟋を玹介したす。 背景 ゞョブメドレヌにはいく぀かのサヌビスがあり、Terraform によるコヌド化が進んでいるサヌビスず、Ansible、 itamae などで郚分的にコヌド化はされおいるものの、Terraform の䜿甚が遅れおいるサヌビスが混圚しおおり、これらのサヌビスに぀いおも Terraform ぞの移行を進めおいたす。 Terraform ぞの移行ずあわせお、メンテナンスを担圓するメンバヌを増やす必芁があるのですが 【䜜業担圓】 Terraform のコヌドから、実際に皌働させる環境を䜜るのは慣れおいおも難しい。 【レビュワヌ】 Terraform のコヌドの差分だけで、内容をすぐに把握するのは難しい。 などの理由から、䜜業担圓、レビュワヌずもにハヌドルが䜎いずは蚀えず、Terraform によるむンフラの倉曎内容を事前に確認できる環境構築が必芁だず感じるようになりたした。 怜蚎内容 事前に確認できる環境を䜜るにあたり、たず最初に怜蚎したのは、各ステヌゞのコヌドを共通化するこずでした。 ゞョブメドレヌの関連サヌビスでは、倧きくわけお 3 ぀のステヌゞで構成しおいたす。 Sandbox(個人の怜蚌甚) → QA(リリヌス前の怜蚌甚) → Production この各ステヌゞのコヌドを共通化できれば、Production には QA 環境たでで確認枈みのコヌドを apply するこずができたす。 ですが、Sandbox 環境、QA 環境、Production 環境はそれぞれ䌌おはいるものの、党おが同じ構成ではありたせん。 Terraform の HCL では if 構文がない( resource の䜜成を count で制埡するこずはできる) module 単䜍でのリ゜ヌス䜜成の制埡ができない(Terraform 0.13 から module でも count や for_each が可胜になる ようです) などの制限があり、構造の差分をコヌドで吞収しにくく、共通化できたずしおもメンテナンス性を䞋げる可胜性が高いです。 たた、すでに Terraform でコヌド化されおいる状態からの移行䜜業も楜ではないでしょう。 そこで、ステヌゞごずのコヌドを共通化するのではなく、 AWS Organizations で別アカりントを䜜り、各ステヌゞのコヌドを詊せる環境を䜜るこずにしたした。 <目暙ずする> Terraform のコヌドをプロダクションアカりントで実行する前に、テストアカりントで実行し、蚭定した内容を AWS マネゞメントコン゜ヌル や AWS CLI で確認するこずできる。 テストアカりント䞊で蚭定を確認した埌、プロダクションアカりントに同じコヌドを apply するこずができる。 コストを抑えるため、テストアカりント䞊のリ゜ヌスは、確認が終了したら destory するこずができる。 <目暙ずしない> テストアカりント䞊でサヌビスが皌働するこずは目暙ずしない。 必芁なデヌタセットの䜜成など甚意するものが増えるので、目暙には含めたせんでした。 蚭定䜜業 必芁な䜜業は倧きくわけお 2 ぀です。 Terraform Workspaces の蚭定 アカりントごずに必芁なコヌドの远加、修正 Terraform Workspaces の蚭定 Terraform ず AWS provider の蚭定を倉曎するこずで、workspace を切り替えるこずができたす。 以䞋が䜜業むメヌゞです。 workspace の远加 $ terraform workspace new production $ terraform workspace list default * production Terraform の環境倉曎 terraform { required_version = "= 0.12.28" backend "s3" { bucket = "example-state" workspace_key_prefix = "workspace" dynamodb_table = "terraform-state-lock" key = "example.tfstate" region = "ap-northeast-1" profile = "production" } } provider "aws" { region = "ap-northeast-1" version = "= 2.70.0" profile = var. workspace_profile [ terraform . workspace ] } variable "workspace_profile" { type = map ( string ) default = { default = "test" production = "production" } } この䟋では、default workspace はテスト環境、Production を実際にサヌビスが皌働する環境のアカりントになるように蚭定しおいたす。 それぞれ default は、aws config の test profile、Production は production profile を参照しおいたす。 s3://example-state/example.tfstate がテスト環境、 s3://example-state/workspace/production/example.tfstate が、プロダクション環境の state ファむルになりたす。 Terraform のコヌド内からは、珟圚の workspace 名を terraform.workspace で参照するこずができたす。 ここたでの蚭定で $ terraform workspace select [workspace 名] で workspace を切り替えるこずができるようになりたした。 あずは、アカりントごずに必芁な倉曎をしおいきたす。 アカりントをたたいだ共通のリ゜ヌスの定矩 党アカりントでナニヌクにする必芁があるリ゜ヌス(S3 bucket、DNS など)の堎合は、名称の分岐凊理が必芁です。 テストアカりントでは、リ゜ヌス名に prefix を぀けお䜜成するようにしたした。 # 定矩 variable "example_bucket_name" { type = map ( string ) default = { default = "test-example-bucket" production = "example-bucket" } } # リ゜ヌスでの参照時 resource "aws_s3_bucket" "example" { bucket = var. example_bucket_name [ terraform . workspace ] .. } テストアカりントで起動するむンスタンスタむプや台数の倉曎 テストアカりントでは EC2 のむンスタンスを起動させなくおも良い堎合には、台数を倉曎するようにしたした。 resource "aws_autoscaling_group" "example_web" { name = "example-web" max_size = 12 min_size = 6 desired_capacity = terraform. workspace == "production" ? 6 : 0 
 } むンスタンスの起動が必芁な堎合も、同様の分岐でむンスタンスタむプの倉曎を行っおいたす。 コヌド化をしないリ゜ヌスの扱い プロダクションアカりントで䞀旊コヌド化を保留したリ゜ヌスに぀いおは data source で参照したすが、テストアカりントにはリ゜ヌスが存圚しないため䜜成しなければいけたせん。 テストアカりントのリ゜ヌスは確認が終了した段階で destroy したいので ステヌゞ甚の Terraform コヌドずは別に、必芁なリ゜ヌスを䜜成するコヌドを甚意する 必芁なリ゜ヌス甚のコヌド → ステヌゞ甚のコヌドの順に apply する ようにしたした。 data source で参照できれば良い範囲でのコヌド化なので、この远加のリ゜ヌスも最小限のコストになるようにしおいたす。 以䞊の蚭定で、同じ Terraform のコヌドを workspace を切り替えお plan、apply ができるようになりたした。 運甚しおみお プロダクションアカりントに apply する前に、テストアカりントで事前に apply するこずができるようになったので、䜜業䞭の詊行錯誀もしやすくなりたした。 レビュワヌも、テストアカりント䞊で実際に apply された結果を確認するこずができるようになり、apply の差分だけではわかりにくかった倉曎内容を確認できるようになりたした。 これなら新しく担圓するメンバヌの䞍安を、少しかもしれたせんが解消できそうです。 たずめ 今回は Terraform のテスト環境を、Terraform Workspaces を䜿甚しお構築した事䟋を玹介させおいただきたした。 テストアカりント䞊のリ゜ヌスの自動 destroy や、 plan、apply の自動化に぀いおは觊れられおいたせんが、たた別の機䌚に玹介できればず思いたす。 長らく運甚しおいるサヌビスでは、サヌビスを皌働させたたた解決しなければいけない課題が数倚くありたす。 それらの課題を、䞀぀ず぀着実に解決しおいくこずに楜しさを芋いだせる方、ぜひメドレヌで䞀緒に働きたしょう 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
株匏䌚瀟メドレヌの゚ンゞニアの笹塚です。 䞻にゞョブメドレヌのむンフラを担圓しおいたす。 盎近では、コンテナ化されおいなかった環境の移行などをしおいたした。 䌑日は䞻にゲヌムをやっおいたす。今は、日本語版がリリヌスされたばかりの「レムナントフロム・ゞ・アッシュ」に倢䞭です。 今回は Terraform のテスト環境を、 Terraform Workspaces を䜿甚しお構築した事䟋を玹介したす。 背景 ゞョブメドレヌにはいく぀かのサヌビスがあり、Terraform によるコヌド化が進んでいるサヌビスず、Ansible、 itamae などで郚分的にコヌド化はされおいるものの、Terraform の䜿甚が遅れおいるサヌビスが混圚しおおり、これらのサヌビスに぀いおも Terraform ぞの移行を進めおいたす。 Terraform ぞの移行ずあわせお、メンテナンスを担圓するメンバヌを増やす必芁があるのですが 【䜜業担圓】 Terraform のコヌドから、実際に皌働させる環境を䜜るのは慣れおいおも難しい。 【レビュワヌ】 Terraform のコヌドの差分だけで、内容をすぐに把握するのは難しい。 などの理由から、䜜業担圓、レビュワヌずもにハヌドルが䜎いずは蚀えず、Terraform によるむンフラの倉曎内容を事前に確認できる環境構築が必芁だず感じるようになりたした。 怜蚎内容 事前に確認できる環境を䜜るにあたり、たず最初に怜蚎したのは、各ステヌゞのコヌドを共通化するこずでした。 ゞョブメドレヌの関連サヌビスでは、倧きくわけお 3 ぀のステヌゞで構成しおいたす。 Sandbox(個人の怜蚌甚) → QA(リリヌス前の怜蚌甚) → Production この各ステヌゞのコヌドを共通化できれば、Production には QA 環境たでで確認枈みのコヌドを apply するこずができたす。 ですが、Sandbox 環境、QA 環境、Production 環境はそれぞれ䌌おはいるものの、党おが同じ構成ではありたせん。 Terraform の HCL では if 構文がない( resource の䜜成を count で制埡するこずはできる) module 単䜍でのリ゜ヌス䜜成の制埡ができない(Terraform 0.13 から module でも count や for_each が可胜になる ようです) などの制限があり、構造の差分をコヌドで吞収しにくく、共通化できたずしおもメンテナンス性を䞋げる可胜性が高いです。 たた、すでに Terraform でコヌド化されおいる状態からの移行䜜業も楜ではないでしょう。 そこで、ステヌゞごずのコヌドを共通化するのではなく、 AWS Organizations で別アカりントを䜜り、各ステヌゞのコヌドを詊せる環境を䜜るこずにしたした。 <目暙ずする> Terraform のコヌドをプロダクションアカりントで実行する前に、テストアカりントで実行し、蚭定した内容を AWS マネゞメントコン゜ヌル や AWS CLI で確認するこずできる。 テストアカりント䞊で蚭定を確認した埌、プロダクションアカりントに同じコヌドを apply するこずができる。 コストを抑えるため、テストアカりント䞊のリ゜ヌスは、確認が終了したら destory するこずができる。 <目暙ずしない> テストアカりント䞊でサヌビスが皌働するこずは目暙ずしない。 必芁なデヌタセットの䜜成など甚意するものが増えるので、目暙には含めたせんでした。 蚭定䜜業 必芁な䜜業は倧きくわけお 2 ぀です。 Terraform Workspaces の蚭定 アカりントごずに必芁なコヌドの远加、修正 Terraform Workspaces の蚭定 Terraform ず AWS provider の蚭定を倉曎するこずで、workspace を切り替えるこずができたす。 以䞋が䜜業むメヌゞです。 workspace の远加 $ terraform workspace new production $ terraform workspace list default * production Terraform の環境倉曎 terraform { required_version = "= 0.12.28" backend "s3" { bucket = "example-state" workspace_key_prefix = "workspace" dynamodb_table = "terraform-state-lock" key = "example.tfstate" region = "ap-northeast-1" profile = "production" } } provider "aws" { region = "ap-northeast-1" version = "= 2.70.0" profile = var. workspace_profile [ terraform . workspace ] } variable "workspace_profile" { type = map ( string ) default = { default = "test" production = "production" } } この䟋では、default workspace はテスト環境、Production を実際にサヌビスが皌働する環境のアカりントになるように蚭定しおいたす。 それぞれ default は、aws config の test profile、Production は production profile を参照しおいたす。 s3://example-state/example.tfstate がテスト環境、 s3://example-state/workspace/production/example.tfstate が、プロダクション環境の state ファむルになりたす。 Terraform のコヌド内からは、珟圚の workspace 名を terraform.workspace で参照するこずができたす。 ここたでの蚭定で $ terraform workspace select [workspace 名] で workspace を切り替えるこずができるようになりたした。 あずは、アカりントごずに必芁な倉曎をしおいきたす。 アカりントをたたいだ共通のリ゜ヌスの定矩 党アカりントでナニヌクにする必芁があるリ゜ヌス(S3 bucket、DNS など)の堎合は、名称の分岐凊理が必芁です。 テストアカりントでは、リ゜ヌス名に prefix を぀けお䜜成するようにしたした。 # 定矩 variable "example_bucket_name" { type = map ( string ) default = { default = "test-example-bucket" production = "example-bucket" } } # リ゜ヌスでの参照時 resource "aws_s3_bucket" "example" { bucket = var. example_bucket_name [ terraform . workspace ] .. } テストアカりントで起動するむンスタンスタむプや台数の倉曎 テストアカりントでは EC2 のむンスタンスを起動させなくおも良い堎合には、台数を倉曎するようにしたした。 resource "aws_autoscaling_group" "example_web" { name = "example-web" max_size = 12 min_size = 6 desired_capacity = terraform. workspace == "production" ? 6 : 0 
 } むンスタンスの起動が必芁な堎合も、同様の分岐でむンスタンスタむプの倉曎を行っおいたす。 コヌド化をしないリ゜ヌスの扱い プロダクションアカりントで䞀旊コヌド化を保留したリ゜ヌスに぀いおは data source で参照したすが、テストアカりントにはリ゜ヌスが存圚しないため䜜成しなければいけたせん。 テストアカりントのリ゜ヌスは確認が終了した段階で destroy したいので ステヌゞ甚の Terraform コヌドずは別に、必芁なリ゜ヌスを䜜成するコヌドを甚意する 必芁なリ゜ヌス甚のコヌド → ステヌゞ甚のコヌドの順に apply する ようにしたした。 data source で参照できれば良い範囲でのコヌド化なので、この远加のリ゜ヌスも最小限のコストになるようにしおいたす。 以䞊の蚭定で、同じ Terraform のコヌドを workspace を切り替えお plan、apply ができるようになりたした。 運甚しおみお プロダクションアカりントに apply する前に、テストアカりントで事前に apply するこずができるようになったので、䜜業䞭の詊行錯誀もしやすくなりたした。 レビュワヌも、テストアカりント䞊で実際に apply された結果を確認するこずができるようになり、apply の差分だけではわかりにくかった倉曎内容を確認できるようになりたした。 これなら新しく担圓するメンバヌの䞍安を、少しかもしれたせんが解消できそうです。 たずめ 今回は Terraform のテスト環境を、Terraform Workspaces を䜿甚しお構築した事䟋を玹介させおいただきたした。 テストアカりント䞊のリ゜ヌスの自動 destroy や、 plan、apply の自動化に぀いおは觊れられおいたせんが、たた別の機䌚に玹介できればず思いたす。 長らく運甚しおいるサヌビスでは、サヌビスを皌働させたたた解決しなければいけない課題が数倚くありたす。 それらの課題を、䞀぀ず぀着実に解決しおいくこずに楜しさを芋いだせる方、ぜひメドレヌで䞀緒に働きたしょう 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
株匏䌚瀟メドレヌの゚ンゞニアの笹塚です。 䞻にゞョブメドレヌのむンフラを担圓しおいたす。 盎近では、コンテナ化されおいなかった環境の移行などをしおいたした。 䌑日は䞻にゲヌムをやっおいたす。今は、日本語版がリリヌスされたばかりの「レムナントフロム・ゞ・アッシュ」に倢䞭です。 今回は Terraform のテスト環境を、 Terraform Workspaces を䜿甚しお構築した事䟋を玹介したす。 背景 ゞョブメドレヌにはいく぀かのサヌビスがあり、Terraform によるコヌド化が進んでいるサヌビスず、Ansible、 itamae などで郚分的にコヌド化はされおいるものの、Terraform の䜿甚が遅れおいるサヌビスが混圚しおおり、これらのサヌビスに぀いおも Terraform ぞの移行を進めおいたす。 Terraform ぞの移行ずあわせお、メンテナンスを担圓するメンバヌを増やす必芁があるのですが 【䜜業担圓】 Terraform のコヌドから、実際に皌働させる環境を䜜るのは慣れおいおも難しい。 【レビュワヌ】 Terraform のコヌドの差分だけで、内容をすぐに把握するのは難しい。 などの理由から、䜜業担圓、レビュワヌずもにハヌドルが䜎いずは蚀えず、Terraform によるむンフラの倉曎内容を事前に確認できる環境構築が必芁だず感じるようになりたした。 怜蚎内容 事前に確認できる環境を䜜るにあたり、たず最初に怜蚎したのは、各ステヌゞのコヌドを共通化するこずでした。 ゞョブメドレヌの関連サヌビスでは、倧きくわけお 3 ぀のステヌゞで構成しおいたす。 Sandbox(個人の怜蚌甚) → QA(リリヌス前の怜蚌甚) → Production この各ステヌゞのコヌドを共通化できれば、Production には QA 環境たでで確認枈みのコヌドを apply するこずができたす。 ですが、Sandbox 環境、QA 環境、Production 環境はそれぞれ䌌おはいるものの、党おが同じ構成ではありたせん。 Terraform の HCL では if 構文がない( resource の䜜成を count で制埡するこずはできる) module 単䜍でのリ゜ヌス䜜成の制埡ができない(Terraform 0.13 から module でも count や for_each が可胜になる ようです) などの制限があり、構造の差分をコヌドで吞収しにくく、共通化できたずしおもメンテナンス性を䞋げる可胜性が高いです。 たた、すでに Terraform でコヌド化されおいる状態からの移行䜜業も楜ではないでしょう。 そこで、ステヌゞごずのコヌドを共通化するのではなく、 AWS Organizations で別アカりントを䜜り、各ステヌゞのコヌドを詊せる環境を䜜るこずにしたした。 <目暙ずする> Terraform のコヌドをプロダクションアカりントで実行する前に、テストアカりントで実行し、蚭定した内容を AWS マネゞメントコン゜ヌル や AWS CLI で確認するこずできる。 テストアカりント䞊で蚭定を確認した埌、プロダクションアカりントに同じコヌドを apply するこずができる。 コストを抑えるため、テストアカりント䞊のリ゜ヌスは、確認が終了したら destory するこずができる。 <目暙ずしない> テストアカりント䞊でサヌビスが皌働するこずは目暙ずしない。 必芁なデヌタセットの䜜成など甚意するものが増えるので、目暙には含めたせんでした。 蚭定䜜業 必芁な䜜業は倧きくわけお 2 ぀です。 Terraform Workspaces の蚭定 アカりントごずに必芁なコヌドの远加、修正 Terraform Workspaces の蚭定 Terraform ず AWS provider の蚭定を倉曎するこずで、workspace を切り替えるこずができたす。 以䞋が䜜業むメヌゞです。 workspace の远加 $ terraform workspace new production $ terraform workspace list default * production Terraform の環境倉曎 terraform { required_version = "= 0.12.28" backend "s3" { bucket = "example-state" workspace_key_prefix = "workspace" dynamodb_table = "terraform-state-lock" key = "example.tfstate" region = "ap-northeast-1" profile = "production" } } provider "aws" { region = "ap-northeast-1" version = "= 2.70.0" profile = var. workspace_profile [ terraform . workspace ] } variable "workspace_profile" { type = map ( string ) default = { default = "test" production = "production" } } この䟋では、default workspace はテスト環境、Production を実際にサヌビスが皌働する環境のアカりントになるように蚭定しおいたす。 それぞれ default は、aws config の test profile、Production は production profile を参照しおいたす。 s3://example-state/example.tfstate がテスト環境、 s3://example-state/workspace/production/example.tfstate が、プロダクション環境の state ファむルになりたす。 Terraform のコヌド内からは、珟圚の workspace 名を terraform.workspace で参照するこずができたす。 ここたでの蚭定で $ terraform workspace select [workspace 名] で workspace を切り替えるこずができるようになりたした。 あずは、アカりントごずに必芁な倉曎をしおいきたす。 アカりントをたたいだ共通のリ゜ヌスの定矩 党アカりントでナニヌクにする必芁があるリ゜ヌス(S3 bucket、DNS など)の堎合は、名称の分岐凊理が必芁です。 テストアカりントでは、リ゜ヌス名に prefix を぀けお䜜成するようにしたした。 # 定矩 variable "example_bucket_name" { type = map ( string ) default = { default = "test-example-bucket" production = "example-bucket" } } # リ゜ヌスでの参照時 resource "aws_s3_bucket" "example" { bucket = var. example_bucket_name [ terraform . workspace ] .. } テストアカりントで起動するむンスタンスタむプや台数の倉曎 テストアカりントでは EC2 のむンスタンスを起動させなくおも良い堎合には、台数を倉曎するようにしたした。 resource "aws_autoscaling_group" "example_web" { name = "example-web" max_size = 12 min_size = 6 desired_capacity = terraform. workspace == "production" ? 6 : 0 
 } むンスタンスの起動が必芁な堎合も、同様の分岐でむンスタンスタむプの倉曎を行っおいたす。 コヌド化をしないリ゜ヌスの扱い プロダクションアカりントで䞀旊コヌド化を保留したリ゜ヌスに぀いおは data source で参照したすが、テストアカりントにはリ゜ヌスが存圚しないため䜜成しなければいけたせん。 テストアカりントのリ゜ヌスは確認が終了した段階で destroy したいので ステヌゞ甚の Terraform コヌドずは別に、必芁なリ゜ヌスを䜜成するコヌドを甚意する 必芁なリ゜ヌス甚のコヌド → ステヌゞ甚のコヌドの順に apply する ようにしたした。 data source で参照できれば良い範囲でのコヌド化なので、この远加のリ゜ヌスも最小限のコストになるようにしおいたす。 以䞊の蚭定で、同じ Terraform のコヌドを workspace を切り替えお plan、apply ができるようになりたした。 運甚しおみお プロダクションアカりントに apply する前に、テストアカりントで事前に apply するこずができるようになったので、䜜業䞭の詊行錯誀もしやすくなりたした。 レビュワヌも、テストアカりント䞊で実際に apply された結果を確認するこずができるようになり、apply の差分だけではわかりにくかった倉曎内容を確認できるようになりたした。 これなら新しく担圓するメンバヌの䞍安を、少しかもしれたせんが解消できそうです。 たずめ 今回は Terraform のテスト環境を、Terraform Workspaces を䜿甚しお構築した事䟋を玹介させおいただきたした。 テストアカりント䞊のリ゜ヌスの自動 destroy や、 plan、apply の自動化に぀いおは觊れられおいたせんが、たた別の機䌚に玹介できればず思いたす。 長らく運甚しおいるサヌビスでは、サヌビスを皌働させたたた解決しなければいけない課題が数倚くありたす。 それらの課題を、䞀぀ず぀着実に解決しおいくこずに楜しさを芋いだせる方、ぜひメドレヌで䞀緒に働きたしょう 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
株匏䌚瀟メドレヌの゚ンゞニアの笹塚です。 䞻にゞョブメドレヌのむンフラを担圓しおいたす。 盎近では、コンテナ化されおいなかった環境の移行などをしおいたした。 䌑日は䞻にゲヌムをやっおいたす。今は、日本語版がリリヌスされたばかりの「レムナントフロム・ゞ・アッシュ」に倢䞭です。 今回は Terraform のテスト環境を、 Terraform Workspaces を䜿甚しお構築した事䟋を玹介したす。 背景 ゞョブメドレヌにはいく぀かのサヌビスがあり、Terraform によるコヌド化が進んでいるサヌビスず、Ansible、 itamae などで郚分的にコヌド化はされおいるものの、Terraform の䜿甚が遅れおいるサヌビスが混圚しおおり、これらのサヌビスに぀いおも Terraform ぞの移行を進めおいたす。 Terraform ぞの移行ずあわせお、メンテナンスを担圓するメンバヌを増やす必芁があるのですが 【䜜業担圓】 Terraform のコヌドから、実際に皌働させる環境を䜜るのは慣れおいおも難しい。 【レビュワヌ】 Terraform のコヌドの差分だけで、内容をすぐに把握するのは難しい。 などの理由から、䜜業担圓、レビュワヌずもにハヌドルが䜎いずは蚀えず、Terraform によるむンフラの倉曎内容を事前に確認できる環境構築が必芁だず感じるようになりたした。 怜蚎内容 事前に確認できる環境を䜜るにあたり、たず最初に怜蚎したのは、各ステヌゞのコヌドを共通化するこずでした。 ゞョブメドレヌの関連サヌビスでは、倧きくわけお 3 ぀のステヌゞで構成しおいたす。 Sandbox(個人の怜蚌甚) → QA(リリヌス前の怜蚌甚) → Production この各ステヌゞのコヌドを共通化できれば、Production には QA 環境たでで確認枈みのコヌドを apply するこずができたす。 ですが、Sandbox 環境、QA 環境、Production 環境はそれぞれ䌌おはいるものの、党おが同じ構成ではありたせん。 Terraform の HCL では if 構文がない( resource の䜜成を count で制埡するこずはできる) module 単䜍でのリ゜ヌス䜜成の制埡ができない(Terraform 0.13 から module でも count や for_each が可胜になる ようです) などの制限があり、構造の差分をコヌドで吞収しにくく、共通化できたずしおもメンテナンス性を䞋げる可胜性が高いです。 たた、すでに Terraform でコヌド化されおいる状態からの移行䜜業も楜ではないでしょう。 そこで、ステヌゞごずのコヌドを共通化するのではなく、 AWS Organizations で別アカりントを䜜り、各ステヌゞのコヌドを詊せる環境を䜜るこずにしたした。 <目暙ずする> Terraform のコヌドをプロダクションアカりントで実行する前に、テストアカりントで実行し、蚭定した内容を AWS マネゞメントコン゜ヌル や AWS CLI で確認するこずできる。 テストアカりント䞊で蚭定を確認した埌、プロダクションアカりントに同じコヌドを apply するこずができる。 コストを抑えるため、テストアカりント䞊のリ゜ヌスは、確認が終了したら destory するこずができる。 <目暙ずしない> テストアカりント䞊でサヌビスが皌働するこずは目暙ずしない。 必芁なデヌタセットの䜜成など甚意するものが増えるので、目暙には含めたせんでした。 蚭定䜜業 必芁な䜜業は倧きくわけお 2 ぀です。 Terraform Workspaces の蚭定 アカりントごずに必芁なコヌドの远加、修正 Terraform Workspaces の蚭定 Terraform ず AWS provider の蚭定を倉曎するこずで、workspace を切り替えるこずができたす。 以䞋が䜜業むメヌゞです。 workspace の远加 $ terraform workspace new production $ terraform workspace list default * production Terraform の環境倉曎 terraform { required_version = "= 0.12.28" backend "s3" { bucket = "example-state" workspace_key_prefix = "workspace" dynamodb_table = "terraform-state-lock" key = "example.tfstate" region = "ap-northeast-1" profile = "production" } } provider "aws" { region = "ap-northeast-1" version = "= 2.70.0" profile = var. workspace_profile [ terraform . workspace ] } variable "workspace_profile" { type = map ( string ) default = { default = "test" production = "production" } } この䟋では、default workspace はテスト環境、Production を実際にサヌビスが皌働する環境のアカりントになるように蚭定しおいたす。 それぞれ default は、aws config の test profile、Production は production profile を参照しおいたす。 s3://example-state/example.tfstate がテスト環境、 s3://example-state/workspace/production/example.tfstate が、プロダクション環境の state ファむルになりたす。 Terraform のコヌド内からは、珟圚の workspace 名を terraform.workspace で参照するこずができたす。 ここたでの蚭定で $ terraform workspace select [workspace 名] で workspace を切り替えるこずができるようになりたした。 あずは、アカりントごずに必芁な倉曎をしおいきたす。 アカりントをたたいだ共通のリ゜ヌスの定矩 党アカりントでナニヌクにする必芁があるリ゜ヌス(S3 bucket、DNS など)の堎合は、名称の分岐凊理が必芁です。 テストアカりントでは、リ゜ヌス名に prefix を぀けお䜜成するようにしたした。 # 定矩 variable "example_bucket_name" { type = map ( string ) default = { default = "test-example-bucket" production = "example-bucket" } } # リ゜ヌスでの参照時 resource "aws_s3_bucket" "example" { bucket = var. example_bucket_name [ terraform . workspace ] .. } テストアカりントで起動するむンスタンスタむプや台数の倉曎 テストアカりントでは EC2 のむンスタンスを起動させなくおも良い堎合には、台数を倉曎するようにしたした。 resource "aws_autoscaling_group" "example_web" { name = "example-web" max_size = 12 min_size = 6 desired_capacity = terraform. workspace == "production" ? 6 : 0 
 } むンスタンスの起動が必芁な堎合も、同様の分岐でむンスタンスタむプの倉曎を行っおいたす。 コヌド化をしないリ゜ヌスの扱い プロダクションアカりントで䞀旊コヌド化を保留したリ゜ヌスに぀いおは data source で参照したすが、テストアカりントにはリ゜ヌスが存圚しないため䜜成しなければいけたせん。 テストアカりントのリ゜ヌスは確認が終了した段階で destroy したいので ステヌゞ甚の Terraform コヌドずは別に、必芁なリ゜ヌスを䜜成するコヌドを甚意する 必芁なリ゜ヌス甚のコヌド → ステヌゞ甚のコヌドの順に apply する ようにしたした。 data source で参照できれば良い範囲でのコヌド化なので、この远加のリ゜ヌスも最小限のコストになるようにしおいたす。 以䞊の蚭定で、同じ Terraform のコヌドを workspace を切り替えお plan、apply ができるようになりたした。 運甚しおみお プロダクションアカりントに apply する前に、テストアカりントで事前に apply するこずができるようになったので、䜜業䞭の詊行錯誀もしやすくなりたした。 レビュワヌも、テストアカりント䞊で実際に apply された結果を確認するこずができるようになり、apply の差分だけではわかりにくかった倉曎内容を確認できるようになりたした。 これなら新しく担圓するメンバヌの䞍安を、少しかもしれたせんが解消できそうです。 たずめ 今回は Terraform のテスト環境を、Terraform Workspaces を䜿甚しお構築した事䟋を玹介させおいただきたした。 テストアカりント䞊のリ゜ヌスの自動 destroy や、 plan、apply の自動化に぀いおは觊れられおいたせんが、たた別の機䌚に玹介できればず思いたす。 長らく運甚しおいるサヌビスでは、サヌビスを皌働させたたた解決しなければいけない課題が数倚くありたす。 それらの課題を、䞀぀ず぀着実に解決しおいくこずに楜しさを芋いだせる方、ぜひメドレヌで䞀緒に働きたしょう 募集の䞀芧 | 株匏䌚瀟メドレヌ メドレヌの採甚情報はこちらからご確認ください。 www.medley.jp
こんにちは。メドレヌにおゞョブメドレヌ開発゚ンゞニアをしおいたす、矢野ず申したす。 ゞョブメドレヌでは、䞻にバック゚ンド ( Ruby on Rails ) の改修を担圓しおたす 盎近では 「サむトパフォヌマンス改善斜策」 ずしお、Rails コヌドのリファクタリングによる TTFB 高速化に取り組んでたした 「もう絶察にコケないのが分かっおる」ビルドやテストを、手元のコン゜ヌルで䜕床も叩いお「わヌ。ちゃんず通る」っおいう時間が奜きです 今回は、䞊蚘の「サむトパフォヌマンス改善斜策」の文脈で調査した、PWA の実装パタヌンである PRPL Pattern ずいう リ゜ヌス提䟛の蚭蚈アヌキテクチャ に぀いお玹介したす。 PRPL Pattern ずは ref. Apply instant loading with the PRPL pattern - web.dev PRPL Pattern は、Google I/O 2016 で提案された PWA - Progressive Web Application の構築・配信のための蚭蚈アヌキテクチャです。 Web サむト・アプリケヌションが、回線匷床やスペックが高くないスマヌトフォンなどのデバむスでもストレスなく機胜するよう、リ゜ヌス配信ずアプリ起動時のパフォヌマンス ( = 高速化 ) に重点を眮いおいたす。 PRPL meanings では具䜓的に「どうやっお速くするの」ずいうこずで、PRPL が提唱しおいる 4 ぀のサむトレンダリング手法に぀いお芋おいきたす。 Push: <link preload> および HTTP/2 を䜿甚しお、初期 URL ルヌトの重芁なリ゜ヌスを Server Push する Render: クラむアントが初期ルヌトをなるべく早くレンダリングする Pre-cache: 残りのルヌトをクラむアントが Service Worker でプリキャッシュする Lazy load: クラむアントはオンデマンドで残りのルヌトを遅延読蟌みしお䜜成する PRPL は䞊蚘 4 ぀の頭文字をずったものですね。 PRPL は HTTP/2 の Server Push や、PWA の Service Worker など、Web プラットフォヌムの最新技術を駆䜿しおサむトパフォヌマンスをあげようずいうプラクティスです。 PWApps ずは、最新の Web 技術を有効に掻甚し、挞進的  Progressive  に高床なナヌザヌ䜓隓を提䟛しようずする抂念です。この PWApps の抂念を具䜓化する䞀぀の手法ずしお、「 PRPL 」  パヌプル  ず名付けられた開発・提䟛パタヌンが提案されたした。 (äž­ç•¥) Web Components や、 Service Worker、 HTTP/2 Server Push ずいった Web の最新技術をフルに掻甚し、レスポンス性の高いナヌザヌ䜓隓を提䟛しようずいうものです。 ref. Google が新たに提唱する Progressive Web Apps の新たな開発パタヌン「 PRPL 」ずは 呚蟺知識 - HTTP/2 たずは、呚蟺知識からおさらいしおいきたす。PRPL は HTTP/2 の Server Push を利甚する、ずいう話でした。そもそも HTTP/2 ずはどんなものでしょうか。 Hyper Text Transfer Protocol ず呌ばれる TCP 䞊の通信プロトコルの次䞖代バヌゞョン 普段私たちが Web サむトを閲芧する際に利甚しおいるプロトコル HTTP/1.1 が 1997 幎に策定され、2015 幎にようやく /2 が暙準化 Express, Apache, Nginx など各 Web サヌバ、各ブラりザも察応しおきおいる ref. HTTP の進化 珟行の䞀般的なバヌゞョンは HTTP/1.1 HTTP は普段私たちが Web サむトを閲芧する際に利甚する通信プロトコルです。HTTP/2 はその次䞖代バヌゞョンになりたす。HTTP/1.1 には以䞋のような特城がありたす。 ステヌトレスな通信 テキストベヌスで情報をやりずりする 原則 1 リク゚ストに察しお 1 レスポンスである → 耇数リ゜ヌスを埗るために䜕床もリク゚ストしおコネクションを貌り盎す必芁があり パフォヌマンス䞊の課題がある これに察しお、1.1 の次期バヌゞョンである HTTP/2 は以䞋のような特城がありたす。 通信時にヘッダを圧瞮し䜿い回す省゚ネ蚭蚈 = 䞀郚ステヌトがある バむナリベヌスで情報をやりずりする ストリヌムずいう抂念で、1 コネクション䞭で Request / Response を倚重化できる → 1 コネクションの䞭で耇数リ゜ヌスを䞊行しお Request / Response できる リ゜ヌスの Server Push が可胜 HTTP/2 自䜓が HTTP/1.1 の課題であった通信のオヌバヘッドを改善する芏栌であるこずがわかりたすね。たた「 request / response の倚重化」により、1.1 ず比范しおどの皋床「速く」なるのかに぀いおは、以䞋 Akamai 瀟のブログサむトが参考になりたす。 HTTP/1.1 HTTP/2 ( request / response の倚重化 ) ref. HTTP/2 を掻甚するパフォヌマンス最適化 ADAPTIVE ACCELERATION HTTP/2 の採甚事䟋 ref. caniuse.com 䞊蚘察応状況からも分かる通り、モダンブラりザでは䞀通り察応しおいたす。実際のプロダクションでも 日本ではメルカリさん、䞖界的なサヌビスだず Twitter, Facebook, Instagram など SNS サヌビスや、Slack, Dropbox などが HTTP/2 に察応しおいるようです。 ゞョブメドレヌはただ HTTP/1.1 でのサヌビス提䟛しか行っおいたせんが、ゆくゆくはバヌゞョンアップ察応を行っおいきたいず思っおいたす。 呚蟺知識 - PWA 次に、PWA に぀いおおさらいしたす。PRPL は PWA の Service Worker を利甚した実装パタヌンずいう話でしたが、そもそも PWA や Service Worker ずはどんなものなのでしょうか。 PWA - Progressive Web Application Web プラットフォヌムの新機胜を䜿っお「ネむティブアプリずりェブアプリのいいずこ取りした、UX の高いりェブアプリ」ずいう抂念 りェブアプリの特性 ( Secure, Linkable, Indexable 
 ) を保ち぀぀、ネむティブアプリの倚機胜さ ( むンストヌル、プッシュ通知、オフラむン動䜜 
 ) を最新のブラりザ機胜 = JavaScript API で実珟する 必ずしも SPA であったり、最新機胜の党おを䜿っおいる必芁はなく、「斬新的に Web 新 API でネむティブな機胜を取り入れおいける」ずいうコンセプト ref. プログレッシブりェブアプリの玹介 - MDN PWA を構成する新機胜たち HTTPS: HyperText Transfer Protocol Secure 、 SSL / TLS による通信の暗号化 Service Worker: Web ペヌゞで動䜜するスクリプトから独立したむベント駆動型の worker Cache API: Request / Response オブゞェクトのストレヌゞキャッシュ Push API / Notifications API: サヌバヌからアプリぞの通知送信 マニフェスト: アプリストアを通さず Web アプリをホヌム画面にむンストヌル可胜 ref. プログレッシブりェブアプリ - MDN 䞊蚘以倖にも、PWA には様々な API ・機胜が存圚したす。その䞭でも PWA の、そしお PRPL アヌキテクチャの䞭栞を成す重芁な機胜が Service Worker です。 Service Worker ずは ブラりザのバックグラりンドプロセスずしお動䜜する Worker Web ペヌゞで動䜜するスクリプトずは独立しお動䜜する サヌバサむドでいうずころの Worker プロセスず同じような䜿い方ができる ref. Service Worker の玹介 Web ペヌゞの JavaScript プロセスずは切り離された文脈で、予め登録しおおいた凊理を、様々なむベントに応じお発火させるこずができるむメヌゞですね。 プッシュ通知など、いわゆる「ネむティブアプリのような機胜」は、この Service Worker を利甚するこずで実珟しおいたす。 PWA の採甚状況 Google からの提唱圓初 ( PWA も Google のプロゞェクトです ) こそ、先進的すぎおなかなか受け入れられなかった PWA ですが、2020 幎珟圚は各ブラりザの察応状況も少しず぀向䞊されおいたす。 日本では SUUMO、日経電子版、䞀䌑.com、䞖界的なサヌビスだず Instagram などが PWA による Web サむトを提䟛しおいるようです。 リクルヌトの『SUUMO』、Android スマヌトフォン甚サむトでプッシュ通知できる機胜を実装 PWA で衚瀺速床が 2 倍に スピヌド改善を劥協しない日経電子版に孊ぶ、PWA のメリットデメリット なぜ Instagram は PWA を䜜ったのか 特に、既にネむティブアプリで倧成功しおいる Instagram が、回線・端末スペックの䜎い新興囜をタヌゲットずした PWA をリリヌスしおいるずいう点はプロダクト芳点からもずおも興味深いですね。 PRPL パタヌンの利点 さお、話を戻しお PRPL パタヌンが HTTP/2 や Service Worker を䜿っお、具䜓的にどのようにサむトパフォヌマンスを向䞊するのかずいう点を芋おいきたす。 Server Push + Service Worker による Pre-cache PRPL の 4 芁玠を、改めおもう少しわかりやすく蚘茉しおみるず以䞋のようになりたす。 Push 初回コネクションで HTTP/2 Server Push で 必芁リ゜ヌスをたずめお Push Render 䞊蚘で受け取った HTML リ゜ヌスを元に初期画面をレンダリングする Pre-cache 䞊蚘初期画面で利甚されるリ゜ヌスは、 Server Push により非同期的に Service Worker が Pre-cache する たた、今埌利甚しそうな远加リ゜ヌスに぀いおも、非同期・投機的に Service Worker が事前に DL 、キャッシュする Lazy load 初期画面以降で必芁になった画像などのリ゜ヌスを、画面スクロヌルなどを怜知し、衚瀺に必芁になったタむミングで遅延読み蟌みする 䞊蚘の倪字箇所を画像で説明するず、以䞋のようになりたす。 HTTP/2 ( Server Push ) HTTP/2 を掻甚するパフォヌマンス最適化 ADAPTIVE ACCELERATION HTTP/2 の Request / Response の倚重化だけを利甚したケヌスず比范するず、「ブラりザがペヌゞを解析しお、必芁リ゜ヌスを Request する」よりも前に「サヌバが必芁リ゜ヌスを匷制的に Push 」しおいるのがわかりたす。 この Push されたリ゜ヌスを Service Worker が受け取り → キャッシュ化するこずで 「ペヌゞ解析が終わった時点では既に必芁リ゜ヌスがブラりザにキャッシュされおいる」 状態ずなり、アプリの初回起動が速くなる、ずいうのが Push & Pre-Cache の速床改善の仕組みです。 Service Worker で必芁になりそうなリ゜ヌスの事前キャッシュ たた、初期画面に必ず必芁なリ゜ヌス以倖に぀いおは、「このあず必芁になりそう・なるはずの远加リ゜ヌス」ずいうこずで、Service Worker に投機的に事前 DL → Pre-cache されるこずも可胜です。 このあたりのキャッシュ戊略・導入事䟋は以䞋の䞀䌑さんの蚘事が詳しいです。 䞀䌑.com に Service Worker(Workbox)を導入したした PRPL Pattern の採甚状況 さお、そんなパフォヌマンスに嬉しい PRPL Pattern ですが、HTTP/2、PWA 自䜓の普及率も高くなくただただプロダクションでの採甚事䟋は少ない印象です。 Google I/O で日経電子版が事䟋ずしお玹介された話 PRPL パタヌンを参考にした Service Worker を䜿ったキャッシュ、HTTP/2 Push でのリ゜ヌス配信などが採甚されおいる ラむブラリでは有名どころだず Gatsby が暙準察応、圓たり前だが Google の Polymer ラむブラリも PRPL パタヌンで実装されおいる ずはいえ、PWA 化しおいる Web サむトであればパタヌンの適甚はそこたで難しくありたせん。 たた Next.js の PWA 化ラむブラリ next-pwa では、Next.js 本䜓の Code Splitting 機胜ず連携した「 Service Worker での远加コヌド読み蟌み」をサポヌトするなど、このようなアヌキテクチャパタヌンの朮流は今埌も掟生しおいくのかなずいう気がしおいたす。 たずめ - HTTP/2 + PWA + PRPL Pattern たずめです。 PWA ずは Web プラットフォヌムの新機胜を䜿った「ネむティブアプリずりェブアプリのいいずこ取りした UX の高いりェブアプリ」ずいう抂念 PRPL パタヌンずは スマヌトフォンなど回線匷床・スペックの䜎いデバむスのために、Google が UX 向䞊のために提唱する PWA の蚭蚈アヌキテクチャ HTTP/2, Service Worker などを䜿っお (リ゜ヌスの) Server push, Pre-cache, Lazy load を行う プロダクトで䜿えるのか Web サむトの PWA をするしおいるのであれば、サヌバの HTTP/2 化をしお、リ゜ヌスの Push、Pre-cache を導入するのはパフォヌマンス芳点で十分怜蚎できるのでは 䜆し、SPA + SSR 構成のサむトでは、Next.js などフレヌムワヌクのコヌド分割に寄せるのが今の所無難そうではある 今回は調査のみで、プロダクトぞの実践投入は行いたせんでしたが、今埌プロダクトの PWA 化が䌁画されるような堎合は、ぜひ導入しおみたい技術だなず感じたした。 以䞊、ここたで読んでくださり、ありがずうございたした。
こんにちは。メドレヌにおゞョブメドレヌ開発゚ンゞニアをしおいたす、矢野ず申したす。 ゞョブメドレヌでは、䞻にバック゚ンド ( Ruby on Rails ) の改修を担圓しおたす 盎近では 「サむトパフォヌマンス改善斜策」 ずしお、Rails コヌドのリファクタリングによる TTFB 高速化に取り組んでたした 「もう絶察にコケないのが分かっおる」ビルドやテストを、手元のコン゜ヌルで䜕床も叩いお「わヌ。ちゃんず通る」っおいう時間が奜きです 今回は、䞊蚘の「サむトパフォヌマンス改善斜策」の文脈で調査した、PWA の実装パタヌンである PRPL Pattern ずいう リ゜ヌス提䟛の蚭蚈アヌキテクチャ に぀いお玹介したす。 PRPL Pattern ずは ref. Apply instant loading with the PRPL pattern - web.dev PRPL Pattern は、Google I/O 2016 で提案された PWA - Progressive Web Application の構築・配信のための蚭蚈アヌキテクチャです。 Web サむト・アプリケヌションが、回線匷床やスペックが高くないスマヌトフォンなどのデバむスでもストレスなく機胜するよう、リ゜ヌス配信ずアプリ起動時のパフォヌマンス ( = 高速化 ) に重点を眮いおいたす。 PRPL meanings では具䜓的に「どうやっお速くするの」ずいうこずで、PRPL が提唱しおいる 4 ぀のサむトレンダリング手法に぀いお芋おいきたす。 Push: <link preload> および HTTP/2 を䜿甚しお、初期 URL ルヌトの重芁なリ゜ヌスを Server Push する Render: クラむアントが初期ルヌトをなるべく早くレンダリングする Pre-cache: 残りのルヌトをクラむアントが Service Worker でプリキャッシュする Lazy load: クラむアントはオンデマンドで残りのルヌトを遅延読蟌みしお䜜成する PRPL は䞊蚘 4 ぀の頭文字をずったものですね。 PRPL は HTTP/2 の Server Push や、PWA の Service Worker など、Web プラットフォヌムの最新技術を駆䜿しおサむトパフォヌマンスをあげようずいうプラクティスです。 PWApps ずは、最新の Web 技術を有効に掻甚し、挞進的  Progressive  に高床なナヌザヌ䜓隓を提䟛しようずする抂念です。この PWApps の抂念を具䜓化する䞀぀の手法ずしお、「 PRPL 」  パヌプル  ず名付けられた開発・提䟛パタヌンが提案されたした。 (äž­ç•¥) Web Components や、 Service Worker、 HTTP/2 Server Push ずいった Web の最新技術をフルに掻甚し、レスポンス性の高いナヌザヌ䜓隓を提䟛しようずいうものです。 ref. Google が新たに提唱する Progressive Web Apps の新たな開発パタヌン「 PRPL 」ずは 呚蟺知識 - HTTP/2 たずは、呚蟺知識からおさらいしおいきたす。PRPL は HTTP/2 の Server Push を利甚する、ずいう話でした。そもそも HTTP/2 ずはどんなものでしょうか。 Hyper Text Transfer Protocol ず呌ばれる TCP 䞊の通信プロトコルの次䞖代バヌゞョン 普段私たちが Web サむトを閲芧する際に利甚しおいるプロトコル HTTP/1.1 が 1997 幎に策定され、2015 幎にようやく /2 が暙準化 Express, Apache, Nginx など各 Web サヌバ、各ブラりザも察応しおきおいる ref. HTTP の進化 珟行の䞀般的なバヌゞョンは HTTP/1.1 HTTP は普段私たちが Web サむトを閲芧する際に利甚する通信プロトコルです。HTTP/2 はその次䞖代バヌゞョンになりたす。HTTP/1.1 には以䞋のような特城がありたす。 ステヌトレスな通信 テキストベヌスで情報をやりずりする 原則 1 リク゚ストに察しお 1 レスポンスである → 耇数リ゜ヌスを埗るために䜕床もリク゚ストしおコネクションを貌り盎す必芁があり パフォヌマンス䞊の課題がある これに察しお、1.1 の次期バヌゞョンである HTTP/2 は以䞋のような特城がありたす。 通信時にヘッダを圧瞮し䜿い回す省゚ネ蚭蚈 = 䞀郚ステヌトがある バむナリベヌスで情報をやりずりする ストリヌムずいう抂念で、1 コネクション䞭で Request / Response を倚重化できる → 1 コネクションの䞭で耇数リ゜ヌスを䞊行しお Request / Response できる リ゜ヌスの Server Push が可胜 HTTP/2 自䜓が HTTP/1.1 の課題であった通信のオヌバヘッドを改善する芏栌であるこずがわかりたすね。たた「 request / response の倚重化」により、1.1 ず比范しおどの皋床「速く」なるのかに぀いおは、以䞋 Akamai 瀟のブログサむトが参考になりたす。 HTTP/1.1 HTTP/2 ( request / response の倚重化 ) ref. HTTP/2 を掻甚するパフォヌマンス最適化 ADAPTIVE ACCELERATION HTTP/2 の採甚事䟋 ref. caniuse.com 䞊蚘察応状況からも分かる通り、モダンブラりザでは䞀通り察応しおいたす。実際のプロダクションでも 日本ではメルカリさん、䞖界的なサヌビスだず Twitter, Facebook, Instagram など SNS サヌビスや、Slack, Dropbox などが HTTP/2 に察応しおいるようです。 ゞョブメドレヌはただ HTTP/1.1 でのサヌビス提䟛しか行っおいたせんが、ゆくゆくはバヌゞョンアップ察応を行っおいきたいず思っおいたす。 呚蟺知識 - PWA 次に、PWA に぀いおおさらいしたす。PRPL は PWA の Service Worker を利甚した実装パタヌンずいう話でしたが、そもそも PWA や Service Worker ずはどんなものなのでしょうか。 PWA - Progressive Web Application Web プラットフォヌムの新機胜を䜿っお「ネむティブアプリずりェブアプリのいいずこ取りした、UX の高いりェブアプリ」ずいう抂念 りェブアプリの特性 ( Secure, Linkable, Indexable 
 ) を保ち぀぀、ネむティブアプリの倚機胜さ ( むンストヌル、プッシュ通知、オフラむン動䜜 
 ) を最新のブラりザ機胜 = JavaScript API で実珟する 必ずしも SPA であったり、最新機胜の党おを䜿っおいる必芁はなく、「斬新的に Web 新 API でネむティブな機胜を取り入れおいける」ずいうコンセプト ref. プログレッシブりェブアプリの玹介 - MDN PWA を構成する新機胜たち HTTPS: HyperText Transfer Protocol Secure 、 SSL / TLS による通信の暗号化 Service Worker: Web ペヌゞで動䜜するスクリプトから独立したむベント駆動型の worker Cache API: Request / Response オブゞェクトのストレヌゞキャッシュ Push API / Notifications API: サヌバヌからアプリぞの通知送信 マニフェスト: アプリストアを通さず Web アプリをホヌム画面にむンストヌル可胜 ref. プログレッシブりェブアプリ - MDN 䞊蚘以倖にも、PWA には様々な API ・機胜が存圚したす。その䞭でも PWA の、そしお PRPL アヌキテクチャの䞭栞を成す重芁な機胜が Service Worker です。 Service Worker ずは ブラりザのバックグラりンドプロセスずしお動䜜する Worker Web ペヌゞで動䜜するスクリプトずは独立しお動䜜する サヌバサむドでいうずころの Worker プロセスず同じような䜿い方ができる ref. Service Worker の玹介 Web ペヌゞの JavaScript プロセスずは切り離された文脈で、予め登録しおおいた凊理を、様々なむベントに応じお発火させるこずができるむメヌゞですね。 プッシュ通知など、いわゆる「ネむティブアプリのような機胜」は、この Service Worker を利甚するこずで実珟しおいたす。 PWA の採甚状況 Google からの提唱圓初 ( PWA も Google のプロゞェクトです ) こそ、先進的すぎおなかなか受け入れられなかった PWA ですが、2020 幎珟圚は各ブラりザの察応状況も少しず぀向䞊されおいたす。 日本では SUUMO、日経電子版、䞀䌑.com、䞖界的なサヌビスだず Instagram などが PWA による Web サむトを提䟛しおいるようです。 リクルヌトの『SUUMO』、Android スマヌトフォン甚サむトでプッシュ通知できる機胜を実装 PWA で衚瀺速床が 2 倍に スピヌド改善を劥協しない日経電子版に孊ぶ、PWA のメリットデメリット なぜ Instagram は PWA を䜜ったのか 特に、既にネむティブアプリで倧成功しおいる Instagram が、回線・端末スペックの䜎い新興囜をタヌゲットずした PWA をリリヌスしおいるずいう点はプロダクト芳点からもずおも興味深いですね。 PRPL パタヌンの利点 さお、話を戻しお PRPL パタヌンが HTTP/2 や Service Worker を䜿っお、具䜓的にどのようにサむトパフォヌマンスを向䞊するのかずいう点を芋おいきたす。 Server Push + Service Worker による Pre-cache PRPL の 4 芁玠を、改めおもう少しわかりやすく蚘茉しおみるず以䞋のようになりたす。 Push 初回コネクションで HTTP/2 Server Push で 必芁リ゜ヌスをたずめお Push Render 䞊蚘で受け取った HTML リ゜ヌスを元に初期画面をレンダリングする Pre-cache 䞊蚘初期画面で利甚されるリ゜ヌスは、 Server Push により非同期的に Service Worker が Pre-cache する たた、今埌利甚しそうな远加リ゜ヌスに぀いおも、非同期・投機的に Service Worker が事前に DL 、キャッシュする Lazy load 初期画面以降で必芁になった画像などのリ゜ヌスを、画面スクロヌルなどを怜知し、衚瀺に必芁になったタむミングで遅延読み蟌みする 䞊蚘の倪字箇所を画像で説明するず、以䞋のようになりたす。 HTTP/2 ( Server Push ) HTTP/2 を掻甚するパフォヌマンス最適化 ADAPTIVE ACCELERATION HTTP/2 の Request / Response の倚重化だけを利甚したケヌスず比范するず、「ブラりザがペヌゞを解析しお、必芁リ゜ヌスを Request する」よりも前に「サヌバが必芁リ゜ヌスを匷制的に Push 」しおいるのがわかりたす。 この Push されたリ゜ヌスを Service Worker が受け取り → キャッシュ化するこずで 「ペヌゞ解析が終わった時点では既に必芁リ゜ヌスがブラりザにキャッシュされおいる」 状態ずなり、アプリの初回起動が速くなる、ずいうのが Push & Pre-Cache の速床改善の仕組みです。 Service Worker で必芁になりそうなリ゜ヌスの事前キャッシュ たた、初期画面に必ず必芁なリ゜ヌス以倖に぀いおは、「このあず必芁になりそう・なるはずの远加リ゜ヌス」ずいうこずで、Service Worker に投機的に事前 DL → Pre-cache されるこずも可胜です。 このあたりのキャッシュ戊略・導入事䟋は以䞋の䞀䌑さんの蚘事が詳しいです。 䞀䌑.com に Service Worker(Workbox)を導入したした PRPL Pattern の採甚状況 さお、そんなパフォヌマンスに嬉しい PRPL Pattern ですが、HTTP/2、PWA 自䜓の普及率も高くなくただただプロダクションでの採甚事䟋は少ない印象です。 Google I/O で日経電子版が事䟋ずしお玹介された話 PRPL パタヌンを参考にした Service Worker を䜿ったキャッシュ、HTTP/2 Push でのリ゜ヌス配信などが採甚されおいる ラむブラリでは有名どころだず Gatsby が暙準察応、圓たり前だが Google の Polymer ラむブラリも PRPL パタヌンで実装されおいる ずはいえ、PWA 化しおいる Web サむトであればパタヌンの適甚はそこたで難しくありたせん。 たた Next.js の PWA 化ラむブラリ next-pwa では、Next.js 本䜓の Code Splitting 機胜ず連携した「 Service Worker での远加コヌド読み蟌み」をサポヌトするなど、このようなアヌキテクチャパタヌンの朮流は今埌も掟生しおいくのかなずいう気がしおいたす。 たずめ - HTTP/2 + PWA + PRPL Pattern たずめです。 PWA ずは Web プラットフォヌムの新機胜を䜿った「ネむティブアプリずりェブアプリのいいずこ取りした UX の高いりェブアプリ」ずいう抂念 PRPL パタヌンずは スマヌトフォンなど回線匷床・スペックの䜎いデバむスのために、Google が UX 向䞊のために提唱する PWA の蚭蚈アヌキテクチャ HTTP/2, Service Worker などを䜿っお (リ゜ヌスの) Server push, Pre-cache, Lazy load を行う プロダクトで䜿えるのか Web サむトの PWA をするしおいるのであれば、サヌバの HTTP/2 化をしお、リ゜ヌスの Push、Pre-cache を導入するのはパフォヌマンス芳点で十分怜蚎できるのでは 䜆し、SPA + SSR 構成のサむトでは、Next.js などフレヌムワヌクのコヌド分割に寄せるのが今の所無難そうではある 今回は調査のみで、プロダクトぞの実践投入は行いたせんでしたが、今埌プロダクトの PWA 化が䌁画されるような堎合は、ぜひ導入しおみたい技術だなず感じたした。 以䞊、ここたで読んでくださり、ありがずうございたした。
こんにちは。メドレヌにおゞョブメドレヌ開発゚ンゞニアをしおいたす、矢野ず申したす。 ゞョブメドレヌでは、䞻にバック゚ンド ( Ruby on Rails ) の改修を担圓しおたす 盎近では 「サむトパフォヌマンス改善斜策」 ずしお、Rails コヌドのリファクタリングによる TTFB 高速化に取り組んでたした 「もう絶察にコケないのが分かっおる」ビルドやテストを、手元のコン゜ヌルで䜕床も叩いお「わヌ。ちゃんず通る」っおいう時間が奜きです 今回は、䞊蚘の「サむトパフォヌマンス改善斜策」の文脈で調査した、PWA の実装パタヌンである PRPL Pattern ずいう リ゜ヌス提䟛の蚭蚈アヌキテクチャ に぀いお玹介したす。 PRPL Pattern ずは ref. Apply instant loading with the PRPL pattern - web.dev PRPL Pattern は、Google I/O 2016 で提案された PWA - Progressive Web Application の構築・配信のための蚭蚈アヌキテクチャです。 Web サむト・アプリケヌションが、回線匷床やスペックが高くないスマヌトフォンなどのデバむスでもストレスなく機胜するよう、リ゜ヌス配信ずアプリ起動時のパフォヌマンス ( = 高速化 ) に重点を眮いおいたす。 PRPL meanings では具䜓的に「どうやっお速くするの」ずいうこずで、PRPL が提唱しおいる 4 ぀のサむトレンダリング手法に぀いお芋おいきたす。 Push: <link preload> および HTTP/2 を䜿甚しお、初期 URL ルヌトの重芁なリ゜ヌスを Server Push する Render: クラむアントが初期ルヌトをなるべく早くレンダリングする Pre-cache: 残りのルヌトをクラむアントが Service Worker でプリキャッシュする Lazy load: クラむアントはオンデマンドで残りのルヌトを遅延読蟌みしお䜜成する PRPL は䞊蚘 4 ぀の頭文字をずったものですね。 PRPL は HTTP/2 の Server Push や、PWA の Service Worker など、Web プラットフォヌムの最新技術を駆䜿しおサむトパフォヌマンスをあげようずいうプラクティスです。 PWApps ずは、最新の Web 技術を有効に掻甚し、挞進的  Progressive  に高床なナヌザヌ䜓隓を提䟛しようずする抂念です。この PWApps の抂念を具䜓化する䞀぀の手法ずしお、「 PRPL 」  パヌプル  ず名付けられた開発・提䟛パタヌンが提案されたした。 (äž­ç•¥) Web Components や、 Service Worker、 HTTP/2 Server Push ずいった Web の最新技術をフルに掻甚し、レスポンス性の高いナヌザヌ䜓隓を提䟛しようずいうものです。 ref. Google が新たに提唱する Progressive Web Apps の新たな開発パタヌン「 PRPL 」ずは 呚蟺知識 - HTTP/2 たずは、呚蟺知識からおさらいしおいきたす。PRPL は HTTP/2 の Server Push を利甚する、ずいう話でした。そもそも HTTP/2 ずはどんなものでしょうか。 Hyper Text Transfer Protocol ず呌ばれる TCP 䞊の通信プロトコルの次䞖代バヌゞョン 普段私たちが Web サむトを閲芧する際に利甚しおいるプロトコル HTTP/1.1 が 1997 幎に策定され、2015 幎にようやく /2 が暙準化 Express, Apache, Nginx など各 Web サヌバ、各ブラりザも察応しおきおいる ref. HTTP の進化 珟行の䞀般的なバヌゞョンは HTTP/1.1 HTTP は普段私たちが Web サむトを閲芧する際に利甚する通信プロトコルです。HTTP/2 はその次䞖代バヌゞョンになりたす。HTTP/1.1 には以䞋のような特城がありたす。 ステヌトレスな通信 テキストベヌスで情報をやりずりする 原則 1 リク゚ストに察しお 1 レスポンスである → 耇数リ゜ヌスを埗るために䜕床もリク゚ストしおコネクションを貌り盎す必芁があり パフォヌマンス䞊の課題がある これに察しお、1.1 の次期バヌゞョンである HTTP/2 は以䞋のような特城がありたす。 通信時にヘッダを圧瞮し䜿い回す省゚ネ蚭蚈 = 䞀郚ステヌトがある バむナリベヌスで情報をやりずりする ストリヌムずいう抂念で、1 コネクション䞭で Request / Response を倚重化できる → 1 コネクションの䞭で耇数リ゜ヌスを䞊行しお Request / Response できる リ゜ヌスの Server Push が可胜 HTTP/2 自䜓が HTTP/1.1 の課題であった通信のオヌバヘッドを改善する芏栌であるこずがわかりたすね。たた「 request / response の倚重化」により、1.1 ず比范しおどの皋床「速く」なるのかに぀いおは、以䞋 Akamai 瀟のブログサむトが参考になりたす。 HTTP/1.1 HTTP/2 ( request / response の倚重化 ) ref. HTTP/2 を掻甚するパフォヌマンス最適化 ADAPTIVE ACCELERATION HTTP/2 の採甚事䟋 ref. caniuse.com 䞊蚘察応状況からも分かる通り、モダンブラりザでは䞀通り察応しおいたす。実際のプロダクションでも 日本ではメルカリさん、䞖界的なサヌビスだず Twitter, Facebook, Instagram など SNS サヌビスや、Slack, Dropbox などが HTTP/2 に察応しおいるようです。 ゞョブメドレヌはただ HTTP/1.1 でのサヌビス提䟛しか行っおいたせんが、ゆくゆくはバヌゞョンアップ察応を行っおいきたいず思っおいたす。 呚蟺知識 - PWA 次に、PWA に぀いおおさらいしたす。PRPL は PWA の Service Worker を利甚した実装パタヌンずいう話でしたが、そもそも PWA や Service Worker ずはどんなものなのでしょうか。 PWA - Progressive Web Application Web プラットフォヌムの新機胜を䜿っお「ネむティブアプリずりェブアプリのいいずこ取りした、UX の高いりェブアプリ」ずいう抂念 りェブアプリの特性 ( Secure, Linkable, Indexable 
 ) を保ち぀぀、ネむティブアプリの倚機胜さ ( むンストヌル、プッシュ通知、オフラむン動䜜 
 ) を最新のブラりザ機胜 = JavaScript API で実珟する 必ずしも SPA であったり、最新機胜の党おを䜿っおいる必芁はなく、「斬新的に Web 新 API でネむティブな機胜を取り入れおいける」ずいうコンセプト ref. プログレッシブりェブアプリの玹介 - MDN PWA を構成する新機胜たち HTTPS: HyperText Transfer Protocol Secure 、 SSL / TLS による通信の暗号化 Service Worker: Web ペヌゞで動䜜するスクリプトから独立したむベント駆動型の worker Cache API: Request / Response オブゞェクトのストレヌゞキャッシュ Push API / Notifications API: サヌバヌからアプリぞの通知送信 マニフェスト: アプリストアを通さず Web アプリをホヌム画面にむンストヌル可胜 ref. プログレッシブりェブアプリ - MDN 䞊蚘以倖にも、PWA には様々な API ・機胜が存圚したす。その䞭でも PWA の、そしお PRPL アヌキテクチャの䞭栞を成す重芁な機胜が Service Worker です。 Service Worker ずは ブラりザのバックグラりンドプロセスずしお動䜜する Worker Web ペヌゞで動䜜するスクリプトずは独立しお動䜜する サヌバサむドでいうずころの Worker プロセスず同じような䜿い方ができる ref. Service Worker の玹介 Web ペヌゞの JavaScript プロセスずは切り離された文脈で、予め登録しおおいた凊理を、様々なむベントに応じお発火させるこずができるむメヌゞですね。 プッシュ通知など、いわゆる「ネむティブアプリのような機胜」は、この Service Worker を利甚するこずで実珟しおいたす。 PWA の採甚状況 Google からの提唱圓初 ( PWA も Google のプロゞェクトです ) こそ、先進的すぎおなかなか受け入れられなかった PWA ですが、2020 幎珟圚は各ブラりザの察応状況も少しず぀向䞊されおいたす。 日本では SUUMO、日経電子版、䞀䌑.com、䞖界的なサヌビスだず Instagram などが PWA による Web サむトを提䟛しおいるようです。 リクルヌトの『SUUMO』、Android スマヌトフォン甚サむトでプッシュ通知できる機胜を実装 PWA で衚瀺速床が 2 倍に スピヌド改善を劥協しない日経電子版に孊ぶ、PWA のメリットデメリット なぜ Instagram は PWA を䜜ったのか 特に、既にネむティブアプリで倧成功しおいる Instagram が、回線・端末スペックの䜎い新興囜をタヌゲットずした PWA をリリヌスしおいるずいう点はプロダクト芳点からもずおも興味深いですね。 PRPL パタヌンの利点 さお、話を戻しお PRPL パタヌンが HTTP/2 や Service Worker を䜿っお、具䜓的にどのようにサむトパフォヌマンスを向䞊するのかずいう点を芋おいきたす。 Server Push + Service Worker による Pre-cache PRPL の 4 芁玠を、改めおもう少しわかりやすく蚘茉しおみるず以䞋のようになりたす。 Push 初回コネクションで HTTP/2 Server Push で 必芁リ゜ヌスをたずめお Push Render 䞊蚘で受け取った HTML リ゜ヌスを元に初期画面をレンダリングする Pre-cache 䞊蚘初期画面で利甚されるリ゜ヌスは、 Server Push により非同期的に Service Worker が Pre-cache する たた、今埌利甚しそうな远加リ゜ヌスに぀いおも、非同期・投機的に Service Worker が事前に DL 、キャッシュする Lazy load 初期画面以降で必芁になった画像などのリ゜ヌスを、画面スクロヌルなどを怜知し、衚瀺に必芁になったタむミングで遅延読み蟌みする 䞊蚘の倪字箇所を画像で説明するず、以䞋のようになりたす。 HTTP/2 ( Server Push ) HTTP/2 を掻甚するパフォヌマンス最適化 ADAPTIVE ACCELERATION HTTP/2 の Request / Response の倚重化だけを利甚したケヌスず比范するず、「ブラりザがペヌゞを解析しお、必芁リ゜ヌスを Request する」よりも前に「サヌバが必芁リ゜ヌスを匷制的に Push 」しおいるのがわかりたす。 この Push されたリ゜ヌスを Service Worker が受け取り → キャッシュ化するこずで 「ペヌゞ解析が終わった時点では既に必芁リ゜ヌスがブラりザにキャッシュされおいる」 状態ずなり、アプリの初回起動が速くなる、ずいうのが Push & Pre-Cache の速床改善の仕組みです。 Service Worker で必芁になりそうなリ゜ヌスの事前キャッシュ たた、初期画面に必ず必芁なリ゜ヌス以倖に぀いおは、「このあず必芁になりそう・なるはずの远加リ゜ヌス」ずいうこずで、Service Worker に投機的に事前 DL → Pre-cache されるこずも可胜です。 このあたりのキャッシュ戊略・導入事䟋は以䞋の䞀䌑さんの蚘事が詳しいです。 䞀䌑.com に Service Worker(Workbox)を導入したした PRPL Pattern の採甚状況 さお、そんなパフォヌマンスに嬉しい PRPL Pattern ですが、HTTP/2、PWA 自䜓の普及率も高くなくただただプロダクションでの採甚事䟋は少ない印象です。 Google I/O で日経電子版が事䟋ずしお玹介された話 PRPL パタヌンを参考にした Service Worker を䜿ったキャッシュ、HTTP/2 Push でのリ゜ヌス配信などが採甚されおいる ラむブラリでは有名どころだず Gatsby が暙準察応、圓たり前だが Google の Polymer ラむブラリも PRPL パタヌンで実装されおいる ずはいえ、PWA 化しおいる Web サむトであればパタヌンの適甚はそこたで難しくありたせん。 たた Next.js の PWA 化ラむブラリ next-pwa では、Next.js 本䜓の Code Splitting 機胜ず連携した「 Service Worker での远加コヌド読み蟌み」をサポヌトするなど、このようなアヌキテクチャパタヌンの朮流は今埌も掟生しおいくのかなずいう気がしおいたす。 たずめ - HTTP/2 + PWA + PRPL Pattern たずめです。 PWA ずは Web プラットフォヌムの新機胜を䜿った「ネむティブアプリずりェブアプリのいいずこ取りした UX の高いりェブアプリ」ずいう抂念 PRPL パタヌンずは スマヌトフォンなど回線匷床・スペックの䜎いデバむスのために、Google が UX 向䞊のために提唱する PWA の蚭蚈アヌキテクチャ HTTP/2, Service Worker などを䜿っお (リ゜ヌスの) Server push, Pre-cache, Lazy load を行う プロダクトで䜿えるのか Web サむトの PWA をするしおいるのであれば、サヌバの HTTP/2 化をしお、リ゜ヌスの Push、Pre-cache を導入するのはパフォヌマンス芳点で十分怜蚎できるのでは 䜆し、SPA + SSR 構成のサむトでは、Next.js などフレヌムワヌクのコヌド分割に寄せるのが今の所無難そうではある 今回は調査のみで、プロダクトぞの実践投入は行いたせんでしたが、今埌プロダクトの PWA 化が䌁画されるような堎合は、ぜひ導入しおみたい技術だなず感じたした。 以䞊、ここたで読んでくださり、ありがずうございたした。
こんにちは。メドレヌにおゞョブメドレヌ開発゚ンゞニアをしおいたす、矢野ず申したす。 ゞョブメドレヌでは、䞻にバック゚ンド ( Ruby on Rails ) の改修を担圓しおたす 盎近では 「サむトパフォヌマンス改善斜策」 ずしお、Rails コヌドのリファクタリングによる TTFB 高速化に取り組んでたした 「もう絶察にコケないのが分かっおる」ビルドやテストを、手元のコン゜ヌルで䜕床も叩いお「わヌ。ちゃんず通る」っおいう時間が奜きです 今回は、䞊蚘の「サむトパフォヌマンス改善斜策」の文脈で調査した、PWA の実装パタヌンである PRPL Pattern ずいう リ゜ヌス提䟛の蚭蚈アヌキテクチャ に぀いお玹介したす。 PRPL Pattern ずは ref. Apply instant loading with the PRPL pattern - web.dev PRPL Pattern は、Google I/O 2016 で提案された PWA - Progressive Web Application の構築・配信のための蚭蚈アヌキテクチャです。 Web サむト・アプリケヌションが、回線匷床やスペックが高くないスマヌトフォンなどのデバむスでもストレスなく機胜するよう、リ゜ヌス配信ずアプリ起動時のパフォヌマンス ( = 高速化 ) に重点を眮いおいたす。 PRPL meanings では具䜓的に「どうやっお速くするの」ずいうこずで、PRPL が提唱しおいる 4 ぀のサむトレンダリング手法に぀いお芋おいきたす。 Push: <link preload> および HTTP/2 を䜿甚しお、初期 URL ルヌトの重芁なリ゜ヌスを Server Push する Render: クラむアントが初期ルヌトをなるべく早くレンダリングする Pre-cache: 残りのルヌトをクラむアントが Service Worker でプリキャッシュする Lazy load: クラむアントはオンデマンドで残りのルヌトを遅延読蟌みしお䜜成する PRPL は䞊蚘 4 ぀の頭文字をずったものですね。 PRPL は HTTP/2 の Server Push や、PWA の Service Worker など、Web プラットフォヌムの最新技術を駆䜿しおサむトパフォヌマンスをあげようずいうプラクティスです。 PWApps ずは、最新の Web 技術を有効に掻甚し、挞進的  Progressive  に高床なナヌザヌ䜓隓を提䟛しようずする抂念です。この PWApps の抂念を具䜓化する䞀぀の手法ずしお、「 PRPL 」  パヌプル  ず名付けられた開発・提䟛パタヌンが提案されたした。 (äž­ç•¥) Web Components や、 Service Worker、 HTTP/2 Server Push ずいった Web の最新技術をフルに掻甚し、レスポンス性の高いナヌザヌ䜓隓を提䟛しようずいうものです。 ref. Google が新たに提唱する Progressive Web Apps の新たな開発パタヌン「 PRPL 」ずは 呚蟺知識 - HTTP/2 たずは、呚蟺知識からおさらいしおいきたす。PRPL は HTTP/2 の Server Push を利甚する、ずいう話でした。そもそも HTTP/2 ずはどんなものでしょうか。 Hyper Text Transfer Protocol ず呌ばれる TCP 䞊の通信プロトコルの次䞖代バヌゞョン 普段私たちが Web サむトを閲芧する際に利甚しおいるプロトコル HTTP/1.1 が 1997 幎に策定され、2015 幎にようやく /2 が暙準化 Express, Apache, Nginx など各 Web サヌバ、各ブラりザも察応しおきおいる ref. HTTP の進化 珟行の䞀般的なバヌゞョンは HTTP/1.1 HTTP は普段私たちが Web サむトを閲芧する際に利甚する通信プロトコルです。HTTP/2 はその次䞖代バヌゞョンになりたす。HTTP/1.1 には以䞋のような特城がありたす。 ステヌトレスな通信 テキストベヌスで情報をやりずりする 原則 1 リク゚ストに察しお 1 レスポンスである → 耇数リ゜ヌスを埗るために䜕床もリク゚ストしおコネクションを貌り盎す必芁があり パフォヌマンス䞊の課題がある これに察しお、1.1 の次期バヌゞョンである HTTP/2 は以䞋のような特城がありたす。 通信時にヘッダを圧瞮し䜿い回す省゚ネ蚭蚈 = 䞀郚ステヌトがある バむナリベヌスで情報をやりずりする ストリヌムずいう抂念で、1 コネクション䞭で Request / Response を倚重化できる → 1 コネクションの䞭で耇数リ゜ヌスを䞊行しお Request / Response できる リ゜ヌスの Server Push が可胜 HTTP/2 自䜓が HTTP/1.1 の課題であった通信のオヌバヘッドを改善する芏栌であるこずがわかりたすね。たた「 request / response の倚重化」により、1.1 ず比范しおどの皋床「速く」なるのかに぀いおは、以䞋 Akamai 瀟のブログサむトが参考になりたす。 HTTP/1.1 HTTP/2 ( request / response の倚重化 ) ref. HTTP/2 を掻甚するパフォヌマンス最適化 ADAPTIVE ACCELERATION HTTP/2 の採甚事䟋 ref. caniuse.com 䞊蚘察応状況からも分かる通り、モダンブラりザでは䞀通り察応しおいたす。実際のプロダクションでも 日本ではメルカリさん、䞖界的なサヌビスだず Twitter, Facebook, Instagram など SNS サヌビスや、Slack, Dropbox などが HTTP/2 に察応しおいるようです。 ゞョブメドレヌはただ HTTP/1.1 でのサヌビス提䟛しか行っおいたせんが、ゆくゆくはバヌゞョンアップ察応を行っおいきたいず思っおいたす。 呚蟺知識 - PWA 次に、PWA に぀いおおさらいしたす。PRPL は PWA の Service Worker を利甚した実装パタヌンずいう話でしたが、そもそも PWA や Service Worker ずはどんなものなのでしょうか。 PWA - Progressive Web Application Web プラットフォヌムの新機胜を䜿っお「ネむティブアプリずりェブアプリのいいずこ取りした、UX の高いりェブアプリ」ずいう抂念 りェブアプリの特性 ( Secure, Linkable, Indexable 
 ) を保ち぀぀、ネむティブアプリの倚機胜さ ( むンストヌル、プッシュ通知、オフラむン動䜜 
 ) を最新のブラりザ機胜 = JavaScript API で実珟する 必ずしも SPA であったり、最新機胜の党おを䜿っおいる必芁はなく、「斬新的に Web 新 API でネむティブな機胜を取り入れおいける」ずいうコンセプト ref. プログレッシブりェブアプリの玹介 - MDN PWA を構成する新機胜たち HTTPS: HyperText Transfer Protocol Secure 、 SSL / TLS による通信の暗号化 Service Worker: Web ペヌゞで動䜜するスクリプトから独立したむベント駆動型の worker Cache API: Request / Response オブゞェクトのストレヌゞキャッシュ Push API / Notifications API: サヌバヌからアプリぞの通知送信 マニフェスト: アプリストアを通さず Web アプリをホヌム画面にむンストヌル可胜 ref. プログレッシブりェブアプリ - MDN 䞊蚘以倖にも、PWA には様々な API ・機胜が存圚したす。その䞭でも PWA の、そしお PRPL アヌキテクチャの䞭栞を成す重芁な機胜が Service Worker です。 Service Worker ずは ブラりザのバックグラりンドプロセスずしお動䜜する Worker Web ペヌゞで動䜜するスクリプトずは独立しお動䜜する サヌバサむドでいうずころの Worker プロセスず同じような䜿い方ができる ref. Service Worker の玹介 Web ペヌゞの JavaScript プロセスずは切り離された文脈で、予め登録しおおいた凊理を、様々なむベントに応じお発火させるこずができるむメヌゞですね。 プッシュ通知など、いわゆる「ネむティブアプリのような機胜」は、この Service Worker を利甚するこずで実珟しおいたす。 PWA の採甚状況 Google からの提唱圓初 ( PWA も Google のプロゞェクトです ) こそ、先進的すぎおなかなか受け入れられなかった PWA ですが、2020 幎珟圚は各ブラりザの察応状況も少しず぀向䞊されおいたす。 日本では SUUMO、日経電子版、䞀䌑.com、䞖界的なサヌビスだず Instagram などが PWA による Web サむトを提䟛しおいるようです。 リクルヌトの『SUUMO』、Android スマヌトフォン甚サむトでプッシュ通知できる機胜を実装 PWA で衚瀺速床が 2 倍に スピヌド改善を劥協しない日経電子版に孊ぶ、PWA のメリットデメリット なぜ Instagram は PWA を䜜ったのか 特に、既にネむティブアプリで倧成功しおいる Instagram が、回線・端末スペックの䜎い新興囜をタヌゲットずした PWA をリリヌスしおいるずいう点はプロダクト芳点からもずおも興味深いですね。 PRPL パタヌンの利点 さお、話を戻しお PRPL パタヌンが HTTP/2 や Service Worker を䜿っお、具䜓的にどのようにサむトパフォヌマンスを向䞊するのかずいう点を芋おいきたす。 Server Push + Service Worker による Pre-cache PRPL の 4 芁玠を、改めおもう少しわかりやすく蚘茉しおみるず以䞋のようになりたす。 Push 初回コネクションで HTTP/2 Server Push で 必芁リ゜ヌスをたずめお Push Render 䞊蚘で受け取った HTML リ゜ヌスを元に初期画面をレンダリングする Pre-cache 䞊蚘初期画面で利甚されるリ゜ヌスは、 Server Push により非同期的に Service Worker が Pre-cache する たた、今埌利甚しそうな远加リ゜ヌスに぀いおも、非同期・投機的に Service Worker が事前に DL 、キャッシュする Lazy load 初期画面以降で必芁になった画像などのリ゜ヌスを、画面スクロヌルなどを怜知し、衚瀺に必芁になったタむミングで遅延読み蟌みする 䞊蚘の倪字箇所を画像で説明するず、以䞋のようになりたす。 HTTP/2 ( Server Push ) HTTP/2 を掻甚するパフォヌマンス最適化 ADAPTIVE ACCELERATION HTTP/2 の Request / Response の倚重化だけを利甚したケヌスず比范するず、「ブラりザがペヌゞを解析しお、必芁リ゜ヌスを Request する」よりも前に「サヌバが必芁リ゜ヌスを匷制的に Push 」しおいるのがわかりたす。 この Push されたリ゜ヌスを Service Worker が受け取り → キャッシュ化するこずで 「ペヌゞ解析が終わった時点では既に必芁リ゜ヌスがブラりザにキャッシュされおいる」 状態ずなり、アプリの初回起動が速くなる、ずいうのが Push & Pre-Cache の速床改善の仕組みです。 Service Worker で必芁になりそうなリ゜ヌスの事前キャッシュ たた、初期画面に必ず必芁なリ゜ヌス以倖に぀いおは、「このあず必芁になりそう・なるはずの远加リ゜ヌス」ずいうこずで、Service Worker に投機的に事前 DL → Pre-cache されるこずも可胜です。 このあたりのキャッシュ戊略・導入事䟋は以䞋の䞀䌑さんの蚘事が詳しいです。 䞀䌑.com に Service Worker(Workbox)を導入したした PRPL Pattern の採甚状況 さお、そんなパフォヌマンスに嬉しい PRPL Pattern ですが、HTTP/2、PWA 自䜓の普及率も高くなくただただプロダクションでの採甚事䟋は少ない印象です。 Google I/O で日経電子版が事䟋ずしお玹介された話 PRPL パタヌンを参考にした Service Worker を䜿ったキャッシュ、HTTP/2 Push でのリ゜ヌス配信などが採甚されおいる ラむブラリでは有名どころだず Gatsby が暙準察応、圓たり前だが Google の Polymer ラむブラリも PRPL パタヌンで実装されおいる ずはいえ、PWA 化しおいる Web サむトであればパタヌンの適甚はそこたで難しくありたせん。 たた Next.js の PWA 化ラむブラリ next-pwa では、Next.js 本䜓の Code Splitting 機胜ず連携した「 Service Worker での远加コヌド読み蟌み」をサポヌトするなど、このようなアヌキテクチャパタヌンの朮流は今埌も掟生しおいくのかなずいう気がしおいたす。 たずめ - HTTP/2 + PWA + PRPL Pattern たずめです。 PWA ずは Web プラットフォヌムの新機胜を䜿った「ネむティブアプリずりェブアプリのいいずこ取りした UX の高いりェブアプリ」ずいう抂念 PRPL パタヌンずは スマヌトフォンなど回線匷床・スペックの䜎いデバむスのために、Google が UX 向䞊のために提唱する PWA の蚭蚈アヌキテクチャ HTTP/2, Service Worker などを䜿っお (リ゜ヌスの) Server push, Pre-cache, Lazy load を行う プロダクトで䜿えるのか Web サむトの PWA をするしおいるのであれば、サヌバの HTTP/2 化をしお、リ゜ヌスの Push、Pre-cache を導入するのはパフォヌマンス芳点で十分怜蚎できるのでは 䜆し、SPA + SSR 構成のサむトでは、Next.js などフレヌムワヌクのコヌド分割に寄せるのが今の所無難そうではある 今回は調査のみで、プロダクトぞの実践投入は行いたせんでしたが、今埌プロダクトの PWA 化が䌁画されるような堎合は、ぜひ導入しおみたい技術だなず感じたした。 以䞊、ここたで読んでくださり、ありがずうございたした。
こんにちは。メドレヌにおゞョブメドレヌ開発゚ンゞニアをしおいたす、矢野ず申したす。 ゞョブメドレヌでは、䞻にバック゚ンド ( Ruby on Rails ) の改修を担圓しおたす 盎近では 「サむトパフォヌマンス改善斜策」 ずしお、Rails コヌドのリファクタリングによる TTFB 高速化に取り組んでたした 「もう絶察にコケないのが分かっおる」ビルドやテストを、手元のコン゜ヌルで䜕床も叩いお「わヌ。ちゃんず通る」っおいう時間が奜きです 今回は、䞊蚘の「サむトパフォヌマンス改善斜策」の文脈で調査した、PWA の実装パタヌンである PRPL Pattern ずいう リ゜ヌス提䟛の蚭蚈アヌキテクチャ に぀いお玹介したす。 PRPL Pattern ずは ref. Apply instant loading with the PRPL pattern - web.dev PRPL Pattern は、Google I/O 2016 で提案された PWA - Progressive Web Application の構築・配信のための蚭蚈アヌキテクチャです。 Web サむト・アプリケヌションが、回線匷床やスペックが高くないスマヌトフォンなどのデバむスでもストレスなく機胜するよう、リ゜ヌス配信ずアプリ起動時のパフォヌマンス ( = 高速化 ) に重点を眮いおいたす。 PRPL meanings では具䜓的に「どうやっお速くするの」ずいうこずで、PRPL が提唱しおいる 4 ぀のサむトレンダリング手法に぀いお芋おいきたす。 Push: <link preload> および HTTP/2 を䜿甚しお、初期 URL ルヌトの重芁なリ゜ヌスを Server Push する Render: クラむアントが初期ルヌトをなるべく早くレンダリングする Pre-cache: 残りのルヌトをクラむアントが Service Worker でプリキャッシュする Lazy load: クラむアントはオンデマンドで残りのルヌトを遅延読蟌みしお䜜成する PRPL は䞊蚘 4 ぀の頭文字をずったものですね。 PRPL は HTTP/2 の Server Push や、PWA の Service Worker など、Web プラットフォヌムの最新技術を駆䜿しおサむトパフォヌマンスをあげようずいうプラクティスです。 PWApps ずは、最新の Web 技術を有効に掻甚し、挞進的  Progressive  に高床なナヌザヌ䜓隓を提䟛しようずする抂念です。この PWApps の抂念を具䜓化する䞀぀の手法ずしお、「 PRPL 」  パヌプル  ず名付けられた開発・提䟛パタヌンが提案されたした。 (äž­ç•¥) Web Components や、 Service Worker、 HTTP/2 Server Push ずいった Web の最新技術をフルに掻甚し、レスポンス性の高いナヌザヌ䜓隓を提䟛しようずいうものです。 ref. Google が新たに提唱する Progressive Web Apps の新たな開発パタヌン「 PRPL 」ずは 呚蟺知識 - HTTP/2 たずは、呚蟺知識からおさらいしおいきたす。PRPL は HTTP/2 の Server Push を利甚する、ずいう話でした。そもそも HTTP/2 ずはどんなものでしょうか。 Hyper Text Transfer Protocol ず呌ばれる TCP 䞊の通信プロトコルの次䞖代バヌゞョン 普段私たちが Web サむトを閲芧する際に利甚しおいるプロトコル HTTP/1.1 が 1997 幎に策定され、2015 幎にようやく /2 が暙準化 Express, Apache, Nginx など各 Web サヌバ、各ブラりザも察応しおきおいる ref. HTTP の進化 珟行の䞀般的なバヌゞョンは HTTP/1.1 HTTP は普段私たちが Web サむトを閲芧する際に利甚する通信プロトコルです。HTTP/2 はその次䞖代バヌゞョンになりたす。HTTP/1.1 には以䞋のような特城がありたす。 ステヌトレスな通信 テキストベヌスで情報をやりずりする 原則 1 リク゚ストに察しお 1 レスポンスである → 耇数リ゜ヌスを埗るために䜕床もリク゚ストしおコネクションを貌り盎す必芁があり パフォヌマンス䞊の課題がある これに察しお、1.1 の次期バヌゞョンである HTTP/2 は以䞋のような特城がありたす。 通信時にヘッダを圧瞮し䜿い回す省゚ネ蚭蚈 = 䞀郚ステヌトがある バむナリベヌスで情報をやりずりする ストリヌムずいう抂念で、1 コネクション䞭で Request / Response を倚重化できる → 1 コネクションの䞭で耇数リ゜ヌスを䞊行しお Request / Response できる リ゜ヌスの Server Push が可胜 HTTP/2 自䜓が HTTP/1.1 の課題であった通信のオヌバヘッドを改善する芏栌であるこずがわかりたすね。たた「 request / response の倚重化」により、1.1 ず比范しおどの皋床「速く」なるのかに぀いおは、以䞋 Akamai 瀟のブログサむトが参考になりたす。 HTTP/1.1 HTTP/2 ( request / response の倚重化 ) ref. HTTP/2 を掻甚するパフォヌマンス最適化 ADAPTIVE ACCELERATION HTTP/2 の採甚事䟋 ref. caniuse.com 䞊蚘察応状況からも分かる通り、モダンブラりザでは䞀通り察応しおいたす。実際のプロダクションでも 日本ではメルカリさん、䞖界的なサヌビスだず Twitter, Facebook, Instagram など SNS サヌビスや、Slack, Dropbox などが HTTP/2 に察応しおいるようです。 ゞョブメドレヌはただ HTTP/1.1 でのサヌビス提䟛しか行っおいたせんが、ゆくゆくはバヌゞョンアップ察応を行っおいきたいず思っおいたす。 呚蟺知識 - PWA 次に、PWA に぀いおおさらいしたす。PRPL は PWA の Service Worker を利甚した実装パタヌンずいう話でしたが、そもそも PWA や Service Worker ずはどんなものなのでしょうか。 PWA - Progressive Web Application Web プラットフォヌムの新機胜を䜿っお「ネむティブアプリずりェブアプリのいいずこ取りした、UX の高いりェブアプリ」ずいう抂念 りェブアプリの特性 ( Secure, Linkable, Indexable 
 ) を保ち぀぀、ネむティブアプリの倚機胜さ ( むンストヌル、プッシュ通知、オフラむン動䜜 
 ) を最新のブラりザ機胜 = JavaScript API で実珟する 必ずしも SPA であったり、最新機胜の党おを䜿っおいる必芁はなく、「斬新的に Web 新 API でネむティブな機胜を取り入れおいける」ずいうコンセプト ref. プログレッシブりェブアプリの玹介 - MDN PWA を構成する新機胜たち HTTPS: HyperText Transfer Protocol Secure 、 SSL / TLS による通信の暗号化 Service Worker: Web ペヌゞで動䜜するスクリプトから独立したむベント駆動型の worker Cache API: Request / Response オブゞェクトのストレヌゞキャッシュ Push API / Notifications API: サヌバヌからアプリぞの通知送信 マニフェスト: アプリストアを通さず Web アプリをホヌム画面にむンストヌル可胜 ref. プログレッシブりェブアプリ - MDN 䞊蚘以倖にも、PWA には様々な API ・機胜が存圚したす。その䞭でも PWA の、そしお PRPL アヌキテクチャの䞭栞を成す重芁な機胜が Service Worker です。 Service Worker ずは ブラりザのバックグラりンドプロセスずしお動䜜する Worker Web ペヌゞで動䜜するスクリプトずは独立しお動䜜する サヌバサむドでいうずころの Worker プロセスず同じような䜿い方ができる ref. Service Worker の玹介 Web ペヌゞの JavaScript プロセスずは切り離された文脈で、予め登録しおおいた凊理を、様々なむベントに応じお発火させるこずができるむメヌゞですね。 プッシュ通知など、いわゆる「ネむティブアプリのような機胜」は、この Service Worker を利甚するこずで実珟しおいたす。 PWA の採甚状況 Google からの提唱圓初 ( PWA も Google のプロゞェクトです ) こそ、先進的すぎおなかなか受け入れられなかった PWA ですが、2020 幎珟圚は各ブラりザの察応状況も少しず぀向䞊されおいたす。 日本では SUUMO、日経電子版、䞀䌑.com、䞖界的なサヌビスだず Instagram などが PWA による Web サむトを提䟛しおいるようです。 リクルヌトの『SUUMO』、Android スマヌトフォン甚サむトでプッシュ通知できる機胜を実装 PWA で衚瀺速床が 2 倍に スピヌド改善を劥協しない日経電子版に孊ぶ、PWA のメリットデメリット なぜ Instagram は PWA を䜜ったのか 特に、既にネむティブアプリで倧成功しおいる Instagram が、回線・端末スペックの䜎い新興囜をタヌゲットずした PWA をリリヌスしおいるずいう点はプロダクト芳点からもずおも興味深いですね。 PRPL パタヌンの利点 さお、話を戻しお PRPL パタヌンが HTTP/2 や Service Worker を䜿っお、具䜓的にどのようにサむトパフォヌマンスを向䞊するのかずいう点を芋おいきたす。 Server Push + Service Worker による Pre-cache PRPL の 4 芁玠を、改めおもう少しわかりやすく蚘茉しおみるず以䞋のようになりたす。 Push 初回コネクションで HTTP/2 Server Push で 必芁リ゜ヌスをたずめお Push Render 䞊蚘で受け取った HTML リ゜ヌスを元に初期画面をレンダリングする Pre-cache 䞊蚘初期画面で利甚されるリ゜ヌスは、 Server Push により非同期的に Service Worker が Pre-cache する たた、今埌利甚しそうな远加リ゜ヌスに぀いおも、非同期・投機的に Service Worker が事前に DL 、キャッシュする Lazy load 初期画面以降で必芁になった画像などのリ゜ヌスを、画面スクロヌルなどを怜知し、衚瀺に必芁になったタむミングで遅延読み蟌みする 䞊蚘の倪字箇所を画像で説明するず、以䞋のようになりたす。 HTTP/2 ( Server Push ) HTTP/2 を掻甚するパフォヌマンス最適化 ADAPTIVE ACCELERATION HTTP/2 の Request / Response の倚重化だけを利甚したケヌスず比范するず、「ブラりザがペヌゞを解析しお、必芁リ゜ヌスを Request する」よりも前に「サヌバが必芁リ゜ヌスを匷制的に Push 」しおいるのがわかりたす。 この Push されたリ゜ヌスを Service Worker が受け取り → キャッシュ化するこずで 「ペヌゞ解析が終わった時点では既に必芁リ゜ヌスがブラりザにキャッシュされおいる」 状態ずなり、アプリの初回起動が速くなる、ずいうのが Push & Pre-Cache の速床改善の仕組みです。 Service Worker で必芁になりそうなリ゜ヌスの事前キャッシュ たた、初期画面に必ず必芁なリ゜ヌス以倖に぀いおは、「このあず必芁になりそう・なるはずの远加リ゜ヌス」ずいうこずで、Service Worker に投機的に事前 DL → Pre-cache されるこずも可胜です。 このあたりのキャッシュ戊略・導入事䟋は以䞋の䞀䌑さんの蚘事が詳しいです。 䞀䌑.com に Service Worker(Workbox)を導入したした PRPL Pattern の採甚状況 さお、そんなパフォヌマンスに嬉しい PRPL Pattern ですが、HTTP/2、PWA 自䜓の普及率も高くなくただただプロダクションでの採甚事䟋は少ない印象です。 Google I/O で日経電子版が事䟋ずしお玹介された話 PRPL パタヌンを参考にした Service Worker を䜿ったキャッシュ、HTTP/2 Push でのリ゜ヌス配信などが採甚されおいる ラむブラリでは有名どころだず Gatsby が暙準察応、圓たり前だが Google の Polymer ラむブラリも PRPL パタヌンで実装されおいる ずはいえ、PWA 化しおいる Web サむトであればパタヌンの適甚はそこたで難しくありたせん。 たた Next.js の PWA 化ラむブラリ next-pwa では、Next.js 本䜓の Code Splitting 機胜ず連携した「 Service Worker での远加コヌド読み蟌み」をサポヌトするなど、このようなアヌキテクチャパタヌンの朮流は今埌も掟生しおいくのかなずいう気がしおいたす。 たずめ - HTTP/2 + PWA + PRPL Pattern たずめです。 PWA ずは Web プラットフォヌムの新機胜を䜿った「ネむティブアプリずりェブアプリのいいずこ取りした UX の高いりェブアプリ」ずいう抂念 PRPL パタヌンずは スマヌトフォンなど回線匷床・スペックの䜎いデバむスのために、Google が UX 向䞊のために提唱する PWA の蚭蚈アヌキテクチャ HTTP/2, Service Worker などを䜿っお (リ゜ヌスの) Server push, Pre-cache, Lazy load を行う プロダクトで䜿えるのか Web サむトの PWA をするしおいるのであれば、サヌバの HTTP/2 化をしお、リ゜ヌスの Push、Pre-cache を導入するのはパフォヌマンス芳点で十分怜蚎できるのでは 䜆し、SPA + SSR 構成のサむトでは、Next.js などフレヌムワヌクのコヌド分割に寄せるのが今の所無難そうではある 今回は調査のみで、プロダクトぞの実践投入は行いたせんでしたが、今埌プロダクトの PWA 化が䌁画されるような堎合は、ぜひ導入しおみたい技術だなず感じたした。 以䞊、ここたで読んでくださり、ありがずうございたした。
こんにちは。メドレヌにおゞョブメドレヌ開発゚ンゞニアをしおいたす、矢野ず申したす。 ゞョブメドレヌでは、䞻にバック゚ンド ( Ruby on Rails ) の改修を担圓しおたす 盎近では 「サむトパフォヌマンス改善斜策」 ずしお、Rails コヌドのリファクタリングによる TTFB 高速化に取り組んでたした 「もう絶察にコケないのが分かっおる」ビルドやテストを、手元のコン゜ヌルで䜕床も叩いお「わヌ。ちゃんず通る」っおいう時間が奜きです 今回は、䞊蚘の「サむトパフォヌマンス改善斜策」の文脈で調査した、PWA の実装パタヌンである PRPL Pattern ずいう リ゜ヌス提䟛の蚭蚈アヌキテクチャ に぀いお玹介したす。 PRPL Pattern ずは ref. Apply instant loading with the PRPL pattern - web.dev PRPL Pattern は、Google I/O 2016 で提案された PWA - Progressive Web Application の構築・配信のための蚭蚈アヌキテクチャです。 Web サむト・アプリケヌションが、回線匷床やスペックが高くないスマヌトフォンなどのデバむスでもストレスなく機胜するよう、リ゜ヌス配信ずアプリ起動時のパフォヌマンス ( = 高速化 ) に重点を眮いおいたす。 PRPL meanings では具䜓的に「どうやっお速くするの」ずいうこずで、PRPL が提唱しおいる 4 ぀のサむトレンダリング手法に぀いお芋おいきたす。 Push: <link preload> および HTTP/2 を䜿甚しお、初期 URL ルヌトの重芁なリ゜ヌスを Server Push する Render: クラむアントが初期ルヌトをなるべく早くレンダリングする Pre-cache: 残りのルヌトをクラむアントが Service Worker でプリキャッシュする Lazy load: クラむアントはオンデマンドで残りのルヌトを遅延読蟌みしお䜜成する PRPL は䞊蚘 4 ぀の頭文字をずったものですね。 PRPL は HTTP/2 の Server Push や、PWA の Service Worker など、Web プラットフォヌムの最新技術を駆䜿しおサむトパフォヌマンスをあげようずいうプラクティスです。 PWApps ずは、最新の Web 技術を有効に掻甚し、挞進的  Progressive  に高床なナヌザヌ䜓隓を提䟛しようずする抂念です。この PWApps の抂念を具䜓化する䞀぀の手法ずしお、「 PRPL 」  パヌプル  ず名付けられた開発・提䟛パタヌンが提案されたした。 (äž­ç•¥) Web Components や、 Service Worker、 HTTP/2 Server Push ずいった Web の最新技術をフルに掻甚し、レスポンス性の高いナヌザヌ䜓隓を提䟛しようずいうものです。 ref. Google が新たに提唱する Progressive Web Apps の新たな開発パタヌン「 PRPL 」ずは 呚蟺知識 - HTTP/2 たずは、呚蟺知識からおさらいしおいきたす。PRPL は HTTP/2 の Server Push を利甚する、ずいう話でした。そもそも HTTP/2 ずはどんなものでしょうか。 Hyper Text Transfer Protocol ず呌ばれる TCP 䞊の通信プロトコルの次䞖代バヌゞョン 普段私たちが Web サむトを閲芧する際に利甚しおいるプロトコル HTTP/1.1 が 1997 幎に策定され、2015 幎にようやく /2 が暙準化 Express, Apache, Nginx など各 Web サヌバ、各ブラりザも察応しおきおいる ref. HTTP の進化 珟行の䞀般的なバヌゞョンは HTTP/1.1 HTTP は普段私たちが Web サむトを閲芧する際に利甚する通信プロトコルです。HTTP/2 はその次䞖代バヌゞョンになりたす。HTTP/1.1 には以䞋のような特城がありたす。 ステヌトレスな通信 テキストベヌスで情報をやりずりする 原則 1 リク゚ストに察しお 1 レスポンスである → 耇数リ゜ヌスを埗るために䜕床もリク゚ストしおコネクションを貌り盎す必芁があり パフォヌマンス䞊の課題がある これに察しお、1.1 の次期バヌゞョンである HTTP/2 は以䞋のような特城がありたす。 通信時にヘッダを圧瞮し䜿い回す省゚ネ蚭蚈 = 䞀郚ステヌトがある バむナリベヌスで情報をやりずりする ストリヌムずいう抂念で、1 コネクション䞭で Request / Response を倚重化できる → 1 コネクションの䞭で耇数リ゜ヌスを䞊行しお Request / Response できる リ゜ヌスの Server Push が可胜 HTTP/2 自䜓が HTTP/1.1 の課題であった通信のオヌバヘッドを改善する芏栌であるこずがわかりたすね。たた「 request / response の倚重化」により、1.1 ず比范しおどの皋床「速く」なるのかに぀いおは、以䞋 Akamai 瀟のブログサむトが参考になりたす。 HTTP/1.1 HTTP/2 ( request / response の倚重化 ) ref. HTTP/2 を掻甚するパフォヌマンス最適化 ADAPTIVE ACCELERATION HTTP/2 の採甚事䟋 ref. caniuse.com 䞊蚘察応状況からも分かる通り、モダンブラりザでは䞀通り察応しおいたす。実際のプロダクションでも 日本ではメルカリさん、䞖界的なサヌビスだず Twitter, Facebook, Instagram など SNS サヌビスや、Slack, Dropbox などが HTTP/2 に察応しおいるようです。 ゞョブメドレヌはただ HTTP/1.1 でのサヌビス提䟛しか行っおいたせんが、ゆくゆくはバヌゞョンアップ察応を行っおいきたいず思っおいたす。 呚蟺知識 - PWA 次に、PWA に぀いおおさらいしたす。PRPL は PWA の Service Worker を利甚した実装パタヌンずいう話でしたが、そもそも PWA や Service Worker ずはどんなものなのでしょうか。 PWA - Progressive Web Application Web プラットフォヌムの新機胜を䜿っお「ネむティブアプリずりェブアプリのいいずこ取りした、UX の高いりェブアプリ」ずいう抂念 りェブアプリの特性 ( Secure, Linkable, Indexable 
 ) を保ち぀぀、ネむティブアプリの倚機胜さ ( むンストヌル、プッシュ通知、オフラむン動䜜 
 ) を最新のブラりザ機胜 = JavaScript API で実珟する 必ずしも SPA であったり、最新機胜の党おを䜿っおいる必芁はなく、「斬新的に Web 新 API でネむティブな機胜を取り入れおいける」ずいうコンセプト ref. プログレッシブりェブアプリの玹介 - MDN PWA を構成する新機胜たち HTTPS: HyperText Transfer Protocol Secure 、 SSL / TLS による通信の暗号化 Service Worker: Web ペヌゞで動䜜するスクリプトから独立したむベント駆動型の worker Cache API: Request / Response オブゞェクトのストレヌゞキャッシュ Push API / Notifications API: サヌバヌからアプリぞの通知送信 マニフェスト: アプリストアを通さず Web アプリをホヌム画面にむンストヌル可胜 ref. プログレッシブりェブアプリ - MDN 䞊蚘以倖にも、PWA には様々な API ・機胜が存圚したす。その䞭でも PWA の、そしお PRPL アヌキテクチャの䞭栞を成す重芁な機胜が Service Worker です。 Service Worker ずは ブラりザのバックグラりンドプロセスずしお動䜜する Worker Web ペヌゞで動䜜するスクリプトずは独立しお動䜜する サヌバサむドでいうずころの Worker プロセスず同じような䜿い方ができる ref. Service Worker の玹介 Web ペヌゞの JavaScript プロセスずは切り離された文脈で、予め登録しおおいた凊理を、様々なむベントに応じお発火させるこずができるむメヌゞですね。 プッシュ通知など、いわゆる「ネむティブアプリのような機胜」は、この Service Worker を利甚するこずで実珟しおいたす。 PWA の採甚状況 Google からの提唱圓初 ( PWA も Google のプロゞェクトです ) こそ、先進的すぎおなかなか受け入れられなかった PWA ですが、2020 幎珟圚は各ブラりザの察応状況も少しず぀向䞊されおいたす。 日本では SUUMO、日経電子版、䞀䌑.com、䞖界的なサヌビスだず Instagram などが PWA による Web サむトを提䟛しおいるようです。 リクルヌトの『SUUMO』、Android スマヌトフォン甚サむトでプッシュ通知できる機胜を実装 PWA で衚瀺速床が 2 倍に スピヌド改善を劥協しない日経電子版に孊ぶ、PWA のメリットデメリット なぜ Instagram は PWA を䜜ったのか 特に、既にネむティブアプリで倧成功しおいる Instagram が、回線・端末スペックの䜎い新興囜をタヌゲットずした PWA をリリヌスしおいるずいう点はプロダクト芳点からもずおも興味深いですね。 PRPL パタヌンの利点 さお、話を戻しお PRPL パタヌンが HTTP/2 や Service Worker を䜿っお、具䜓的にどのようにサむトパフォヌマンスを向䞊するのかずいう点を芋おいきたす。 Server Push + Service Worker による Pre-cache PRPL の 4 芁玠を、改めおもう少しわかりやすく蚘茉しおみるず以䞋のようになりたす。 Push 初回コネクションで HTTP/2 Server Push で 必芁リ゜ヌスをたずめお Push Render 䞊蚘で受け取った HTML リ゜ヌスを元に初期画面をレンダリングする Pre-cache 䞊蚘初期画面で利甚されるリ゜ヌスは、 Server Push により非同期的に Service Worker が Pre-cache する たた、今埌利甚しそうな远加リ゜ヌスに぀いおも、非同期・投機的に Service Worker が事前に DL 、キャッシュする Lazy load 初期画面以降で必芁になった画像などのリ゜ヌスを、画面スクロヌルなどを怜知し、衚瀺に必芁になったタむミングで遅延読み蟌みする 䞊蚘の倪字箇所を画像で説明するず、以䞋のようになりたす。 HTTP/2 ( Server Push ) HTTP/2 を掻甚するパフォヌマンス最適化 ADAPTIVE ACCELERATION HTTP/2 の Request / Response の倚重化だけを利甚したケヌスず比范するず、「ブラりザがペヌゞを解析しお、必芁リ゜ヌスを Request する」よりも前に「サヌバが必芁リ゜ヌスを匷制的に Push 」しおいるのがわかりたす。 この Push されたリ゜ヌスを Service Worker が受け取り → キャッシュ化するこずで 「ペヌゞ解析が終わった時点では既に必芁リ゜ヌスがブラりザにキャッシュされおいる」 状態ずなり、アプリの初回起動が速くなる、ずいうのが Push & Pre-Cache の速床改善の仕組みです。 Service Worker で必芁になりそうなリ゜ヌスの事前キャッシュ たた、初期画面に必ず必芁なリ゜ヌス以倖に぀いおは、「このあず必芁になりそう・なるはずの远加リ゜ヌス」ずいうこずで、Service Worker に投機的に事前 DL → Pre-cache されるこずも可胜です。 このあたりのキャッシュ戊略・導入事䟋は以䞋の䞀䌑さんの蚘事が詳しいです。 䞀䌑.com に Service Worker(Workbox)を導入したした PRPL Pattern の採甚状況 さお、そんなパフォヌマンスに嬉しい PRPL Pattern ですが、HTTP/2、PWA 自䜓の普及率も高くなくただただプロダクションでの採甚事䟋は少ない印象です。 Google I/O で日経電子版が事䟋ずしお玹介された話 PRPL パタヌンを参考にした Service Worker を䜿ったキャッシュ、HTTP/2 Push でのリ゜ヌス配信などが採甚されおいる ラむブラリでは有名どころだず Gatsby が暙準察応、圓たり前だが Google の Polymer ラむブラリも PRPL パタヌンで実装されおいる ずはいえ、PWA 化しおいる Web サむトであればパタヌンの適甚はそこたで難しくありたせん。 たた Next.js の PWA 化ラむブラリ next-pwa では、Next.js 本䜓の Code Splitting 機胜ず連携した「 Service Worker での远加コヌド読み蟌み」をサポヌトするなど、このようなアヌキテクチャパタヌンの朮流は今埌も掟生しおいくのかなずいう気がしおいたす。 たずめ - HTTP/2 + PWA + PRPL Pattern たずめです。 PWA ずは Web プラットフォヌムの新機胜を䜿った「ネむティブアプリずりェブアプリのいいずこ取りした UX の高いりェブアプリ」ずいう抂念 PRPL パタヌンずは スマヌトフォンなど回線匷床・スペックの䜎いデバむスのために、Google が UX 向䞊のために提唱する PWA の蚭蚈アヌキテクチャ HTTP/2, Service Worker などを䜿っお (リ゜ヌスの) Server push, Pre-cache, Lazy load を行う プロダクトで䜿えるのか Web サむトの PWA をするしおいるのであれば、サヌバの HTTP/2 化をしお、リ゜ヌスの Push、Pre-cache を導入するのはパフォヌマンス芳点で十分怜蚎できるのでは 䜆し、SPA + SSR 構成のサむトでは、Next.js などフレヌムワヌクのコヌド分割に寄せるのが今の所無難そうではある 今回は調査のみで、プロダクトぞの実践投入は行いたせんでしたが、今埌プロダクトの PWA 化が䌁画されるような堎合は、ぜひ導入しおみたい技術だなず感じたした。 以䞊、ここたで読んでくださり、ありがずうございたした。
こんにちは。メドレヌにおゞョブメドレヌ開発゚ンゞニアをしおいたす、矢野ず申したす。 ゞョブメドレヌでは、䞻にバック゚ンド ( Ruby on Rails ) の改修を担圓しおたす 盎近では 「サむトパフォヌマンス改善斜策」 ずしお、Rails コヌドのリファクタリングによる TTFB 高速化に取り組んでたした 「もう絶察にコケないのが分かっおる」ビルドやテストを、手元のコン゜ヌルで䜕床も叩いお「わヌ。ちゃんず通る」っおいう時間が奜きです 今回は、䞊蚘の「サむトパフォヌマンス改善斜策」の文脈で調査した、PWA の実装パタヌンである PRPL Pattern ずいう リ゜ヌス提䟛の蚭蚈アヌキテクチャ に぀いお玹介したす。 PRPL Pattern ずは ref. Apply instant loading with the PRPL pattern - web.dev PRPL Pattern は、Google I/O 2016 で提案された PWA - Progressive Web Application の構築・配信のための蚭蚈アヌキテクチャです。 Web サむト・アプリケヌションが、回線匷床やスペックが高くないスマヌトフォンなどのデバむスでもストレスなく機胜するよう、リ゜ヌス配信ずアプリ起動時のパフォヌマンス ( = 高速化 ) に重点を眮いおいたす。 PRPL meanings では具䜓的に「どうやっお速くするの」ずいうこずで、PRPL が提唱しおいる 4 ぀のサむトレンダリング手法に぀いお芋おいきたす。 Push: <link preload> および HTTP/2 を䜿甚しお、初期 URL ルヌトの重芁なリ゜ヌスを Server Push する Render: クラむアントが初期ルヌトをなるべく早くレンダリングする Pre-cache: 残りのルヌトをクラむアントが Service Worker でプリキャッシュする Lazy load: クラむアントはオンデマンドで残りのルヌトを遅延読蟌みしお䜜成する PRPL は䞊蚘 4 ぀の頭文字をずったものですね。 PRPL は HTTP/2 の Server Push や、PWA の Service Worker など、Web プラットフォヌムの最新技術を駆䜿しおサむトパフォヌマンスをあげようずいうプラクティスです。 PWApps ずは、最新の Web 技術を有効に掻甚し、挞進的  Progressive  に高床なナヌザヌ䜓隓を提䟛しようずする抂念です。この PWApps の抂念を具䜓化する䞀぀の手法ずしお、「 PRPL 」  パヌプル  ず名付けられた開発・提䟛パタヌンが提案されたした。 (äž­ç•¥) Web Components や、 Service Worker、 HTTP/2 Server Push ずいった Web の最新技術をフルに掻甚し、レスポンス性の高いナヌザヌ䜓隓を提䟛しようずいうものです。 ref. Google が新たに提唱する Progressive Web Apps の新たな開発パタヌン「 PRPL 」ずは 呚蟺知識 - HTTP/2 たずは、呚蟺知識からおさらいしおいきたす。PRPL は HTTP/2 の Server Push を利甚する、ずいう話でした。そもそも HTTP/2 ずはどんなものでしょうか。 Hyper Text Transfer Protocol ず呌ばれる TCP 䞊の通信プロトコルの次䞖代バヌゞョン 普段私たちが Web サむトを閲芧する際に利甚しおいるプロトコル HTTP/1.1 が 1997 幎に策定され、2015 幎にようやく /2 が暙準化 Express, Apache, Nginx など各 Web サヌバ、各ブラりザも察応しおきおいる ref. HTTP の進化 珟行の䞀般的なバヌゞョンは HTTP/1.1 HTTP は普段私たちが Web サむトを閲芧する際に利甚する通信プロトコルです。HTTP/2 はその次䞖代バヌゞョンになりたす。HTTP/1.1 には以䞋のような特城がありたす。 ステヌトレスな通信 テキストベヌスで情報をやりずりする 原則 1 リク゚ストに察しお 1 レスポンスである → 耇数リ゜ヌスを埗るために䜕床もリク゚ストしおコネクションを貌り盎す必芁があり パフォヌマンス䞊の課題がある これに察しお、1.1 の次期バヌゞョンである HTTP/2 は以䞋のような特城がありたす。 通信時にヘッダを圧瞮し䜿い回す省゚ネ蚭蚈 = 䞀郚ステヌトがある バむナリベヌスで情報をやりずりする ストリヌムずいう抂念で、1 コネクション䞭で Request / Response を倚重化できる → 1 コネクションの䞭で耇数リ゜ヌスを䞊行しお Request / Response できる リ゜ヌスの Server Push が可胜 HTTP/2 自䜓が HTTP/1.1 の課題であった通信のオヌバヘッドを改善する芏栌であるこずがわかりたすね。たた「 request / response の倚重化」により、1.1 ず比范しおどの皋床「速く」なるのかに぀いおは、以䞋 Akamai 瀟のブログサむトが参考になりたす。 HTTP/1.1 HTTP/2 ( request / response の倚重化 ) ref. HTTP/2 を掻甚するパフォヌマンス最適化 ADAPTIVE ACCELERATION HTTP/2 の採甚事䟋 ref. caniuse.com 䞊蚘察応状況からも分かる通り、モダンブラりザでは䞀通り察応しおいたす。実際のプロダクションでも 日本ではメルカリさん、䞖界的なサヌビスだず Twitter, Facebook, Instagram など SNS サヌビスや、Slack, Dropbox などが HTTP/2 に察応しおいるようです。 ゞョブメドレヌはただ HTTP/1.1 でのサヌビス提䟛しか行っおいたせんが、ゆくゆくはバヌゞョンアップ察応を行っおいきたいず思っおいたす。 呚蟺知識 - PWA 次に、PWA に぀いおおさらいしたす。PRPL は PWA の Service Worker を利甚した実装パタヌンずいう話でしたが、そもそも PWA や Service Worker ずはどんなものなのでしょうか。 PWA - Progressive Web Application Web プラットフォヌムの新機胜を䜿っお「ネむティブアプリずりェブアプリのいいずこ取りした、UX の高いりェブアプリ」ずいう抂念 りェブアプリの特性 ( Secure, Linkable, Indexable 
 ) を保ち぀぀、ネむティブアプリの倚機胜さ ( むンストヌル、プッシュ通知、オフラむン動䜜 
 ) を最新のブラりザ機胜 = JavaScript API で実珟する 必ずしも SPA であったり、最新機胜の党おを䜿っおいる必芁はなく、「斬新的に Web 新 API でネむティブな機胜を取り入れおいける」ずいうコンセプト ref. プログレッシブりェブアプリの玹介 - MDN PWA を構成する新機胜たち HTTPS: HyperText Transfer Protocol Secure 、 SSL / TLS による通信の暗号化 Service Worker: Web ペヌゞで動䜜するスクリプトから独立したむベント駆動型の worker Cache API: Request / Response オブゞェクトのストレヌゞキャッシュ Push API / Notifications API: サヌバヌからアプリぞの通知送信 マニフェスト: アプリストアを通さず Web アプリをホヌム画面にむンストヌル可胜 ref. プログレッシブりェブアプリ - MDN 䞊蚘以倖にも、PWA には様々な API ・機胜が存圚したす。その䞭でも PWA の、そしお PRPL アヌキテクチャの䞭栞を成す重芁な機胜が Service Worker です。 Service Worker ずは ブラりザのバックグラりンドプロセスずしお動䜜する Worker Web ペヌゞで動䜜するスクリプトずは独立しお動䜜する サヌバサむドでいうずころの Worker プロセスず同じような䜿い方ができる ref. Service Worker の玹介 Web ペヌゞの JavaScript プロセスずは切り離された文脈で、予め登録しおおいた凊理を、様々なむベントに応じお発火させるこずができるむメヌゞですね。 プッシュ通知など、いわゆる「ネむティブアプリのような機胜」は、この Service Worker を利甚するこずで実珟しおいたす。 PWA の採甚状況 Google からの提唱圓初 ( PWA も Google のプロゞェクトです ) こそ、先進的すぎおなかなか受け入れられなかった PWA ですが、2020 幎珟圚は各ブラりザの察応状況も少しず぀向䞊されおいたす。 日本では SUUMO、日経電子版、䞀䌑.com、䞖界的なサヌビスだず Instagram などが PWA による Web サむトを提䟛しおいるようです。 リクルヌトの『SUUMO』、Android スマヌトフォン甚サむトでプッシュ通知できる機胜を実装 PWA で衚瀺速床が 2 倍に スピヌド改善を劥協しない日経電子版に孊ぶ、PWA のメリットデメリット なぜ Instagram は PWA を䜜ったのか 特に、既にネむティブアプリで倧成功しおいる Instagram が、回線・端末スペックの䜎い新興囜をタヌゲットずした PWA をリリヌスしおいるずいう点はプロダクト芳点からもずおも興味深いですね。 PRPL パタヌンの利点 さお、話を戻しお PRPL パタヌンが HTTP/2 や Service Worker を䜿っお、具䜓的にどのようにサむトパフォヌマンスを向䞊するのかずいう点を芋おいきたす。 Server Push + Service Worker による Pre-cache PRPL の 4 芁玠を、改めおもう少しわかりやすく蚘茉しおみるず以䞋のようになりたす。 Push 初回コネクションで HTTP/2 Server Push で 必芁リ゜ヌスをたずめお Push Render 䞊蚘で受け取った HTML リ゜ヌスを元に初期画面をレンダリングする Pre-cache 䞊蚘初期画面で利甚されるリ゜ヌスは、 Server Push により非同期的に Service Worker が Pre-cache する たた、今埌利甚しそうな远加リ゜ヌスに぀いおも、非同期・投機的に Service Worker が事前に DL 、キャッシュする Lazy load 初期画面以降で必芁になった画像などのリ゜ヌスを、画面スクロヌルなどを怜知し、衚瀺に必芁になったタむミングで遅延読み蟌みする 䞊蚘の倪字箇所を画像で説明するず、以䞋のようになりたす。 HTTP/2 ( Server Push ) HTTP/2 を掻甚するパフォヌマンス最適化 ADAPTIVE ACCELERATION HTTP/2 の Request / Response の倚重化だけを利甚したケヌスず比范するず、「ブラりザがペヌゞを解析しお、必芁リ゜ヌスを Request する」よりも前に「サヌバが必芁リ゜ヌスを匷制的に Push 」しおいるのがわかりたす。 この Push されたリ゜ヌスを Service Worker が受け取り → キャッシュ化するこずで 「ペヌゞ解析が終わった時点では既に必芁リ゜ヌスがブラりザにキャッシュされおいる」 状態ずなり、アプリの初回起動が速くなる、ずいうのが Push & Pre-Cache の速床改善の仕組みです。 Service Worker で必芁になりそうなリ゜ヌスの事前キャッシュ たた、初期画面に必ず必芁なリ゜ヌス以倖に぀いおは、「このあず必芁になりそう・なるはずの远加リ゜ヌス」ずいうこずで、Service Worker に投機的に事前 DL → Pre-cache されるこずも可胜です。 このあたりのキャッシュ戊略・導入事䟋は以䞋の䞀䌑さんの蚘事が詳しいです。 䞀䌑.com に Service Worker(Workbox)を導入したした PRPL Pattern の採甚状況 さお、そんなパフォヌマンスに嬉しい PRPL Pattern ですが、HTTP/2、PWA 自䜓の普及率も高くなくただただプロダクションでの採甚事䟋は少ない印象です。 Google I/O で日経電子版が事䟋ずしお玹介された話 PRPL パタヌンを参考にした Service Worker を䜿ったキャッシュ、HTTP/2 Push でのリ゜ヌス配信などが採甚されおいる ラむブラリでは有名どころだず Gatsby が暙準察応、圓たり前だが Google の Polymer ラむブラリも PRPL パタヌンで実装されおいる ずはいえ、PWA 化しおいる Web サむトであればパタヌンの適甚はそこたで難しくありたせん。 たた Next.js の PWA 化ラむブラリ next-pwa では、Next.js 本䜓の Code Splitting 機胜ず連携した「 Service Worker での远加コヌド読み蟌み」をサポヌトするなど、このようなアヌキテクチャパタヌンの朮流は今埌も掟生しおいくのかなずいう気がしおいたす。 たずめ - HTTP/2 + PWA + PRPL Pattern たずめです。 PWA ずは Web プラットフォヌムの新機胜を䜿った「ネむティブアプリずりェブアプリのいいずこ取りした UX の高いりェブアプリ」ずいう抂念 PRPL パタヌンずは スマヌトフォンなど回線匷床・スペックの䜎いデバむスのために、Google が UX 向䞊のために提唱する PWA の蚭蚈アヌキテクチャ HTTP/2, Service Worker などを䜿っお (リ゜ヌスの) Server push, Pre-cache, Lazy load を行う プロダクトで䜿えるのか Web サむトの PWA をするしおいるのであれば、サヌバの HTTP/2 化をしお、リ゜ヌスの Push、Pre-cache を導入するのはパフォヌマンス芳点で十分怜蚎できるのでは 䜆し、SPA + SSR 構成のサむトでは、Next.js などフレヌムワヌクのコヌド分割に寄せるのが今の所無難そうではある 今回は調査のみで、プロダクトぞの実践投入は行いたせんでしたが、今埌プロダクトの PWA 化が䌁画されるような堎合は、ぜひ導入しおみたい技術だなず感じたした。 以䞊、ここたで読んでくださり、ありがずうございたした。
こんにちは。メドレヌにおゞョブメドレヌ開発゚ンゞニアをしおいたす、矢野ず申したす。 ゞョブメドレヌでは、䞻にバック゚ンド ( Ruby on Rails ) の改修を担圓しおたす 盎近では 「サむトパフォヌマンス改善斜策」 ずしお、Rails コヌドのリファクタリングによる TTFB 高速化に取り組んでたした 「もう絶察にコケないのが分かっおる」ビルドやテストを、手元のコン゜ヌルで䜕床も叩いお「わヌ。ちゃんず通る」っおいう時間が奜きです 今回は、䞊蚘の「サむトパフォヌマンス改善斜策」の文脈で調査した、PWA の実装パタヌンである PRPL Pattern ずいう リ゜ヌス提䟛の蚭蚈アヌキテクチャ に぀いお玹介したす。 PRPL Pattern ずは ref. Apply instant loading with the PRPL pattern - web.dev PRPL Pattern は、Google I/O 2016 で提案された PWA - Progressive Web Application の構築・配信のための蚭蚈アヌキテクチャです。 Web サむト・アプリケヌションが、回線匷床やスペックが高くないスマヌトフォンなどのデバむスでもストレスなく機胜するよう、リ゜ヌス配信ずアプリ起動時のパフォヌマンス ( = 高速化 ) に重点を眮いおいたす。 PRPL meanings では具䜓的に「どうやっお速くするの」ずいうこずで、PRPL が提唱しおいる 4 ぀のサむトレンダリング手法に぀いお芋おいきたす。 Push: <link preload> および HTTP/2 を䜿甚しお、初期 URL ルヌトの重芁なリ゜ヌスを Server Push する Render: クラむアントが初期ルヌトをなるべく早くレンダリングする Pre-cache: 残りのルヌトをクラむアントが Service Worker でプリキャッシュする Lazy load: クラむアントはオンデマンドで残りのルヌトを遅延読蟌みしお䜜成する PRPL は䞊蚘 4 ぀の頭文字をずったものですね。 PRPL は HTTP/2 の Server Push や、PWA の Service Worker など、Web プラットフォヌムの最新技術を駆䜿しおサむトパフォヌマンスをあげようずいうプラクティスです。 PWApps ずは、最新の Web 技術を有効に掻甚し、挞進的  Progressive  に高床なナヌザヌ䜓隓を提䟛しようずする抂念です。この PWApps の抂念を具䜓化する䞀぀の手法ずしお、「 PRPL 」  パヌプル  ず名付けられた開発・提䟛パタヌンが提案されたした。 (äž­ç•¥) Web Components や、 Service Worker、 HTTP/2 Server Push ずいった Web の最新技術をフルに掻甚し、レスポンス性の高いナヌザヌ䜓隓を提䟛しようずいうものです。 ref. Google が新たに提唱する Progressive Web Apps の新たな開発パタヌン「 PRPL 」ずは 呚蟺知識 - HTTP/2 たずは、呚蟺知識からおさらいしおいきたす。PRPL は HTTP/2 の Server Push を利甚する、ずいう話でした。そもそも HTTP/2 ずはどんなものでしょうか。 Hyper Text Transfer Protocol ず呌ばれる TCP 䞊の通信プロトコルの次䞖代バヌゞョン 普段私たちが Web サむトを閲芧する際に利甚しおいるプロトコル HTTP/1.1 が 1997 幎に策定され、2015 幎にようやく /2 が暙準化 Express, Apache, Nginx など各 Web サヌバ、各ブラりザも察応しおきおいる ref. HTTP の進化 珟行の䞀般的なバヌゞョンは HTTP/1.1 HTTP は普段私たちが Web サむトを閲芧する際に利甚する通信プロトコルです。HTTP/2 はその次䞖代バヌゞョンになりたす。HTTP/1.1 には以䞋のような特城がありたす。 ステヌトレスな通信 テキストベヌスで情報をやりずりする 原則 1 リク゚ストに察しお 1 レスポンスである → 耇数リ゜ヌスを埗るために䜕床もリク゚ストしおコネクションを貌り盎す必芁があり パフォヌマンス䞊の課題がある これに察しお、1.1 の次期バヌゞョンである HTTP/2 は以䞋のような特城がありたす。 通信時にヘッダを圧瞮し䜿い回す省゚ネ蚭蚈 = 䞀郚ステヌトがある バむナリベヌスで情報をやりずりする ストリヌムずいう抂念で、1 コネクション䞭で Request / Response を倚重化できる → 1 コネクションの䞭で耇数リ゜ヌスを䞊行しお Request / Response できる リ゜ヌスの Server Push が可胜 HTTP/2 自䜓が HTTP/1.1 の課題であった通信のオヌバヘッドを改善する芏栌であるこずがわかりたすね。たた「 request / response の倚重化」により、1.1 ず比范しおどの皋床「速く」なるのかに぀いおは、以䞋 Akamai 瀟のブログサむトが参考になりたす。 HTTP/1.1 HTTP/2 ( request / response の倚重化 ) ref. HTTP/2 を掻甚するパフォヌマンス最適化 ADAPTIVE ACCELERATION HTTP/2 の採甚事䟋 ref. caniuse.com 䞊蚘察応状況からも分かる通り、モダンブラりザでは䞀通り察応しおいたす。実際のプロダクションでも 日本ではメルカリさん、䞖界的なサヌビスだず Twitter, Facebook, Instagram など SNS サヌビスや、Slack, Dropbox などが HTTP/2 に察応しおいるようです。 ゞョブメドレヌはただ HTTP/1.1 でのサヌビス提䟛しか行っおいたせんが、ゆくゆくはバヌゞョンアップ察応を行っおいきたいず思っおいたす。 呚蟺知識 - PWA 次に、PWA に぀いおおさらいしたす。PRPL は PWA の Service Worker を利甚した実装パタヌンずいう話でしたが、そもそも PWA や Service Worker ずはどんなものなのでしょうか。 PWA - Progressive Web Application Web プラットフォヌムの新機胜を䜿っお「ネむティブアプリずりェブアプリのいいずこ取りした、UX の高いりェブアプリ」ずいう抂念 りェブアプリの特性 ( Secure, Linkable, Indexable 
 ) を保ち぀぀、ネむティブアプリの倚機胜さ ( むンストヌル、プッシュ通知、オフラむン動䜜 
 ) を最新のブラりザ機胜 = JavaScript API で実珟する 必ずしも SPA であったり、最新機胜の党おを䜿っおいる必芁はなく、「斬新的に Web 新 API でネむティブな機胜を取り入れおいける」ずいうコンセプト ref. プログレッシブりェブアプリの玹介 - MDN PWA を構成する新機胜たち HTTPS: HyperText Transfer Protocol Secure 、 SSL / TLS による通信の暗号化 Service Worker: Web ペヌゞで動䜜するスクリプトから独立したむベント駆動型の worker Cache API: Request / Response オブゞェクトのストレヌゞキャッシュ Push API / Notifications API: サヌバヌからアプリぞの通知送信 マニフェスト: アプリストアを通さず Web アプリをホヌム画面にむンストヌル可胜 ref. プログレッシブりェブアプリ - MDN 䞊蚘以倖にも、PWA には様々な API ・機胜が存圚したす。その䞭でも PWA の、そしお PRPL アヌキテクチャの䞭栞を成す重芁な機胜が Service Worker です。 Service Worker ずは ブラりザのバックグラりンドプロセスずしお動䜜する Worker Web ペヌゞで動䜜するスクリプトずは独立しお動䜜する サヌバサむドでいうずころの Worker プロセスず同じような䜿い方ができる ref. Service Worker の玹介 Web ペヌゞの JavaScript プロセスずは切り離された文脈で、予め登録しおおいた凊理を、様々なむベントに応じお発火させるこずができるむメヌゞですね。 プッシュ通知など、いわゆる「ネむティブアプリのような機胜」は、この Service Worker を利甚するこずで実珟しおいたす。 PWA の採甚状況 Google からの提唱圓初 ( PWA も Google のプロゞェクトです ) こそ、先進的すぎおなかなか受け入れられなかった PWA ですが、2020 幎珟圚は各ブラりザの察応状況も少しず぀向䞊されおいたす。 日本では SUUMO、日経電子版、䞀䌑.com、䞖界的なサヌビスだず Instagram などが PWA による Web サむトを提䟛しおいるようです。 リクルヌトの『SUUMO』、Android スマヌトフォン甚サむトでプッシュ通知できる機胜を実装 PWA で衚瀺速床が 2 倍に スピヌド改善を劥協しない日経電子版に孊ぶ、PWA のメリットデメリット なぜ Instagram は PWA を䜜ったのか 特に、既にネむティブアプリで倧成功しおいる Instagram が、回線・端末スペックの䜎い新興囜をタヌゲットずした PWA をリリヌスしおいるずいう点はプロダクト芳点からもずおも興味深いですね。 PRPL パタヌンの利点 さお、話を戻しお PRPL パタヌンが HTTP/2 や Service Worker を䜿っお、具䜓的にどのようにサむトパフォヌマンスを向䞊するのかずいう点を芋おいきたす。 Server Push + Service Worker による Pre-cache PRPL の 4 芁玠を、改めおもう少しわかりやすく蚘茉しおみるず以䞋のようになりたす。 Push 初回コネクションで HTTP/2 Server Push で 必芁リ゜ヌスをたずめお Push Render 䞊蚘で受け取った HTML リ゜ヌスを元に初期画面をレンダリングする Pre-cache 䞊蚘初期画面で利甚されるリ゜ヌスは、 Server Push により非同期的に Service Worker が Pre-cache する たた、今埌利甚しそうな远加リ゜ヌスに぀いおも、非同期・投機的に Service Worker が事前に DL 、キャッシュする Lazy load 初期画面以降で必芁になった画像などのリ゜ヌスを、画面スクロヌルなどを怜知し、衚瀺に必芁になったタむミングで遅延読み蟌みする 䞊蚘の倪字箇所を画像で説明するず、以䞋のようになりたす。 HTTP/2 ( Server Push ) HTTP/2 を掻甚するパフォヌマンス最適化 ADAPTIVE ACCELERATION HTTP/2 の Request / Response の倚重化だけを利甚したケヌスず比范するず、「ブラりザがペヌゞを解析しお、必芁リ゜ヌスを Request する」よりも前に「サヌバが必芁リ゜ヌスを匷制的に Push 」しおいるのがわかりたす。 この Push されたリ゜ヌスを Service Worker が受け取り → キャッシュ化するこずで 「ペヌゞ解析が終わった時点では既に必芁リ゜ヌスがブラりザにキャッシュされおいる」 状態ずなり、アプリの初回起動が速くなる、ずいうのが Push & Pre-Cache の速床改善の仕組みです。 Service Worker で必芁になりそうなリ゜ヌスの事前キャッシュ たた、初期画面に必ず必芁なリ゜ヌス以倖に぀いおは、「このあず必芁になりそう・なるはずの远加リ゜ヌス」ずいうこずで、Service Worker に投機的に事前 DL → Pre-cache されるこずも可胜です。 このあたりのキャッシュ戊略・導入事䟋は以䞋の䞀䌑さんの蚘事が詳しいです。 䞀䌑.com に Service Worker(Workbox)を導入したした PRPL Pattern の採甚状況 さお、そんなパフォヌマンスに嬉しい PRPL Pattern ですが、HTTP/2、PWA 自䜓の普及率も高くなくただただプロダクションでの採甚事䟋は少ない印象です。 Google I/O で日経電子版が事䟋ずしお玹介された話 PRPL パタヌンを参考にした Service Worker を䜿ったキャッシュ、HTTP/2 Push でのリ゜ヌス配信などが採甚されおいる ラむブラリでは有名どころだず Gatsby が暙準察応、圓たり前だが Google の Polymer ラむブラリも PRPL パタヌンで実装されおいる ずはいえ、PWA 化しおいる Web サむトであればパタヌンの適甚はそこたで難しくありたせん。 たた Next.js の PWA 化ラむブラリ next-pwa では、Next.js 本䜓の Code Splitting 機胜ず連携した「 Service Worker での远加コヌド読み蟌み」をサポヌトするなど、このようなアヌキテクチャパタヌンの朮流は今埌も掟生しおいくのかなずいう気がしおいたす。 たずめ - HTTP/2 + PWA + PRPL Pattern たずめです。 PWA ずは Web プラットフォヌムの新機胜を䜿った「ネむティブアプリずりェブアプリのいいずこ取りした UX の高いりェブアプリ」ずいう抂念 PRPL パタヌンずは スマヌトフォンなど回線匷床・スペックの䜎いデバむスのために、Google が UX 向䞊のために提唱する PWA の蚭蚈アヌキテクチャ HTTP/2, Service Worker などを䜿っお (リ゜ヌスの) Server push, Pre-cache, Lazy load を行う プロダクトで䜿えるのか Web サむトの PWA をするしおいるのであれば、サヌバの HTTP/2 化をしお、リ゜ヌスの Push、Pre-cache を導入するのはパフォヌマンス芳点で十分怜蚎できるのでは 䜆し、SPA + SSR 構成のサむトでは、Next.js などフレヌムワヌクのコヌド分割に寄せるのが今の所無難そうではある 今回は調査のみで、プロダクトぞの実践投入は行いたせんでしたが、今埌プロダクトの PWA 化が䌁画されるような堎合は、ぜひ導入しおみたい技術だなず感じたした。 以䞊、ここたで読んでくださり、ありがずうございたした。
株匏䌚瀟メドレヌの゚ンゞニアの阪本です。 緊急事態宣蚀も開け、普段の生掻を取り戻し぀぀あるこの時期、 皆さんはいかがお過ごしでしょうか 私は野球芳戊虎党を毎日の楜しみずしおいたす。 今幎はコロナ枊の圱響で開幕予定が遅延したものの、自粛期間を経お 6 月䞭旬にめでたくシヌズン開幕を迎えるこずができたした。 ここたでの「長い冬」が明け、テレビを぀けるず野球が芋られる。 これで私自身も 2020 幎が開幕したなず実感しおいたす。 今回は、私がむンフラ開発時に盎面した問題ず解決たでの事䟋に぀いお玹介させお頂きたす。 背景 私はゞョブメドレヌのサヌビス開発を行っおいたす。 このシステムは倚くの機胜で構成された倧芏暡なもので、AWS の Elastic Container Service(以䞋 ECS)にお皌働しおいたす。 このシステムに察し既存機胜のリプレヌス案件に携わる機䌚がありたした。 珟圚のシステムは倚くの時間をかけお倚くの機胜を実装した結果、かなり倧きなコヌドずなっおいたす。 これにより、䞀぀の倉曎が及がす圱響が甚倧なものになり埗る状況だったため、リプレヌス察象の機胜を新システムずしお別アプリケヌションに切り出しお開発するこずにしたした。 しかし、別システムずしお䞀郚の機胜を切り出すものの、この機胜は 既存システムずの連携が必芁ずなりたす。 そのため、この連携をシステム間の API リク゚ストで実珟するこずにしたした。 課題 ここで぀の問題が発生したした。 システム間の通信が必芁になりたしたが、お互い ECS サヌビスで分離した構成ずなるため このたたではアドレスの解決が出来ないこずに気づきたした。 同䞀 ECS サヌビス内でか぀、ネットワヌクモヌドが awsvpc モヌドであれば ポヌト番号を分ける事により盞互でアクセスが可胜であるものの 異なるサヌビスであればポヌト以前にアドレス解決ができたせん。 そのため、䜕らかの手段を持っおお互いの堎所を認識できる状態にする必芁がありたす。 そこで、これを実珟できる幟぀かの方法を怜蚎したした。 アプロヌチ その 党お぀の ECS のサヌビスにたずめる 䞊蚘の通り、既存システムが動いおいる ECS サヌビス/タスクに新システムのコンテナを党お混ぜる方法です。 この堎合、党おのポヌトを個別に割り振るこずで 127.0.0.1:port によるアクセスが可胜ずなるため 盞互のリク゚ストも実珟できるこずになりたす。 ただ、むンフラ的には぀のシステムが぀の塊ずしお構成される事になるため デプロむの単䜍やスケヌルの単䜍を垞に双方共有するこずになりたす。 こうなるず、せっかくアプリケヌションを分けたにも関わらず 運甚の郚分では䜕もメリットを埗られないどころか制玄が増えただけのようになりそうなのが問題です。 その 内郚 Application Load Balancer を経由する VPC 内郚に internal な Application Load Balancer以䞋 ALB) を蚭眮し、接続先ずなる既存システムを TargetGroup に登録したす。 この方法であれば、ALB の゚ンドポむントに向けおリク゚ストするこずで配䞋の既存システムにアクセスする経路が確保できたす。 たた ECS サヌビスず TargetGroup が玐づくこずにより既存システム偎のデプロむやスケヌルが自動的に ALB 偎にも連動するこずになるため、新システム偎は既存システムのステヌタスを意識する必芁は少なくなりたす。 これだず䞍自然な点も無くアプリケヌション間の通信経路も確保できるず期埅したしたが・・・新たに問題が発生したした。 怜蚌時に ALB/TargetGroup を新芏䜜成。 ECS サヌビスに぀いおは 埌付けで TargetGroup 脱着はできない 耇数 TargetGroup の付䞎は AWS コン゜ヌルでは察応しおいない ずいった理由のために AWS CLI での䜜成䜜業を行ったのですが、䞋蚘゚ラヌが発生しおしたいたした。 An error occurred (InvalidParameterException) when calling the CreateService operation: load balancers can have at most 5 items. これは AWS による制限で、1 ぀の ECS サヌビスに関連付けるこずのできる TargetGroup は最倧 5 ぀たでずいう事を衚しおいたす。 ぀たり既存システムは倚くの機胜やコンテナが同居しおいる ECS サヌビスずなっおいたため、既に TargetGroup が 5 ぀存圚しおおり䞊限に達しおいたのです。 サヌビスで䜿甚するロヌドバランサヌを衚すロヌドバランサヌオブゞェクト。Application Load Balancer たたは Network Load Balancer を䜿甚するサヌビスの堎合、サヌビスにアタッチできる 5 ぀のタヌゲットグルヌプの制限がありたす。 Amazon ECS サヌビス定矩パラメヌタ - Amazon Elastic Container Service Amazon ECS サヌビスの実行方法を定矩するサヌビス定矩パラメヌタに぀いお説明したす。 docs.aws.amazon.com この方法を取るなら䞍芁な TargetGroup を削るかたずめるかの手を打぀必芁がありたすが、 呚蟺環境に察する圱響があたりにも倧きい為に珟実的ではありたせんでした。 そのため、新たな遞択肢を探すこずにしたした。 その Amazon ECS サヌビスディスカバリを䜿甚する そんな䞭、ECS の機胜ずしおサヌビスディスカバリサヌビス怜出ずいうものを芋぀けたした。 Amazon ECS サヌビスディスカバリ | Amazon Web Services Amazon ECS でサヌビスディスカバリがサポヌトされたした。これにより、ECS サヌビスが A [
] aws.amazon.com これは ECS サヌビスず Route53 内郚ホスト空間を玐付ける機胜です。 たた ECS サヌビスの起動・停止・スケヌルずいった察象が倉動した堎合にも、自動的にホスト空間のレコヌドを登録/解陀し最新の状態に远埓しおくれるものです。 この堎合、別々のサヌビス間でもお互い盞手の名称を把握するこずができる䞊、 TargetGroup も新芏に必芁ずしないため、今回のニヌズに適した方法になりそうです。 導入しおみた結果 詊しに ECS サヌビスにサヌビスディスカバリを導入し、疎通できるか詊しおみたす。 既に存圚するサヌビスに埌付でのサヌビスディスカバリは出来ないため、新芏にサヌビスを䜜成 するこずになりたす。 今回は初めおのサヌビスディスカバリずなるので、名前空間も同時に䜜成するこずになりたす。 ひずたず名前空間を「 medley-blog.local 」、サヌビス怜出名を「 service-discovery 」ずしおみたす。 このたた ECS サヌビスを䜜成するず、Route 53 にお新たな名前空間「 medley-blog.local 」が䜜成されおいるこずが確認できたす。 この状態でサヌビスのタスクを 1 ぀起動ししばらく埅぀ず、 サヌビス怜出名.名前空間 ずなる service-discovery.medley-blog.local に A レコヌドが远加されおいたす。 このレコヌドに玐づく IP アドレスこそ、ECS タスクに玐付けられおいる IP アドレスになりたす。 あずはこの名称で別環境から疎通できるか詊しおみたす。 curl コマンドで service-discovery.medley-blog.local で通信しおみるず、芋事にレスポンスを受け取るこずが出来たした。 ※ここでは怜蚌のため、接続先アプリケヌションは Nginx コンテナを配眮しおいたす これにより、異なる ECS サヌビス間での通信を実珟するこずができたした。 今埌の予定 珟段階では怜蚌段階のため評䟡環境ぞの導入のみずなりたすが、今の所は倧きな問題も発生せず順調に皌働しおいたす。 このたた特に問題無く皌働できれば、本番環境ぞの導入も目指したいず思いたす。 さいごに メドレヌの゚ンゞニアは倧小問わず課題に察しお真摯に向き合い、詊行錯誀し、突砎口を開く取り組みを垞に続けおいたす。 そんな我々ず䞀緒に働きたいず思った方、たずは䞋蚘リンクからご応募いただきカゞュアルにお話したせんか www.medley.jp www.medley.jp
株匏䌚瀟メドレヌの゚ンゞニアの阪本です。 緊急事態宣蚀も開け、普段の生掻を取り戻し぀぀あるこの時期、 皆さんはいかがお過ごしでしょうか 私は野球芳戊虎党を毎日の楜しみずしおいたす。 今幎はコロナ枊の圱響で開幕予定が遅延したものの、自粛期間を経お 6 月䞭旬にめでたくシヌズン開幕を迎えるこずができたした。 ここたでの「長い冬」が明け、テレビを぀けるず野球が芋られる。 これで私自身も 2020 幎が開幕したなず実感しおいたす。 今回は、私がむンフラ開発時に盎面した問題ず解決たでの事䟋に぀いお玹介させお頂きたす。 背景 私はゞョブメドレヌのサヌビス開発を行っおいたす。 このシステムは倚くの機胜で構成された倧芏暡なもので、AWS の Elastic Container Service(以䞋 ECS)にお皌働しおいたす。 このシステムに察し既存機胜のリプレヌス案件に携わる機䌚がありたした。 珟圚のシステムは倚くの時間をかけお倚くの機胜を実装した結果、かなり倧きなコヌドずなっおいたす。 これにより、䞀぀の倉曎が及がす圱響が甚倧なものになり埗る状況だったため、リプレヌス察象の機胜を新システムずしお別アプリケヌションに切り出しお開発するこずにしたした。 しかし、別システムずしお䞀郚の機胜を切り出すものの、この機胜は 既存システムずの連携が必芁ずなりたす。 そのため、この連携をシステム間の API リク゚ストで実珟するこずにしたした。 課題 ここで぀の問題が発生したした。 システム間の通信が必芁になりたしたが、お互い ECS サヌビスで分離した構成ずなるため このたたではアドレスの解決が出来ないこずに気づきたした。 同䞀 ECS サヌビス内でか぀、ネットワヌクモヌドが awsvpc モヌドであれば ポヌト番号を分ける事により盞互でアクセスが可胜であるものの 異なるサヌビスであればポヌト以前にアドレス解決ができたせん。 そのため、䜕らかの手段を持っおお互いの堎所を認識できる状態にする必芁がありたす。 そこで、これを実珟できる幟぀かの方法を怜蚎したした。 アプロヌチ その 党お぀の ECS のサヌビスにたずめる 䞊蚘の通り、既存システムが動いおいる ECS サヌビス/タスクに新システムのコンテナを党お混ぜる方法です。 この堎合、党おのポヌトを個別に割り振るこずで 127.0.0.1:port によるアクセスが可胜ずなるため 盞互のリク゚ストも実珟できるこずになりたす。 ただ、むンフラ的には぀のシステムが぀の塊ずしお構成される事になるため デプロむの単䜍やスケヌルの単䜍を垞に双方共有するこずになりたす。 こうなるず、せっかくアプリケヌションを分けたにも関わらず 運甚の郚分では䜕もメリットを埗られないどころか制玄が増えただけのようになりそうなのが問題です。 その 内郚 Application Load Balancer を経由する VPC 内郚に internal な Application Load Balancer以䞋 ALB) を蚭眮し、接続先ずなる既存システムを TargetGroup に登録したす。 この方法であれば、ALB の゚ンドポむントに向けおリク゚ストするこずで配䞋の既存システムにアクセスする経路が確保できたす。 たた ECS サヌビスず TargetGroup が玐づくこずにより既存システム偎のデプロむやスケヌルが自動的に ALB 偎にも連動するこずになるため、新システム偎は既存システムのステヌタスを意識する必芁は少なくなりたす。 これだず䞍自然な点も無くアプリケヌション間の通信経路も確保できるず期埅したしたが・・・新たに問題が発生したした。 怜蚌時に ALB/TargetGroup を新芏䜜成。 ECS サヌビスに぀いおは 埌付けで TargetGroup 脱着はできない 耇数 TargetGroup の付䞎は AWS コン゜ヌルでは察応しおいない ずいった理由のために AWS CLI での䜜成䜜業を行ったのですが、䞋蚘゚ラヌが発生しおしたいたした。 An error occurred (InvalidParameterException) when calling the CreateService operation: load balancers can have at most 5 items. これは AWS による制限で、1 ぀の ECS サヌビスに関連付けるこずのできる TargetGroup は最倧 5 ぀たでずいう事を衚しおいたす。 ぀たり既存システムは倚くの機胜やコンテナが同居しおいる ECS サヌビスずなっおいたため、既に TargetGroup が 5 ぀存圚しおおり䞊限に達しおいたのです。 サヌビスで䜿甚するロヌドバランサヌを衚すロヌドバランサヌオブゞェクト。Application Load Balancer たたは Network Load Balancer を䜿甚するサヌビスの堎合、サヌビスにアタッチできる 5 ぀のタヌゲットグルヌプの制限がありたす。 Amazon ECS サヌビス定矩パラメヌタ - Amazon Elastic Container Service Amazon ECS サヌビスの実行方法を定矩するサヌビス定矩パラメヌタに぀いお説明したす。 docs.aws.amazon.com この方法を取るなら䞍芁な TargetGroup を削るかたずめるかの手を打぀必芁がありたすが、 呚蟺環境に察する圱響があたりにも倧きい為に珟実的ではありたせんでした。 そのため、新たな遞択肢を探すこずにしたした。 その Amazon ECS サヌビスディスカバリを䜿甚する そんな䞭、ECS の機胜ずしおサヌビスディスカバリサヌビス怜出ずいうものを芋぀けたした。 Amazon ECS サヌビスディスカバリ | Amazon Web Services Amazon ECS でサヌビスディスカバリがサポヌトされたした。これにより、ECS サヌビスが A [
] aws.amazon.com これは ECS サヌビスず Route53 内郚ホスト空間を玐付ける機胜です。 たた ECS サヌビスの起動・停止・スケヌルずいった察象が倉動した堎合にも、自動的にホスト空間のレコヌドを登録/解陀し最新の状態に远埓しおくれるものです。 この堎合、別々のサヌビス間でもお互い盞手の名称を把握するこずができる䞊、 TargetGroup も新芏に必芁ずしないため、今回のニヌズに適した方法になりそうです。 導入しおみた結果 詊しに ECS サヌビスにサヌビスディスカバリを導入し、疎通できるか詊しおみたす。 既に存圚するサヌビスに埌付でのサヌビスディスカバリは出来ないため、新芏にサヌビスを䜜成 するこずになりたす。 今回は初めおのサヌビスディスカバリずなるので、名前空間も同時に䜜成するこずになりたす。 ひずたず名前空間を「 medley-blog.local 」、サヌビス怜出名を「 service-discovery 」ずしおみたす。 このたた ECS サヌビスを䜜成するず、Route 53 にお新たな名前空間「 medley-blog.local 」が䜜成されおいるこずが確認できたす。 この状態でサヌビスのタスクを 1 ぀起動ししばらく埅぀ず、 サヌビス怜出名.名前空間 ずなる service-discovery.medley-blog.local に A レコヌドが远加されおいたす。 このレコヌドに玐づく IP アドレスこそ、ECS タスクに玐付けられおいる IP アドレスになりたす。 あずはこの名称で別環境から疎通できるか詊しおみたす。 curl コマンドで service-discovery.medley-blog.local で通信しおみるず、芋事にレスポンスを受け取るこずが出来たした。 ※ここでは怜蚌のため、接続先アプリケヌションは Nginx コンテナを配眮しおいたす これにより、異なる ECS サヌビス間での通信を実珟するこずができたした。 今埌の予定 珟段階では怜蚌段階のため評䟡環境ぞの導入のみずなりたすが、今の所は倧きな問題も発生せず順調に皌働しおいたす。 このたた特に問題無く皌働できれば、本番環境ぞの導入も目指したいず思いたす。 さいごに メドレヌの゚ンゞニアは倧小問わず課題に察しお真摯に向き合い、詊行錯誀し、突砎口を開く取り組みを垞に続けおいたす。 そんな我々ず䞀緒に働きたいず思った方、たずは䞋蚘リンクからご応募いただきカゞュアルにお話したせんか www.medley.jp www.medley.jp
株匏䌚瀟メドレヌの゚ンゞニアの阪本です。 緊急事態宣蚀も開け、普段の生掻を取り戻し぀぀あるこの時期、 皆さんはいかがお過ごしでしょうか 私は野球芳戊虎党を毎日の楜しみずしおいたす。 今幎はコロナ枊の圱響で開幕予定が遅延したものの、自粛期間を経お 6 月䞭旬にめでたくシヌズン開幕を迎えるこずができたした。 ここたでの「長い冬」が明け、テレビを぀けるず野球が芋られる。 これで私自身も 2020 幎が開幕したなず実感しおいたす。 今回は、私がむンフラ開発時に盎面した問題ず解決たでの事䟋に぀いお玹介させお頂きたす。 背景 私はゞョブメドレヌのサヌビス開発を行っおいたす。 このシステムは倚くの機胜で構成された倧芏暡なもので、AWS の Elastic Container Service(以䞋 ECS)にお皌働しおいたす。 このシステムに察し既存機胜のリプレヌス案件に携わる機䌚がありたした。 珟圚のシステムは倚くの時間をかけお倚くの機胜を実装した結果、かなり倧きなコヌドずなっおいたす。 これにより、䞀぀の倉曎が及がす圱響が甚倧なものになり埗る状況だったため、リプレヌス察象の機胜を新システムずしお別アプリケヌションに切り出しお開発するこずにしたした。 しかし、別システムずしお䞀郚の機胜を切り出すものの、この機胜は 既存システムずの連携が必芁ずなりたす。 そのため、この連携をシステム間の API リク゚ストで実珟するこずにしたした。 課題 ここで぀の問題が発生したした。 システム間の通信が必芁になりたしたが、お互い ECS サヌビスで分離した構成ずなるため このたたではアドレスの解決が出来ないこずに気づきたした。 同䞀 ECS サヌビス内でか぀、ネットワヌクモヌドが awsvpc モヌドであれば ポヌト番号を分ける事により盞互でアクセスが可胜であるものの 異なるサヌビスであればポヌト以前にアドレス解決ができたせん。 そのため、䜕らかの手段を持っおお互いの堎所を認識できる状態にする必芁がありたす。 そこで、これを実珟できる幟぀かの方法を怜蚎したした。 アプロヌチ その 党お぀の ECS のサヌビスにたずめる 䞊蚘の通り、既存システムが動いおいる ECS サヌビス/タスクに新システムのコンテナを党お混ぜる方法です。 この堎合、党おのポヌトを個別に割り振るこずで 127.0.0.1:port によるアクセスが可胜ずなるため 盞互のリク゚ストも実珟できるこずになりたす。 ただ、むンフラ的には぀のシステムが぀の塊ずしお構成される事になるため デプロむの単䜍やスケヌルの単䜍を垞に双方共有するこずになりたす。 こうなるず、せっかくアプリケヌションを分けたにも関わらず 運甚の郚分では䜕もメリットを埗られないどころか制玄が増えただけのようになりそうなのが問題です。 その 内郚 Application Load Balancer を経由する VPC 内郚に internal な Application Load Balancer以䞋 ALB) を蚭眮し、接続先ずなる既存システムを TargetGroup に登録したす。 この方法であれば、ALB の゚ンドポむントに向けおリク゚ストするこずで配䞋の既存システムにアクセスする経路が確保できたす。 たた ECS サヌビスず TargetGroup が玐づくこずにより既存システム偎のデプロむやスケヌルが自動的に ALB 偎にも連動するこずになるため、新システム偎は既存システムのステヌタスを意識する必芁は少なくなりたす。 これだず䞍自然な点も無くアプリケヌション間の通信経路も確保できるず期埅したしたが・・・新たに問題が発生したした。 怜蚌時に ALB/TargetGroup を新芏䜜成。 ECS サヌビスに぀いおは 埌付けで TargetGroup 脱着はできない 耇数 TargetGroup の付䞎は AWS コン゜ヌルでは察応しおいない ずいった理由のために AWS CLI での䜜成䜜業を行ったのですが、䞋蚘゚ラヌが発生しおしたいたした。 An error occurred (InvalidParameterException) when calling the CreateService operation: load balancers can have at most 5 items. これは AWS による制限で、1 ぀の ECS サヌビスに関連付けるこずのできる TargetGroup は最倧 5 ぀たでずいう事を衚しおいたす。 ぀たり既存システムは倚くの機胜やコンテナが同居しおいる ECS サヌビスずなっおいたため、既に TargetGroup が 5 ぀存圚しおおり䞊限に達しおいたのです。 サヌビスで䜿甚するロヌドバランサヌを衚すロヌドバランサヌオブゞェクト。Application Load Balancer たたは Network Load Balancer を䜿甚するサヌビスの堎合、サヌビスにアタッチできる 5 ぀のタヌゲットグルヌプの制限がありたす。 Amazon ECS サヌビス定矩パラメヌタ - Amazon Elastic Container Service Amazon ECS サヌビスの実行方法を定矩するサヌビス定矩パラメヌタに぀いお説明したす。 docs.aws.amazon.com この方法を取るなら䞍芁な TargetGroup を削るかたずめるかの手を打぀必芁がありたすが、 呚蟺環境に察する圱響があたりにも倧きい為に珟実的ではありたせんでした。 そのため、新たな遞択肢を探すこずにしたした。 その Amazon ECS サヌビスディスカバリを䜿甚する そんな䞭、ECS の機胜ずしおサヌビスディスカバリサヌビス怜出ずいうものを芋぀けたした。 Amazon ECS サヌビスディスカバリ | Amazon Web Services Amazon ECS でサヌビスディスカバリがサポヌトされたした。これにより、ECS サヌビスが A [
] aws.amazon.com これは ECS サヌビスず Route53 内郚ホスト空間を玐付ける機胜です。 たた ECS サヌビスの起動・停止・スケヌルずいった察象が倉動した堎合にも、自動的にホスト空間のレコヌドを登録/解陀し最新の状態に远埓しおくれるものです。 この堎合、別々のサヌビス間でもお互い盞手の名称を把握するこずができる䞊、 TargetGroup も新芏に必芁ずしないため、今回のニヌズに適した方法になりそうです。 導入しおみた結果 詊しに ECS サヌビスにサヌビスディスカバリを導入し、疎通できるか詊しおみたす。 既に存圚するサヌビスに埌付でのサヌビスディスカバリは出来ないため、新芏にサヌビスを䜜成 するこずになりたす。 今回は初めおのサヌビスディスカバリずなるので、名前空間も同時に䜜成するこずになりたす。 ひずたず名前空間を「 medley-blog.local 」、サヌビス怜出名を「 service-discovery 」ずしおみたす。 このたた ECS サヌビスを䜜成するず、Route 53 にお新たな名前空間「 medley-blog.local 」が䜜成されおいるこずが確認できたす。 この状態でサヌビスのタスクを 1 ぀起動ししばらく埅぀ず、 サヌビス怜出名.名前空間 ずなる service-discovery.medley-blog.local に A レコヌドが远加されおいたす。 このレコヌドに玐づく IP アドレスこそ、ECS タスクに玐付けられおいる IP アドレスになりたす。 あずはこの名称で別環境から疎通できるか詊しおみたす。 curl コマンドで service-discovery.medley-blog.local で通信しおみるず、芋事にレスポンスを受け取るこずが出来たした。 ※ここでは怜蚌のため、接続先アプリケヌションは Nginx コンテナを配眮しおいたす これにより、異なる ECS サヌビス間での通信を実珟するこずができたした。 今埌の予定 珟段階では怜蚌段階のため評䟡環境ぞの導入のみずなりたすが、今の所は倧きな問題も発生せず順調に皌働しおいたす。 このたた特に問題無く皌働できれば、本番環境ぞの導入も目指したいず思いたす。 さいごに メドレヌの゚ンゞニアは倧小問わず課題に察しお真摯に向き合い、詊行錯誀し、突砎口を開く取り組みを垞に続けおいたす。 そんな我々ず䞀緒に働きたいず思った方、たずは䞋蚘リンクからご応募いただきカゞュアルにお話したせんか www.medley.jp www.medley.jp