ããã«ã¡ã¯ã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