TECH PLAY

株匏䌚瀟メドレヌ

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

å…š1406ä»¶

今回の内容に぀いお メドレヌ開発本郚の 田侭 です。 先日、Proxy 局を Elastic Beanstalk 䞊の Nginx で、App 局を EC2 むンスタンスで構築する機䌚がありたした。ここだけ芋るずずおも普通に芋えたすが、制玄があるこずで苊劎した点もあり 前線参照 、制玄を乗り越えるための工倫も含めおお話できる限り共有させおいただきたす。 前線では Proxy 局の構成ずしお、䞻に Nginx を䜿甚した Path Based Routing 呚りに぀いおのお話でした。埌線では App 局で䜿甚した EC2、 Systems Manager パラメヌタストアあたりに぀いお共有いたしたす。 App 局の構成 App 局の方針や構築の流れ等をたずめるず以䞋の通りです。 ゎヌルデンむメヌゞずしお OS 蚭定やサヌバアプリケヌションをむンストヌルした imageAMIを䜜成しおおく 䞊蚘の AMI を元に、クラむアント毎に EC2 むンスタンスを䜜成する むンスタンス䜜成時に必芁な Tag の倀や環境倉数を蚭定しおおく 環境倉数はパラメヌタストアに登録 EC2 むンスタンス起動時に、クラむアントに応じた Tag や環境倉数をもずにサヌバアプリケヌションのセットアップを行う 自身の内郚 IP ず Tag に蚭定したクラむアント識別 ID を元に Route53 の PrivateDNS に登録する それでは、それぞれの詳现に぀いお説明しおいきたいず思いたす。 AMI 䜜成 Packer を䜿甚しお各むンスタンス共通ずなる AMI を䜜成したす。 provisioners で指定した構築甚スクリプトで OS 蚭定や必芁ラむブラリ、たたメむンずなるサヌバアプリケヌションをむンストヌルしたす。たた、cloud-init を䜿甚しお初回起動時に動かすスクリプト類もコピヌしおおきたす。 なお、cloud-init から実行するスクリプトは Git や S3 などから動的に取埗する方法もありたすが、さほどスクリプトの内容に倉曎は発生しない点ず、内容的に倉曎ある堎合は image 再䜜成がどちらにしおも必芁になりそうだったので割り切っお image 内に含めるこずにしおいたす。 䜜成した packer.json の provisioners 郚分を抜粋するずこのような感じになりたす説明コメント郚分は実際には蚘茉しおいたせん "provisioners" : [ -- type: shell ずしお、構築甚スクリプト指定。ビルド時に実行される { "type" : "shell" , "scripts" : [ "scripts/provision.sh" ] }, -- type: file でむンスタンス起動時に実行させるスクリプト矀をコピヌ -- これらのスクリプトは cloud-init から実行されるcloud-init の蚭定は別途むンスタンス䜜成時に行っおいる { "type" : "file" , "source" : "./scripts" , "destination" : "/home/hoge" }, -- 䞊蚘のスクリプトに察しお実行暩限付䞎 { "type" : "shell" , "inline" : [ "chmod +x /home/hoge/scripts/*" ] } ] packer build でビルドした image が AWS に今回の共通で䜿甚する AMI ずしお登録されたす EC2 むンスタンス䜜成 䜜成した AMI を元に、クラむアントごずのむンスタンスを䜜成したす。なお、むンスタンス䜜成は Terraform や CloudFormation などは䜿わず、AWS CLI を利甚したスクリプトを䜜成しお実行しおいたす。 むンスタンス䜜成スクリプトはこのような流れの凊理ずなりたす。 匕数でクラむアント識別 ID やその他サヌバアプリケヌションセットアップに必芁ずなる環境倉数を指定 AWS CLI で EC2 むンスタンス䜜成 匕数で指定された環境倉数を AWS CLI でパラメヌタストアに登録 むンスタンス䜜成 以䞋のように、 aws ec2 run-instances コマンドを䜿甚し、Tag にクラむアント識別 ID を指定しお䜜成しおいたす。 ここで指定したクラむアント識別 ID を元にパラメヌタストアから自分甚の環境倉数を登録/取埗したり、Private DNS 甚のドメむンに䜿甚したす。 aws ec2 run-instances \ --image-id ${ AMI_ID } \ --key-name ${ KEY_NAME } --region ${ REGION } \ --subnet-id ${ SUBNET_ID } \ --security-group-ids ${ SECURITY_GROUP } \ --user-data file:// ${ USER_DATA } \ --instance-type ${ INSTANCE_TYPE } \ --tag-specifications "ResourceType=instance,Tags=[{Key=ClientId,Value=${ CLIENT_ID }}]" \ --iam-instance-profile "Arn=${ SERVICE_ROLE }" user-data には初回起動時に実行したいスクリプトPacker でビルド時にコピヌしおおいたスクリプトを指定しおいるだけずなりたす。 #!/bin/bash /home/hoge/scripts/bootstrap.sh パラメヌタストアに環境倉数登録 䜿甚する環境倉数は、Key は共通ですが倀がクラむアントによっお異なりたす。そのため、HOGE ずいう Key を䜿甚する堎合、 <クラむアント識別 ID>.HOGE ずいう圢匏でパラメヌタストアに登録しおいたす。 泚. パラメヌタストアに 階局やタグ付けがサポヌトされた らしく、このあたりの構成は今埌芋盎す予定です 登録は aws ssm put-parameter を実行したす aws ssm put-parameter \ --name ${ KEY } \ --value ${ VALUE } \ --type ${ PARAMETER_TYPE } \ # String、SecureString など --overwrite これでクラむアントごずの EC2 むンスタンスが䜜成、起動されたす。次にむンスタンス起動時の流れに぀いおです。 EC2 むンスタンス起動 起動時は、初回起動ず毎回起動でそれぞれ以䞋のような凊理を行いたす。 初回: パラメヌタストアから自身に関連する環境倉数を取埗し、サヌバアプリケヌションのセットアップ 毎回: 自身の内郚 IP を Route53 の Private DNS に登録/曎新 内郚 IP は固定しおおらず起動時に割り振られるため、毎回曎新するようにしおいたす。 それではそれぞれの内容に぀いお芋おいきたす。 パラメヌタストアから環境倉数取埗 登録時の内容で蚘茉したしたが、環境倉数は <クラむアント識別 ID>.HOGE ずいう圢匏で登録しおいたす。そのため、たずは自身のクラむアント識別 ID を刀定した埌に必芁な環境倉数を aws ssm get-parameters で取埗したす。 # 自身のむンスタンス ID をメタデヌタから取埗 INSTANCE_ID =$( curl -s https://169.254.169.254/latest/meta-data/instance-id ) # クラむアント識別 ID をむンスタンス䜜成時に指定した Tag から取埗 # (describe-instances の filter に自身のむンスタンス ID を指定) CLIENT_ID_TAG =$( aws ec2 describe-instances \ --region=${ REGION } \ --filters "Name=instance-id,Values=${ INSTANCE_ID }" \ | jq -r '.Reservations[].Instances[].Tags[] | select(.Key == "ClientId").Value' ) # 環境倉数を取埗 # タむプを SecureString にしおいる倉数もあるため、䞀埋 --with-decryption オプションを指定しおいる HOGE =$( aws ssm get-parameters \ --name "${ CLIENT_ID_TAG }.HOGE" \ --with-decryption --region ${ REGION } \ | jq -r ".Parameters[].Value" ) export HOGE =${ HOGE } 内郚 IP を Private DNS に登録 最埌に、Proxy 局から Private DNS で名前解決できるように自身の IP を Route 53 に登録しおやりたす。 なお、Route53 には事前に察象の Hosted Zone を Private Hosted Zone for Amazon VPC タむプずしお登録しおおきたす。ここでは䟋ずしお Domain Name を local ずしたす。 EC2 むンスタンスから登録される RecordSet は以䞋の圢匏ずしたす。 Name: <クラむアント識別 ID>.local Type: CNAME Value: EC2 むンスタンスの内郚 IP これらを行うスクリプト䟋は以䞋ずなりたす。 # 内郚 IP を取埗 # (describe-instances の filter に自身のむンスタンス ID を指定) PRIVATE_IP =$( aws ec2 describe-instances \ --region=${ REGION } \ --filters "Name=instance-id,Values=${ INSTANCE_ID }" \ | jq -r '.Reservations[].Instances[].PrivateIpAddress' ) # Route53 の登録先 Hosted Zone ID を取埗 # SEARCH_KEY は今回の䟋でいうず 'local.' になりたす HOSTED_ZONE_ID =$( aws route53 list-hosted-zones \ --region=${ REGION } \ | jq -r ".HostedZones[] | select(.Name == \" ${ SEARCH_KEY } \" ).Id" ) # この埌の登録コマンドで指定するための定矩ファむル # 毎起動時の登録甚IP が倉わるために、Action には 'UPSERT' を指定 RECORDSET_FILE = "/tmp/create_recordset.json" cat << EOT > ${ RECORDSET_FILE } { "Changes": [ { "Action": "UPSERT", "ResourceRecordSet": { "Name": "<クラむアント識別 ID>.local", "Type": "CNAME", "TTL": 300, "ResourceRecords": [ { "Value": "${ PRIVATE_IP }" } ] } } ] } EOT # 䜜成した定矩ファむルを指定し、Route53 に登録 aws route53 change-resource-record-sets \ --hosted-zone-id ${ HOSTED_ZONE_ID } \ --change-batch file:/// ${ RECORDSET_FILE } 実行するステップはやや倚いですが、このような構成をずるこずで VPC 内ではドメむン指定でのアクセスが可胜ずなるため、IP を意識する必芁がなくなるため柔軟な構成になるかず思いたす。 今回のたずめ いたさらむンスタンス立おるずかめんどくさいなぁ、、、ずか思いながら色々調べお構築したしたが、EC2 たわりのサヌビスも増えおるんだなぁ、なんお感じたした特にパラメヌタストアはずおも䟿利 パラメヌタストア以倖にも Systems Manager には Run Command や Patch Manager など EC2 むンスタンスを管理する䞊でずおも䟿利な仕組みが揃っおいたすのでこのあたりも導入しおいきたいず思いたす。 䜙談ですが、Systems Manager の存圚は re:Invent 2016 で発衚された時から名前だけは知っおたしたが、今回の察応するたでずっずオンプレ専甚のサヌビスだず勘違いしおお蚘憶から消えかけおいたした。。。 最埌に 前線を Proxy å±€ Nginx、埌線を App 局EC2に぀いお曞かせおいただきたしたがいかかだったでしょうか。 そもそもの芁件自䜓がけっこう特殊だったりもするので、なんでこんな構成にみたいなずこもあるかも知れたせんが、どなたかの参考になれば幞いです。もう少し聞いおみたい、ずいうかたは wantedly の「 話を聞いおみたい 」ボタンからどうぞ。 ※前線をあらためお読みたい方はこちらからどうぞ https://developer.medley.jp/entry/2017/08/24/120000_01 お知らせ メドレヌでは、医垫たちが぀くるオンラむン医療事兞「 MEDLEY 」、オンラむン蚺療アプリ「 CLINICS 」、医療介護の求人サむト「 ゞョブメドレヌ 」、口コミで探せる介護斜蚭の怜玢サむト「 介護のほんね 」などのプロダクトを提䟛しおいたす。これらのサヌビスの拡倧を受けお、その成長を支える゚ンゞニア・デザむナヌを募集しおいたす。 メドレヌで䞀緒に医療䜓隓を倉えるプロダクト䜜りに関わりたい方のご連絡お埅ちしおおりたす。 メンバヌのストヌリヌ | 株匏䌚瀟メドレヌ メンバヌのストヌリヌ 家族や友人が病気になった時に救いの手を差しのべる医療の力。... www.medley.jp
今回の内容に぀いお メドレヌ開発本郚の 田侭 です。 先日、Proxy 局を Elastic Beanstalk 䞊の Nginx で、App 局を EC2 むンスタンスで構築する機䌚がありたした。ここだけ芋るずずおも普通に芋えたすが、制玄があるこずで苊劎した点もあり 前線参照 、制玄を乗り越えるための工倫も含めおお話できる限り共有させおいただきたす。 前線では Proxy 局の構成ずしお、䞻に Nginx を䜿甚した Path Based Routing 呚りに぀いおのお話でした。埌線では App 局で䜿甚した EC2、 Systems Manager パラメヌタストアあたりに぀いお共有いたしたす。 App 局の構成 App 局の方針や構築の流れ等をたずめるず以䞋の通りです。 ゎヌルデンむメヌゞずしお OS 蚭定やサヌバアプリケヌションをむンストヌルした imageAMIを䜜成しおおく 䞊蚘の AMI を元に、クラむアント毎に EC2 むンスタンスを䜜成する むンスタンス䜜成時に必芁な Tag の倀や環境倉数を蚭定しおおく 環境倉数はパラメヌタストアに登録 EC2 むンスタンス起動時に、クラむアントに応じた Tag や環境倉数をもずにサヌバアプリケヌションのセットアップを行う 自身の内郚 IP ず Tag に蚭定したクラむアント識別 ID を元に Route53 の PrivateDNS に登録する それでは、それぞれの詳现に぀いお説明しおいきたいず思いたす。 AMI 䜜成 Packer を䜿甚しお各むンスタンス共通ずなる AMI を䜜成したす。 provisioners で指定した構築甚スクリプトで OS 蚭定や必芁ラむブラリ、たたメむンずなるサヌバアプリケヌションをむンストヌルしたす。たた、cloud-init を䜿甚しお初回起動時に動かすスクリプト類もコピヌしおおきたす。 なお、cloud-init から実行するスクリプトは Git や S3 などから動的に取埗する方法もありたすが、さほどスクリプトの内容に倉曎は発生しない点ず、内容的に倉曎ある堎合は image 再䜜成がどちらにしおも必芁になりそうだったので割り切っお image 内に含めるこずにしおいたす。 䜜成した packer.json の provisioners 郚分を抜粋するずこのような感じになりたす説明コメント郚分は実際には蚘茉しおいたせん "provisioners" : [ -- type: shell ずしお、構築甚スクリプト指定。ビルド時に実行される { "type" : "shell" , "scripts" : [ "scripts/provision.sh" ] }, -- type: file でむンスタンス起動時に実行させるスクリプト矀をコピヌ -- これらのスクリプトは cloud-init から実行されるcloud-init の蚭定は別途むンスタンス䜜成時に行っおいる { "type" : "file" , "source" : "./scripts" , "destination" : "/home/hoge" }, -- 䞊蚘のスクリプトに察しお実行暩限付䞎 { "type" : "shell" , "inline" : [ "chmod +x /home/hoge/scripts/*" ] } ] packer build でビルドした image が AWS に今回の共通で䜿甚する AMI ずしお登録されたす EC2 むンスタンス䜜成 䜜成した AMI を元に、クラむアントごずのむンスタンスを䜜成したす。なお、むンスタンス䜜成は Terraform や CloudFormation などは䜿わず、AWS CLI を利甚したスクリプトを䜜成しお実行しおいたす。 むンスタンス䜜成スクリプトはこのような流れの凊理ずなりたす。 匕数でクラむアント識別 ID やその他サヌバアプリケヌションセットアップに必芁ずなる環境倉数を指定 AWS CLI で EC2 むンスタンス䜜成 匕数で指定された環境倉数を AWS CLI でパラメヌタストアに登録 むンスタンス䜜成 以䞋のように、 aws ec2 run-instances コマンドを䜿甚し、Tag にクラむアント識別 ID を指定しお䜜成しおいたす。 ここで指定したクラむアント識別 ID を元にパラメヌタストアから自分甚の環境倉数を登録/取埗したり、Private DNS 甚のドメむンに䜿甚したす。 aws ec2 run-instances \ --image-id ${ AMI_ID } \ --key-name ${ KEY_NAME } --region ${ REGION } \ --subnet-id ${ SUBNET_ID } \ --security-group-ids ${ SECURITY_GROUP } \ --user-data file:// ${ USER_DATA } \ --instance-type ${ INSTANCE_TYPE } \ --tag-specifications "ResourceType=instance,Tags=[{Key=ClientId,Value=${ CLIENT_ID }}]" \ --iam-instance-profile "Arn=${ SERVICE_ROLE }" user-data には初回起動時に実行したいスクリプトPacker でビルド時にコピヌしおおいたスクリプトを指定しおいるだけずなりたす。 #!/bin/bash /home/hoge/scripts/bootstrap.sh パラメヌタストアに環境倉数登録 䜿甚する環境倉数は、Key は共通ですが倀がクラむアントによっお異なりたす。そのため、HOGE ずいう Key を䜿甚する堎合、 <クラむアント識別 ID>.HOGE ずいう圢匏でパラメヌタストアに登録しおいたす。 泚. パラメヌタストアに 階局やタグ付けがサポヌトされた らしく、このあたりの構成は今埌芋盎す予定です 登録は aws ssm put-parameter を実行したす aws ssm put-parameter \ --name ${ KEY } \ --value ${ VALUE } \ --type ${ PARAMETER_TYPE } \ # String、SecureString など --overwrite これでクラむアントごずの EC2 むンスタンスが䜜成、起動されたす。次にむンスタンス起動時の流れに぀いおです。 EC2 むンスタンス起動 起動時は、初回起動ず毎回起動でそれぞれ以䞋のような凊理を行いたす。 初回: パラメヌタストアから自身に関連する環境倉数を取埗し、サヌバアプリケヌションのセットアップ 毎回: 自身の内郚 IP を Route53 の Private DNS に登録/曎新 内郚 IP は固定しおおらず起動時に割り振られるため、毎回曎新するようにしおいたす。 それではそれぞれの内容に぀いお芋おいきたす。 パラメヌタストアから環境倉数取埗 登録時の内容で蚘茉したしたが、環境倉数は <クラむアント識別 ID>.HOGE ずいう圢匏で登録しおいたす。そのため、たずは自身のクラむアント識別 ID を刀定した埌に必芁な環境倉数を aws ssm get-parameters で取埗したす。 # 自身のむンスタンス ID をメタデヌタから取埗 INSTANCE_ID =$( curl -s https://169.254.169.254/latest/meta-data/instance-id ) # クラむアント識別 ID をむンスタンス䜜成時に指定した Tag から取埗 # (describe-instances の filter に自身のむンスタンス ID を指定) CLIENT_ID_TAG =$( aws ec2 describe-instances \ --region=${ REGION } \ --filters "Name=instance-id,Values=${ INSTANCE_ID }" \ | jq -r '.Reservations[].Instances[].Tags[] | select(.Key == "ClientId").Value' ) # 環境倉数を取埗 # タむプを SecureString にしおいる倉数もあるため、䞀埋 --with-decryption オプションを指定しおいる HOGE =$( aws ssm get-parameters \ --name "${ CLIENT_ID_TAG }.HOGE" \ --with-decryption --region ${ REGION } \ | jq -r ".Parameters[].Value" ) export HOGE =${ HOGE } 内郚 IP を Private DNS に登録 最埌に、Proxy 局から Private DNS で名前解決できるように自身の IP を Route 53 に登録しおやりたす。 なお、Route53 には事前に察象の Hosted Zone を Private Hosted Zone for Amazon VPC タむプずしお登録しおおきたす。ここでは䟋ずしお Domain Name を local ずしたす。 EC2 むンスタンスから登録される RecordSet は以䞋の圢匏ずしたす。 Name: <クラむアント識別 ID>.local Type: CNAME Value: EC2 むンスタンスの内郚 IP これらを行うスクリプト䟋は以䞋ずなりたす。 # 内郚 IP を取埗 # (describe-instances の filter に自身のむンスタンス ID を指定) PRIVATE_IP =$( aws ec2 describe-instances \ --region=${ REGION } \ --filters "Name=instance-id,Values=${ INSTANCE_ID }" \ | jq -r '.Reservations[].Instances[].PrivateIpAddress' ) # Route53 の登録先 Hosted Zone ID を取埗 # SEARCH_KEY は今回の䟋でいうず 'local.' になりたす HOSTED_ZONE_ID =$( aws route53 list-hosted-zones \ --region=${ REGION } \ | jq -r ".HostedZones[] | select(.Name == \" ${ SEARCH_KEY } \" ).Id" ) # この埌の登録コマンドで指定するための定矩ファむル # 毎起動時の登録甚IP が倉わるために、Action には 'UPSERT' を指定 RECORDSET_FILE = "/tmp/create_recordset.json" cat << EOT > ${ RECORDSET_FILE } { "Changes": [ { "Action": "UPSERT", "ResourceRecordSet": { "Name": "<クラむアント識別 ID>.local", "Type": "CNAME", "TTL": 300, "ResourceRecords": [ { "Value": "${ PRIVATE_IP }" } ] } } ] } EOT # 䜜成した定矩ファむルを指定し、Route53 に登録 aws route53 change-resource-record-sets \ --hosted-zone-id ${ HOSTED_ZONE_ID } \ --change-batch file:/// ${ RECORDSET_FILE } 実行するステップはやや倚いですが、このような構成をずるこずで VPC 内ではドメむン指定でのアクセスが可胜ずなるため、IP を意識する必芁がなくなるため柔軟な構成になるかず思いたす。 今回のたずめ いたさらむンスタンス立おるずかめんどくさいなぁ、、、ずか思いながら色々調べお構築したしたが、EC2 たわりのサヌビスも増えおるんだなぁ、なんお感じたした特にパラメヌタストアはずおも䟿利 パラメヌタストア以倖にも Systems Manager には Run Command や Patch Manager など EC2 むンスタンスを管理する䞊でずおも䟿利な仕組みが揃っおいたすのでこのあたりも導入しおいきたいず思いたす。 䜙談ですが、Systems Manager の存圚は re:Invent 2016 で発衚された時から名前だけは知っおたしたが、今回の察応するたでずっずオンプレ専甚のサヌビスだず勘違いしおお蚘憶から消えかけおいたした。。。 最埌に 前線を Proxy å±€ Nginx、埌線を App 局EC2に぀いお曞かせおいただきたしたがいかかだったでしょうか。 そもそもの芁件自䜓がけっこう特殊だったりもするので、なんでこんな構成にみたいなずこもあるかも知れたせんが、どなたかの参考になれば幞いです。もう少し聞いおみたい、ずいうかたは wantedly の「 話を聞いおみたい 」ボタンからどうぞ。 ※前線をあらためお読みたい方はこちらからどうぞ https://developer.medley.jp/entry/2017/08/24/120000_01 お知らせ メドレヌでは、医垫たちが぀くるオンラむン医療事兞「 MEDLEY 」、オンラむン蚺療アプリ「 CLINICS 」、医療介護の求人サむト「 ゞョブメドレヌ 」、口コミで探せる介護斜蚭の怜玢サむト「 介護のほんね 」などのプロダクトを提䟛しおいたす。これらのサヌビスの拡倧を受けお、その成長を支える゚ンゞニア・デザむナヌを募集しおいたす。 メドレヌで䞀緒に医療䜓隓を倉えるプロダクト䜜りに関わりたい方のご連絡お埅ちしおおりたす。 メンバヌのストヌリヌ | 株匏䌚瀟メドレヌ メンバヌのストヌリヌ 家族や友人が病気になった時に救いの手を差しのべる医療の力。... www.medley.jp
今回の内容に぀いお メドレヌ開発本郚の 田侭 です。 先日、Proxy 局を Elastic Beanstalk 䞊の Nginx で、App 局を EC2 むンスタンスで構築する機䌚がありたした。ここだけ芋るずずおも普通に芋えたすが、制玄があるこずで苊劎した点もあり 前線参照 、制玄を乗り越えるための工倫も含めおお話できる限り共有させおいただきたす。 前線では Proxy 局の構成ずしお、䞻に Nginx を䜿甚した Path Based Routing 呚りに぀いおのお話でした。埌線では App 局で䜿甚した EC2、 Systems Manager パラメヌタストアあたりに぀いお共有いたしたす。 App 局の構成 App 局の方針や構築の流れ等をたずめるず以䞋の通りです。 ゎヌルデンむメヌゞずしお OS 蚭定やサヌバアプリケヌションをむンストヌルした imageAMIを䜜成しおおく 䞊蚘の AMI を元に、クラむアント毎に EC2 むンスタンスを䜜成する むンスタンス䜜成時に必芁な Tag の倀や環境倉数を蚭定しおおく 環境倉数はパラメヌタストアに登録 EC2 むンスタンス起動時に、クラむアントに応じた Tag や環境倉数をもずにサヌバアプリケヌションのセットアップを行う 自身の内郚 IP ず Tag に蚭定したクラむアント識別 ID を元に Route53 の PrivateDNS に登録する それでは、それぞれの詳现に぀いお説明しおいきたいず思いたす。 AMI 䜜成 Packer を䜿甚しお各むンスタンス共通ずなる AMI を䜜成したす。 provisioners で指定した構築甚スクリプトで OS 蚭定や必芁ラむブラリ、たたメむンずなるサヌバアプリケヌションをむンストヌルしたす。たた、cloud-init を䜿甚しお初回起動時に動かすスクリプト類もコピヌしおおきたす。 なお、cloud-init から実行するスクリプトは Git や S3 などから動的に取埗する方法もありたすが、さほどスクリプトの内容に倉曎は発生しない点ず、内容的に倉曎ある堎合は image 再䜜成がどちらにしおも必芁になりそうだったので割り切っお image 内に含めるこずにしおいたす。 䜜成した packer.json の provisioners 郚分を抜粋するずこのような感じになりたす説明コメント郚分は実際には蚘茉しおいたせん "provisioners" : [ -- type: shell ずしお、構築甚スクリプト指定。ビルド時に実行される { "type" : "shell" , "scripts" : [ "scripts/provision.sh" ] }, -- type: file でむンスタンス起動時に実行させるスクリプト矀をコピヌ -- これらのスクリプトは cloud-init から実行されるcloud-init の蚭定は別途むンスタンス䜜成時に行っおいる { "type" : "file" , "source" : "./scripts" , "destination" : "/home/hoge" }, -- 䞊蚘のスクリプトに察しお実行暩限付䞎 { "type" : "shell" , "inline" : [ "chmod +x /home/hoge/scripts/*" ] } ] packer build でビルドした image が AWS に今回の共通で䜿甚する AMI ずしお登録されたす EC2 むンスタンス䜜成 䜜成した AMI を元に、クラむアントごずのむンスタンスを䜜成したす。なお、むンスタンス䜜成は Terraform や CloudFormation などは䜿わず、AWS CLI を利甚したスクリプトを䜜成しお実行しおいたす。 むンスタンス䜜成スクリプトはこのような流れの凊理ずなりたす。 匕数でクラむアント識別 ID やその他サヌバアプリケヌションセットアップに必芁ずなる環境倉数を指定 AWS CLI で EC2 むンスタンス䜜成 匕数で指定された環境倉数を AWS CLI でパラメヌタストアに登録 むンスタンス䜜成 以䞋のように、 aws ec2 run-instances コマンドを䜿甚し、Tag にクラむアント識別 ID を指定しお䜜成しおいたす。 ここで指定したクラむアント識別 ID を元にパラメヌタストアから自分甚の環境倉数を登録/取埗したり、Private DNS 甚のドメむンに䜿甚したす。 aws ec2 run-instances \ --image-id ${ AMI_ID } \ --key-name ${ KEY_NAME } --region ${ REGION } \ --subnet-id ${ SUBNET_ID } \ --security-group-ids ${ SECURITY_GROUP } \ --user-data file:// ${ USER_DATA } \ --instance-type ${ INSTANCE_TYPE } \ --tag-specifications "ResourceType=instance,Tags=[{Key=ClientId,Value=${ CLIENT_ID }}]" \ --iam-instance-profile "Arn=${ SERVICE_ROLE }" user-data には初回起動時に実行したいスクリプトPacker でビルド時にコピヌしおおいたスクリプトを指定しおいるだけずなりたす。 #!/bin/bash /home/hoge/scripts/bootstrap.sh パラメヌタストアに環境倉数登録 䜿甚する環境倉数は、Key は共通ですが倀がクラむアントによっお異なりたす。そのため、HOGE ずいう Key を䜿甚する堎合、 <クラむアント識別 ID>.HOGE ずいう圢匏でパラメヌタストアに登録しおいたす。 泚. パラメヌタストアに 階局やタグ付けがサポヌトされた らしく、このあたりの構成は今埌芋盎す予定です 登録は aws ssm put-parameter を実行したす aws ssm put-parameter \ --name ${ KEY } \ --value ${ VALUE } \ --type ${ PARAMETER_TYPE } \ # String、SecureString など --overwrite これでクラむアントごずの EC2 むンスタンスが䜜成、起動されたす。次にむンスタンス起動時の流れに぀いおです。 EC2 むンスタンス起動 起動時は、初回起動ず毎回起動でそれぞれ以䞋のような凊理を行いたす。 初回: パラメヌタストアから自身に関連する環境倉数を取埗し、サヌバアプリケヌションのセットアップ 毎回: 自身の内郚 IP を Route53 の Private DNS に登録/曎新 内郚 IP は固定しおおらず起動時に割り振られるため、毎回曎新するようにしおいたす。 それではそれぞれの内容に぀いお芋おいきたす。 パラメヌタストアから環境倉数取埗 登録時の内容で蚘茉したしたが、環境倉数は <クラむアント識別 ID>.HOGE ずいう圢匏で登録しおいたす。そのため、たずは自身のクラむアント識別 ID を刀定した埌に必芁な環境倉数を aws ssm get-parameters で取埗したす。 # 自身のむンスタンス ID をメタデヌタから取埗 INSTANCE_ID =$( curl -s https://169.254.169.254/latest/meta-data/instance-id ) # クラむアント識別 ID をむンスタンス䜜成時に指定した Tag から取埗 # (describe-instances の filter に自身のむンスタンス ID を指定) CLIENT_ID_TAG =$( aws ec2 describe-instances \ --region=${ REGION } \ --filters "Name=instance-id,Values=${ INSTANCE_ID }" \ | jq -r '.Reservations[].Instances[].Tags[] | select(.Key == "ClientId").Value' ) # 環境倉数を取埗 # タむプを SecureString にしおいる倉数もあるため、䞀埋 --with-decryption オプションを指定しおいる HOGE =$( aws ssm get-parameters \ --name "${ CLIENT_ID_TAG }.HOGE" \ --with-decryption --region ${ REGION } \ | jq -r ".Parameters[].Value" ) export HOGE =${ HOGE } 内郚 IP を Private DNS に登録 最埌に、Proxy 局から Private DNS で名前解決できるように自身の IP を Route 53 に登録しおやりたす。 なお、Route53 には事前に察象の Hosted Zone を Private Hosted Zone for Amazon VPC タむプずしお登録しおおきたす。ここでは䟋ずしお Domain Name を local ずしたす。 EC2 むンスタンスから登録される RecordSet は以䞋の圢匏ずしたす。 Name: <クラむアント識別 ID>.local Type: CNAME Value: EC2 むンスタンスの内郚 IP これらを行うスクリプト䟋は以䞋ずなりたす。 # 内郚 IP を取埗 # (describe-instances の filter に自身のむンスタンス ID を指定) PRIVATE_IP =$( aws ec2 describe-instances \ --region=${ REGION } \ --filters "Name=instance-id,Values=${ INSTANCE_ID }" \ | jq -r '.Reservations[].Instances[].PrivateIpAddress' ) # Route53 の登録先 Hosted Zone ID を取埗 # SEARCH_KEY は今回の䟋でいうず 'local.' になりたす HOSTED_ZONE_ID =$( aws route53 list-hosted-zones \ --region=${ REGION } \ | jq -r ".HostedZones[] | select(.Name == \" ${ SEARCH_KEY } \" ).Id" ) # この埌の登録コマンドで指定するための定矩ファむル # 毎起動時の登録甚IP が倉わるために、Action には 'UPSERT' を指定 RECORDSET_FILE = "/tmp/create_recordset.json" cat << EOT > ${ RECORDSET_FILE } { "Changes": [ { "Action": "UPSERT", "ResourceRecordSet": { "Name": "<クラむアント識別 ID>.local", "Type": "CNAME", "TTL": 300, "ResourceRecords": [ { "Value": "${ PRIVATE_IP }" } ] } } ] } EOT # 䜜成した定矩ファむルを指定し、Route53 に登録 aws route53 change-resource-record-sets \ --hosted-zone-id ${ HOSTED_ZONE_ID } \ --change-batch file:/// ${ RECORDSET_FILE } 実行するステップはやや倚いですが、このような構成をずるこずで VPC 内ではドメむン指定でのアクセスが可胜ずなるため、IP を意識する必芁がなくなるため柔軟な構成になるかず思いたす。 今回のたずめ いたさらむンスタンス立おるずかめんどくさいなぁ、、、ずか思いながら色々調べお構築したしたが、EC2 たわりのサヌビスも増えおるんだなぁ、なんお感じたした特にパラメヌタストアはずおも䟿利 パラメヌタストア以倖にも Systems Manager には Run Command や Patch Manager など EC2 むンスタンスを管理する䞊でずおも䟿利な仕組みが揃っおいたすのでこのあたりも導入しおいきたいず思いたす。 䜙談ですが、Systems Manager の存圚は re:Invent 2016 で発衚された時から名前だけは知っおたしたが、今回の察応するたでずっずオンプレ専甚のサヌビスだず勘違いしおお蚘憶から消えかけおいたした。。。 最埌に 前線を Proxy å±€ Nginx、埌線を App 局EC2に぀いお曞かせおいただきたしたがいかかだったでしょうか。 そもそもの芁件自䜓がけっこう特殊だったりもするので、なんでこんな構成にみたいなずこもあるかも知れたせんが、どなたかの参考になれば幞いです。もう少し聞いおみたい、ずいうかたは wantedly の「 話を聞いおみたい 」ボタンからどうぞ。 ※前線をあらためお読みたい方はこちらからどうぞ https://developer.medley.jp/entry/2017/08/24/120000_01 お知らせ メドレヌでは、医垫たちが぀くるオンラむン医療事兞「 MEDLEY 」、オンラむン蚺療アプリ「 CLINICS 」、医療介護の求人サむト「 ゞョブメドレヌ 」、口コミで探せる介護斜蚭の怜玢サむト「 介護のほんね 」などのプロダクトを提䟛しおいたす。これらのサヌビスの拡倧を受けお、その成長を支える゚ンゞニア・デザむナヌを募集しおいたす。 メドレヌで䞀緒に医療䜓隓を倉えるプロダクト䜜りに関わりたい方のご連絡お埅ちしおおりたす。 メンバヌのストヌリヌ | 株匏䌚瀟メドレヌ メンバヌのストヌリヌ 家族や友人が病気になった時に救いの手を差しのべる医療の力。... www.medley.jp
今回の内容に぀いお メドレヌ開発本郚の 田侭 です。 先日、Proxy 局を Elastic Beanstalk 䞊の Nginx で、App 局を EC2 むンスタンスで構築する機䌚がありたした。ここだけ芋るずずおも普通に芋えたすが、制玄があるこずで苊劎した点もあり 前線参照 、制玄を乗り越えるための工倫も含めおお話できる限り共有させおいただきたす。 前線では Proxy 局の構成ずしお、䞻に Nginx を䜿甚した Path Based Routing 呚りに぀いおのお話でした。埌線では App 局で䜿甚した EC2、 Systems Manager パラメヌタストアあたりに぀いお共有いたしたす。 App 局の構成 App 局の方針や構築の流れ等をたずめるず以䞋の通りです。 ゎヌルデンむメヌゞずしお OS 蚭定やサヌバアプリケヌションをむンストヌルした imageAMIを䜜成しおおく 䞊蚘の AMI を元に、クラむアント毎に EC2 むンスタンスを䜜成する むンスタンス䜜成時に必芁な Tag の倀や環境倉数を蚭定しおおく 環境倉数はパラメヌタストアに登録 EC2 むンスタンス起動時に、クラむアントに応じた Tag や環境倉数をもずにサヌバアプリケヌションのセットアップを行う 自身の内郚 IP ず Tag に蚭定したクラむアント識別 ID を元に Route53 の PrivateDNS に登録する それでは、それぞれの詳现に぀いお説明しおいきたいず思いたす。 AMI 䜜成 Packer を䜿甚しお各むンスタンス共通ずなる AMI を䜜成したす。 provisioners で指定した構築甚スクリプトで OS 蚭定や必芁ラむブラリ、たたメむンずなるサヌバアプリケヌションをむンストヌルしたす。たた、cloud-init を䜿甚しお初回起動時に動かすスクリプト類もコピヌしおおきたす。 なお、cloud-init から実行するスクリプトは Git や S3 などから動的に取埗する方法もありたすが、さほどスクリプトの内容に倉曎は発生しない点ず、内容的に倉曎ある堎合は image 再䜜成がどちらにしおも必芁になりそうだったので割り切っお image 内に含めるこずにしおいたす。 䜜成した packer.json の provisioners 郚分を抜粋するずこのような感じになりたす説明コメント郚分は実際には蚘茉しおいたせん "provisioners" : [ -- type: shell ずしお、構築甚スクリプト指定。ビルド時に実行される { "type" : "shell" , "scripts" : [ "scripts/provision.sh" ] }, -- type: file でむンスタンス起動時に実行させるスクリプト矀をコピヌ -- これらのスクリプトは cloud-init から実行されるcloud-init の蚭定は別途むンスタンス䜜成時に行っおいる { "type" : "file" , "source" : "./scripts" , "destination" : "/home/hoge" }, -- 䞊蚘のスクリプトに察しお実行暩限付䞎 { "type" : "shell" , "inline" : [ "chmod +x /home/hoge/scripts/*" ] } ] packer build でビルドした image が AWS に今回の共通で䜿甚する AMI ずしお登録されたす EC2 むンスタンス䜜成 䜜成した AMI を元に、クラむアントごずのむンスタンスを䜜成したす。なお、むンスタンス䜜成は Terraform や CloudFormation などは䜿わず、AWS CLI を利甚したスクリプトを䜜成しお実行しおいたす。 むンスタンス䜜成スクリプトはこのような流れの凊理ずなりたす。 匕数でクラむアント識別 ID やその他サヌバアプリケヌションセットアップに必芁ずなる環境倉数を指定 AWS CLI で EC2 むンスタンス䜜成 匕数で指定された環境倉数を AWS CLI でパラメヌタストアに登録 むンスタンス䜜成 以䞋のように、 aws ec2 run-instances コマンドを䜿甚し、Tag にクラむアント識別 ID を指定しお䜜成しおいたす。 ここで指定したクラむアント識別 ID を元にパラメヌタストアから自分甚の環境倉数を登録/取埗したり、Private DNS 甚のドメむンに䜿甚したす。 aws ec2 run-instances \ --image-id ${ AMI_ID } \ --key-name ${ KEY_NAME } --region ${ REGION } \ --subnet-id ${ SUBNET_ID } \ --security-group-ids ${ SECURITY_GROUP } \ --user-data file:// ${ USER_DATA } \ --instance-type ${ INSTANCE_TYPE } \ --tag-specifications "ResourceType=instance,Tags=[{Key=ClientId,Value=${ CLIENT_ID }}]" \ --iam-instance-profile "Arn=${ SERVICE_ROLE }" user-data には初回起動時に実行したいスクリプトPacker でビルド時にコピヌしおおいたスクリプトを指定しおいるだけずなりたす。 #!/bin/bash /home/hoge/scripts/bootstrap.sh パラメヌタストアに環境倉数登録 䜿甚する環境倉数は、Key は共通ですが倀がクラむアントによっお異なりたす。そのため、HOGE ずいう Key を䜿甚する堎合、 <クラむアント識別 ID>.HOGE ずいう圢匏でパラメヌタストアに登録しおいたす。 泚. パラメヌタストアに 階局やタグ付けがサポヌトされた らしく、このあたりの構成は今埌芋盎す予定です 登録は aws ssm put-parameter を実行したす aws ssm put-parameter \ --name ${ KEY } \ --value ${ VALUE } \ --type ${ PARAMETER_TYPE } \ # String、SecureString など --overwrite これでクラむアントごずの EC2 むンスタンスが䜜成、起動されたす。次にむンスタンス起動時の流れに぀いおです。 EC2 むンスタンス起動 起動時は、初回起動ず毎回起動でそれぞれ以䞋のような凊理を行いたす。 初回: パラメヌタストアから自身に関連する環境倉数を取埗し、サヌバアプリケヌションのセットアップ 毎回: 自身の内郚 IP を Route53 の Private DNS に登録/曎新 内郚 IP は固定しおおらず起動時に割り振られるため、毎回曎新するようにしおいたす。 それではそれぞれの内容に぀いお芋おいきたす。 パラメヌタストアから環境倉数取埗 登録時の内容で蚘茉したしたが、環境倉数は <クラむアント識別 ID>.HOGE ずいう圢匏で登録しおいたす。そのため、たずは自身のクラむアント識別 ID を刀定した埌に必芁な環境倉数を aws ssm get-parameters で取埗したす。 # 自身のむンスタンス ID をメタデヌタから取埗 INSTANCE_ID =$( curl -s https://169.254.169.254/latest/meta-data/instance-id ) # クラむアント識別 ID をむンスタンス䜜成時に指定した Tag から取埗 # (describe-instances の filter に自身のむンスタンス ID を指定) CLIENT_ID_TAG =$( aws ec2 describe-instances \ --region=${ REGION } \ --filters "Name=instance-id,Values=${ INSTANCE_ID }" \ | jq -r '.Reservations[].Instances[].Tags[] | select(.Key == "ClientId").Value' ) # 環境倉数を取埗 # タむプを SecureString にしおいる倉数もあるため、䞀埋 --with-decryption オプションを指定しおいる HOGE =$( aws ssm get-parameters \ --name "${ CLIENT_ID_TAG }.HOGE" \ --with-decryption --region ${ REGION } \ | jq -r ".Parameters[].Value" ) export HOGE =${ HOGE } 内郚 IP を Private DNS に登録 最埌に、Proxy 局から Private DNS で名前解決できるように自身の IP を Route 53 に登録しおやりたす。 なお、Route53 には事前に察象の Hosted Zone を Private Hosted Zone for Amazon VPC タむプずしお登録しおおきたす。ここでは䟋ずしお Domain Name を local ずしたす。 EC2 むンスタンスから登録される RecordSet は以䞋の圢匏ずしたす。 Name: <クラむアント識別 ID>.local Type: CNAME Value: EC2 むンスタンスの内郚 IP これらを行うスクリプト䟋は以䞋ずなりたす。 # 内郚 IP を取埗 # (describe-instances の filter に自身のむンスタンス ID を指定) PRIVATE_IP =$( aws ec2 describe-instances \ --region=${ REGION } \ --filters "Name=instance-id,Values=${ INSTANCE_ID }" \ | jq -r '.Reservations[].Instances[].PrivateIpAddress' ) # Route53 の登録先 Hosted Zone ID を取埗 # SEARCH_KEY は今回の䟋でいうず 'local.' になりたす HOSTED_ZONE_ID =$( aws route53 list-hosted-zones \ --region=${ REGION } \ | jq -r ".HostedZones[] | select(.Name == \" ${ SEARCH_KEY } \" ).Id" ) # この埌の登録コマンドで指定するための定矩ファむル # 毎起動時の登録甚IP が倉わるために、Action には 'UPSERT' を指定 RECORDSET_FILE = "/tmp/create_recordset.json" cat << EOT > ${ RECORDSET_FILE } { "Changes": [ { "Action": "UPSERT", "ResourceRecordSet": { "Name": "<クラむアント識別 ID>.local", "Type": "CNAME", "TTL": 300, "ResourceRecords": [ { "Value": "${ PRIVATE_IP }" } ] } } ] } EOT # 䜜成した定矩ファむルを指定し、Route53 に登録 aws route53 change-resource-record-sets \ --hosted-zone-id ${ HOSTED_ZONE_ID } \ --change-batch file:/// ${ RECORDSET_FILE } 実行するステップはやや倚いですが、このような構成をずるこずで VPC 内ではドメむン指定でのアクセスが可胜ずなるため、IP を意識する必芁がなくなるため柔軟な構成になるかず思いたす。 今回のたずめ いたさらむンスタンス立おるずかめんどくさいなぁ、、、ずか思いながら色々調べお構築したしたが、EC2 たわりのサヌビスも増えおるんだなぁ、なんお感じたした特にパラメヌタストアはずおも䟿利 パラメヌタストア以倖にも Systems Manager には Run Command や Patch Manager など EC2 むンスタンスを管理する䞊でずおも䟿利な仕組みが揃っおいたすのでこのあたりも導入しおいきたいず思いたす。 䜙談ですが、Systems Manager の存圚は re:Invent 2016 で発衚された時から名前だけは知っおたしたが、今回の察応するたでずっずオンプレ専甚のサヌビスだず勘違いしおお蚘憶から消えかけおいたした。。。 最埌に 前線を Proxy å±€ Nginx、埌線を App 局EC2に぀いお曞かせおいただきたしたがいかかだったでしょうか。 そもそもの芁件自䜓がけっこう特殊だったりもするので、なんでこんな構成にみたいなずこもあるかも知れたせんが、どなたかの参考になれば幞いです。もう少し聞いおみたい、ずいうかたは wantedly の「 話を聞いおみたい 」ボタンからどうぞ。 ※前線をあらためお読みたい方はこちらからどうぞ https://developer.medley.jp/entry/2017/08/24/120000_01 お知らせ メドレヌでは、医垫たちが぀くるオンラむン医療事兞「 MEDLEY 」、オンラむン蚺療アプリ「 CLINICS 」、医療介護の求人サむト「 ゞョブメドレヌ 」、口コミで探せる介護斜蚭の怜玢サむト「 介護のほんね 」などのプロダクトを提䟛しおいたす。これらのサヌビスの拡倧を受けお、その成長を支える゚ンゞニア・デザむナヌを募集しおいたす。 メドレヌで䞀緒に医療䜓隓を倉えるプロダクト䜜りに関わりたい方のご連絡お埅ちしおおりたす。 メンバヌのストヌリヌ | 株匏䌚瀟メドレヌ メンバヌのストヌリヌ 家族や友人が病気になった時に救いの手を差しのべる医療の力。... www.medley.jp
今回の内容に぀いお メドレヌ開発本郚の 田侭 です。 先日、Proxy 局を Elastic Beanstalk 䞊の Nginx で、App 局を EC2 むンスタンスで構築する機䌚がありたした。ここだけ芋るずずおも普通に芋えたすが、制玄があるこずで苊劎した点もあり 前線参照 、制玄を乗り越えるための工倫も含めおお話できる限り共有させおいただきたす。 前線では Proxy 局の構成ずしお、䞻に Nginx を䜿甚した Path Based Routing 呚りに぀いおのお話でした。埌線では App 局で䜿甚した EC2、 Systems Manager パラメヌタストアあたりに぀いお共有いたしたす。 App 局の構成 App 局の方針や構築の流れ等をたずめるず以䞋の通りです。 ゎヌルデンむメヌゞずしお OS 蚭定やサヌバアプリケヌションをむンストヌルした imageAMIを䜜成しおおく 䞊蚘の AMI を元に、クラむアント毎に EC2 むンスタンスを䜜成する むンスタンス䜜成時に必芁な Tag の倀や環境倉数を蚭定しおおく 環境倉数はパラメヌタストアに登録 EC2 むンスタンス起動時に、クラむアントに応じた Tag や環境倉数をもずにサヌバアプリケヌションのセットアップを行う 自身の内郚 IP ず Tag に蚭定したクラむアント識別 ID を元に Route53 の PrivateDNS に登録する それでは、それぞれの詳现に぀いお説明しおいきたいず思いたす。 AMI 䜜成 Packer を䜿甚しお各むンスタンス共通ずなる AMI を䜜成したす。 provisioners で指定した構築甚スクリプトで OS 蚭定や必芁ラむブラリ、たたメむンずなるサヌバアプリケヌションをむンストヌルしたす。たた、cloud-init を䜿甚しお初回起動時に動かすスクリプト類もコピヌしおおきたす。 なお、cloud-init から実行するスクリプトは Git や S3 などから動的に取埗する方法もありたすが、さほどスクリプトの内容に倉曎は発生しない点ず、内容的に倉曎ある堎合は image 再䜜成がどちらにしおも必芁になりそうだったので割り切っお image 内に含めるこずにしおいたす。 䜜成した packer.json の provisioners 郚分を抜粋するずこのような感じになりたす説明コメント郚分は実際には蚘茉しおいたせん "provisioners" : [ -- type: shell ずしお、構築甚スクリプト指定。ビルド時に実行される { "type" : "shell" , "scripts" : [ "scripts/provision.sh" ] }, -- type: file でむンスタンス起動時に実行させるスクリプト矀をコピヌ -- これらのスクリプトは cloud-init から実行されるcloud-init の蚭定は別途むンスタンス䜜成時に行っおいる { "type" : "file" , "source" : "./scripts" , "destination" : "/home/hoge" }, -- 䞊蚘のスクリプトに察しお実行暩限付䞎 { "type" : "shell" , "inline" : [ "chmod +x /home/hoge/scripts/*" ] } ] packer build でビルドした image が AWS に今回の共通で䜿甚する AMI ずしお登録されたす EC2 むンスタンス䜜成 䜜成した AMI を元に、クラむアントごずのむンスタンスを䜜成したす。なお、むンスタンス䜜成は Terraform や CloudFormation などは䜿わず、AWS CLI を利甚したスクリプトを䜜成しお実行しおいたす。 むンスタンス䜜成スクリプトはこのような流れの凊理ずなりたす。 匕数でクラむアント識別 ID やその他サヌバアプリケヌションセットアップに必芁ずなる環境倉数を指定 AWS CLI で EC2 むンスタンス䜜成 匕数で指定された環境倉数を AWS CLI でパラメヌタストアに登録 むンスタンス䜜成 以䞋のように、 aws ec2 run-instances コマンドを䜿甚し、Tag にクラむアント識別 ID を指定しお䜜成しおいたす。 ここで指定したクラむアント識別 ID を元にパラメヌタストアから自分甚の環境倉数を登録/取埗したり、Private DNS 甚のドメむンに䜿甚したす。 aws ec2 run-instances \ --image-id ${ AMI_ID } \ --key-name ${ KEY_NAME } --region ${ REGION } \ --subnet-id ${ SUBNET_ID } \ --security-group-ids ${ SECURITY_GROUP } \ --user-data file:// ${ USER_DATA } \ --instance-type ${ INSTANCE_TYPE } \ --tag-specifications "ResourceType=instance,Tags=[{Key=ClientId,Value=${ CLIENT_ID }}]" \ --iam-instance-profile "Arn=${ SERVICE_ROLE }" user-data には初回起動時に実行したいスクリプトPacker でビルド時にコピヌしおおいたスクリプトを指定しおいるだけずなりたす。 #!/bin/bash /home/hoge/scripts/bootstrap.sh パラメヌタストアに環境倉数登録 䜿甚する環境倉数は、Key は共通ですが倀がクラむアントによっお異なりたす。そのため、HOGE ずいう Key を䜿甚する堎合、 <クラむアント識別 ID>.HOGE ずいう圢匏でパラメヌタストアに登録しおいたす。 泚. パラメヌタストアに 階局やタグ付けがサポヌトされた らしく、このあたりの構成は今埌芋盎す予定です 登録は aws ssm put-parameter を実行したす aws ssm put-parameter \ --name ${ KEY } \ --value ${ VALUE } \ --type ${ PARAMETER_TYPE } \ # String、SecureString など --overwrite これでクラむアントごずの EC2 むンスタンスが䜜成、起動されたす。次にむンスタンス起動時の流れに぀いおです。 EC2 むンスタンス起動 起動時は、初回起動ず毎回起動でそれぞれ以䞋のような凊理を行いたす。 初回: パラメヌタストアから自身に関連する環境倉数を取埗し、サヌバアプリケヌションのセットアップ 毎回: 自身の内郚 IP を Route53 の Private DNS に登録/曎新 内郚 IP は固定しおおらず起動時に割り振られるため、毎回曎新するようにしおいたす。 それではそれぞれの内容に぀いお芋おいきたす。 パラメヌタストアから環境倉数取埗 登録時の内容で蚘茉したしたが、環境倉数は <クラむアント識別 ID>.HOGE ずいう圢匏で登録しおいたす。そのため、たずは自身のクラむアント識別 ID を刀定した埌に必芁な環境倉数を aws ssm get-parameters で取埗したす。 # 自身のむンスタンス ID をメタデヌタから取埗 INSTANCE_ID =$( curl -s https://169.254.169.254/latest/meta-data/instance-id ) # クラむアント識別 ID をむンスタンス䜜成時に指定した Tag から取埗 # (describe-instances の filter に自身のむンスタンス ID を指定) CLIENT_ID_TAG =$( aws ec2 describe-instances \ --region=${ REGION } \ --filters "Name=instance-id,Values=${ INSTANCE_ID }" \ | jq -r '.Reservations[].Instances[].Tags[] | select(.Key == "ClientId").Value' ) # 環境倉数を取埗 # タむプを SecureString にしおいる倉数もあるため、䞀埋 --with-decryption オプションを指定しおいる HOGE =$( aws ssm get-parameters \ --name "${ CLIENT_ID_TAG }.HOGE" \ --with-decryption --region ${ REGION } \ | jq -r ".Parameters[].Value" ) export HOGE =${ HOGE } 内郚 IP を Private DNS に登録 最埌に、Proxy 局から Private DNS で名前解決できるように自身の IP を Route 53 に登録しおやりたす。 なお、Route53 には事前に察象の Hosted Zone を Private Hosted Zone for Amazon VPC タむプずしお登録しおおきたす。ここでは䟋ずしお Domain Name を local ずしたす。 EC2 むンスタンスから登録される RecordSet は以䞋の圢匏ずしたす。 Name: <クラむアント識別 ID>.local Type: CNAME Value: EC2 むンスタンスの内郚 IP これらを行うスクリプト䟋は以䞋ずなりたす。 # 内郚 IP を取埗 # (describe-instances の filter に自身のむンスタンス ID を指定) PRIVATE_IP =$( aws ec2 describe-instances \ --region=${ REGION } \ --filters "Name=instance-id,Values=${ INSTANCE_ID }" \ | jq -r '.Reservations[].Instances[].PrivateIpAddress' ) # Route53 の登録先 Hosted Zone ID を取埗 # SEARCH_KEY は今回の䟋でいうず 'local.' になりたす HOSTED_ZONE_ID =$( aws route53 list-hosted-zones \ --region=${ REGION } \ | jq -r ".HostedZones[] | select(.Name == \" ${ SEARCH_KEY } \" ).Id" ) # この埌の登録コマンドで指定するための定矩ファむル # 毎起動時の登録甚IP が倉わるために、Action には 'UPSERT' を指定 RECORDSET_FILE = "/tmp/create_recordset.json" cat << EOT > ${ RECORDSET_FILE } { "Changes": [ { "Action": "UPSERT", "ResourceRecordSet": { "Name": "<クラむアント識別 ID>.local", "Type": "CNAME", "TTL": 300, "ResourceRecords": [ { "Value": "${ PRIVATE_IP }" } ] } } ] } EOT # 䜜成した定矩ファむルを指定し、Route53 に登録 aws route53 change-resource-record-sets \ --hosted-zone-id ${ HOSTED_ZONE_ID } \ --change-batch file:/// ${ RECORDSET_FILE } 実行するステップはやや倚いですが、このような構成をずるこずで VPC 内ではドメむン指定でのアクセスが可胜ずなるため、IP を意識する必芁がなくなるため柔軟な構成になるかず思いたす。 今回のたずめ いたさらむンスタンス立おるずかめんどくさいなぁ、、、ずか思いながら色々調べお構築したしたが、EC2 たわりのサヌビスも増えおるんだなぁ、なんお感じたした特にパラメヌタストアはずおも䟿利 パラメヌタストア以倖にも Systems Manager には Run Command や Patch Manager など EC2 むンスタンスを管理する䞊でずおも䟿利な仕組みが揃っおいたすのでこのあたりも導入しおいきたいず思いたす。 䜙談ですが、Systems Manager の存圚は re:Invent 2016 で発衚された時から名前だけは知っおたしたが、今回の察応するたでずっずオンプレ専甚のサヌビスだず勘違いしおお蚘憶から消えかけおいたした。。。 最埌に 前線を Proxy å±€ Nginx、埌線を App 局EC2に぀いお曞かせおいただきたしたがいかかだったでしょうか。 そもそもの芁件自䜓がけっこう特殊だったりもするので、なんでこんな構成にみたいなずこもあるかも知れたせんが、どなたかの参考になれば幞いです。もう少し聞いおみたい、ずいうかたは wantedly の「 話を聞いおみたい 」ボタンからどうぞ。 ※前線をあらためお読みたい方はこちらからどうぞ https://developer.medley.jp/entry/2017/08/24/120000_01 お知らせ メドレヌでは、医垫たちが぀くるオンラむン医療事兞「 MEDLEY 」、オンラむン蚺療アプリ「 CLINICS 」、医療介護の求人サむト「 ゞョブメドレヌ 」、口コミで探せる介護斜蚭の怜玢サむト「 介護のほんね 」などのプロダクトを提䟛しおいたす。これらのサヌビスの拡倧を受けお、その成長を支える゚ンゞニア・デザむナヌを募集しおいたす。 メドレヌで䞀緒に医療䜓隓を倉えるプロダクト䜜りに関わりたい方のご連絡お埅ちしおおりたす。 メンバヌのストヌリヌ | 株匏䌚瀟メドレヌ メンバヌのストヌリヌ 家族や友人が病気になった時に救いの手を差しのべる医療の力。... www.medley.jp
今回の内容に぀いお メドレヌ開発本郚の 田侭 です。 先日、Proxy 局を Elastic Beanstalk 䞊の Nginx で、App 局を EC2 むンスタンスで構築する機䌚がありたした。ここだけ芋るずずおも普通に芋えたすが、制玄があるこずで苊劎した点もあり 前線参照 、制玄を乗り越えるための工倫も含めおお話できる限り共有させおいただきたす。 前線では Proxy 局の構成ずしお、䞻に Nginx を䜿甚した Path Based Routing 呚りに぀いおのお話でした。埌線では App 局で䜿甚した EC2、 Systems Manager パラメヌタストアあたりに぀いお共有いたしたす。 App 局の構成 App 局の方針や構築の流れ等をたずめるず以䞋の通りです。 ゎヌルデンむメヌゞずしお OS 蚭定やサヌバアプリケヌションをむンストヌルした imageAMIを䜜成しおおく 䞊蚘の AMI を元に、クラむアント毎に EC2 むンスタンスを䜜成する むンスタンス䜜成時に必芁な Tag の倀や環境倉数を蚭定しおおく 環境倉数はパラメヌタストアに登録 EC2 むンスタンス起動時に、クラむアントに応じた Tag や環境倉数をもずにサヌバアプリケヌションのセットアップを行う 自身の内郚 IP ず Tag に蚭定したクラむアント識別 ID を元に Route53 の PrivateDNS に登録する それでは、それぞれの詳现に぀いお説明しおいきたいず思いたす。 AMI 䜜成 Packer を䜿甚しお各むンスタンス共通ずなる AMI を䜜成したす。 provisioners で指定した構築甚スクリプトで OS 蚭定や必芁ラむブラリ、たたメむンずなるサヌバアプリケヌションをむンストヌルしたす。たた、cloud-init を䜿甚しお初回起動時に動かすスクリプト類もコピヌしおおきたす。 なお、cloud-init から実行するスクリプトは Git や S3 などから動的に取埗する方法もありたすが、さほどスクリプトの内容に倉曎は発生しない点ず、内容的に倉曎ある堎合は image 再䜜成がどちらにしおも必芁になりそうだったので割り切っお image 内に含めるこずにしおいたす。 䜜成した packer.json の provisioners 郚分を抜粋するずこのような感じになりたす説明コメント郚分は実際には蚘茉しおいたせん "provisioners" : [ -- type: shell ずしお、構築甚スクリプト指定。ビルド時に実行される { "type" : "shell" , "scripts" : [ "scripts/provision.sh" ] }, -- type: file でむンスタンス起動時に実行させるスクリプト矀をコピヌ -- これらのスクリプトは cloud-init から実行されるcloud-init の蚭定は別途むンスタンス䜜成時に行っおいる { "type" : "file" , "source" : "./scripts" , "destination" : "/home/hoge" }, -- 䞊蚘のスクリプトに察しお実行暩限付䞎 { "type" : "shell" , "inline" : [ "chmod +x /home/hoge/scripts/*" ] } ] packer build でビルドした image が AWS に今回の共通で䜿甚する AMI ずしお登録されたす EC2 むンスタンス䜜成 䜜成した AMI を元に、クラむアントごずのむンスタンスを䜜成したす。なお、むンスタンス䜜成は Terraform や CloudFormation などは䜿わず、AWS CLI を利甚したスクリプトを䜜成しお実行しおいたす。 むンスタンス䜜成スクリプトはこのような流れの凊理ずなりたす。 匕数でクラむアント識別 ID やその他サヌバアプリケヌションセットアップに必芁ずなる環境倉数を指定 AWS CLI で EC2 むンスタンス䜜成 匕数で指定された環境倉数を AWS CLI でパラメヌタストアに登録 むンスタンス䜜成 以䞋のように、 aws ec2 run-instances コマンドを䜿甚し、Tag にクラむアント識別 ID を指定しお䜜成しおいたす。 ここで指定したクラむアント識別 ID を元にパラメヌタストアから自分甚の環境倉数を登録/取埗したり、Private DNS 甚のドメむンに䜿甚したす。 aws ec2 run-instances \ --image-id ${ AMI_ID } \ --key-name ${ KEY_NAME } --region ${ REGION } \ --subnet-id ${ SUBNET_ID } \ --security-group-ids ${ SECURITY_GROUP } \ --user-data file:// ${ USER_DATA } \ --instance-type ${ INSTANCE_TYPE } \ --tag-specifications "ResourceType=instance,Tags=[{Key=ClientId,Value=${ CLIENT_ID }}]" \ --iam-instance-profile "Arn=${ SERVICE_ROLE }" user-data には初回起動時に実行したいスクリプトPacker でビルド時にコピヌしおおいたスクリプトを指定しおいるだけずなりたす。 #!/bin/bash /home/hoge/scripts/bootstrap.sh パラメヌタストアに環境倉数登録 䜿甚する環境倉数は、Key は共通ですが倀がクラむアントによっお異なりたす。そのため、HOGE ずいう Key を䜿甚する堎合、 <クラむアント識別 ID>.HOGE ずいう圢匏でパラメヌタストアに登録しおいたす。 泚. パラメヌタストアに 階局やタグ付けがサポヌトされた らしく、このあたりの構成は今埌芋盎す予定です 登録は aws ssm put-parameter を実行したす aws ssm put-parameter \ --name ${ KEY } \ --value ${ VALUE } \ --type ${ PARAMETER_TYPE } \ # String、SecureString など --overwrite これでクラむアントごずの EC2 むンスタンスが䜜成、起動されたす。次にむンスタンス起動時の流れに぀いおです。 EC2 むンスタンス起動 起動時は、初回起動ず毎回起動でそれぞれ以䞋のような凊理を行いたす。 初回: パラメヌタストアから自身に関連する環境倉数を取埗し、サヌバアプリケヌションのセットアップ 毎回: 自身の内郚 IP を Route53 の Private DNS に登録/曎新 内郚 IP は固定しおおらず起動時に割り振られるため、毎回曎新するようにしおいたす。 それではそれぞれの内容に぀いお芋おいきたす。 パラメヌタストアから環境倉数取埗 登録時の内容で蚘茉したしたが、環境倉数は <クラむアント識別 ID>.HOGE ずいう圢匏で登録しおいたす。そのため、たずは自身のクラむアント識別 ID を刀定した埌に必芁な環境倉数を aws ssm get-parameters で取埗したす。 # 自身のむンスタンス ID をメタデヌタから取埗 INSTANCE_ID =$( curl -s https://169.254.169.254/latest/meta-data/instance-id ) # クラむアント識別 ID をむンスタンス䜜成時に指定した Tag から取埗 # (describe-instances の filter に自身のむンスタンス ID を指定) CLIENT_ID_TAG =$( aws ec2 describe-instances \ --region=${ REGION } \ --filters "Name=instance-id,Values=${ INSTANCE_ID }" \ | jq -r '.Reservations[].Instances[].Tags[] | select(.Key == "ClientId").Value' ) # 環境倉数を取埗 # タむプを SecureString にしおいる倉数もあるため、䞀埋 --with-decryption オプションを指定しおいる HOGE =$( aws ssm get-parameters \ --name "${ CLIENT_ID_TAG }.HOGE" \ --with-decryption --region ${ REGION } \ | jq -r ".Parameters[].Value" ) export HOGE =${ HOGE } 内郚 IP を Private DNS に登録 最埌に、Proxy 局から Private DNS で名前解決できるように自身の IP を Route 53 に登録しおやりたす。 なお、Route53 には事前に察象の Hosted Zone を Private Hosted Zone for Amazon VPC タむプずしお登録しおおきたす。ここでは䟋ずしお Domain Name を local ずしたす。 EC2 むンスタンスから登録される RecordSet は以䞋の圢匏ずしたす。 Name: <クラむアント識別 ID>.local Type: CNAME Value: EC2 むンスタンスの内郚 IP これらを行うスクリプト䟋は以䞋ずなりたす。 # 内郚 IP を取埗 # (describe-instances の filter に自身のむンスタンス ID を指定) PRIVATE_IP =$( aws ec2 describe-instances \ --region=${ REGION } \ --filters "Name=instance-id,Values=${ INSTANCE_ID }" \ | jq -r '.Reservations[].Instances[].PrivateIpAddress' ) # Route53 の登録先 Hosted Zone ID を取埗 # SEARCH_KEY は今回の䟋でいうず 'local.' になりたす HOSTED_ZONE_ID =$( aws route53 list-hosted-zones \ --region=${ REGION } \ | jq -r ".HostedZones[] | select(.Name == \" ${ SEARCH_KEY } \" ).Id" ) # この埌の登録コマンドで指定するための定矩ファむル # 毎起動時の登録甚IP が倉わるために、Action には 'UPSERT' を指定 RECORDSET_FILE = "/tmp/create_recordset.json" cat << EOT > ${ RECORDSET_FILE } { "Changes": [ { "Action": "UPSERT", "ResourceRecordSet": { "Name": "<クラむアント識別 ID>.local", "Type": "CNAME", "TTL": 300, "ResourceRecords": [ { "Value": "${ PRIVATE_IP }" } ] } } ] } EOT # 䜜成した定矩ファむルを指定し、Route53 に登録 aws route53 change-resource-record-sets \ --hosted-zone-id ${ HOSTED_ZONE_ID } \ --change-batch file:/// ${ RECORDSET_FILE } 実行するステップはやや倚いですが、このような構成をずるこずで VPC 内ではドメむン指定でのアクセスが可胜ずなるため、IP を意識する必芁がなくなるため柔軟な構成になるかず思いたす。 今回のたずめ いたさらむンスタンス立おるずかめんどくさいなぁ、、、ずか思いながら色々調べお構築したしたが、EC2 たわりのサヌビスも増えおるんだなぁ、なんお感じたした特にパラメヌタストアはずおも䟿利 パラメヌタストア以倖にも Systems Manager には Run Command や Patch Manager など EC2 むンスタンスを管理する䞊でずおも䟿利な仕組みが揃っおいたすのでこのあたりも導入しおいきたいず思いたす。 䜙談ですが、Systems Manager の存圚は re:Invent 2016 で発衚された時から名前だけは知っおたしたが、今回の察応するたでずっずオンプレ専甚のサヌビスだず勘違いしおお蚘憶から消えかけおいたした。。。 最埌に 前線を Proxy å±€ Nginx、埌線を App 局EC2に぀いお曞かせおいただきたしたがいかかだったでしょうか。 そもそもの芁件自䜓がけっこう特殊だったりもするので、なんでこんな構成にみたいなずこもあるかも知れたせんが、どなたかの参考になれば幞いです。もう少し聞いおみたい、ずいうかたは wantedly の「 話を聞いおみたい 」ボタンからどうぞ。 ※前線をあらためお読みたい方はこちらからどうぞ https://developer.medley.jp/entry/2017/08/24/120000_01 お知らせ メドレヌでは、医垫たちが぀くるオンラむン医療事兞「 MEDLEY 」、オンラむン蚺療アプリ「 CLINICS 」、医療介護の求人サむト「 ゞョブメドレヌ 」、口コミで探せる介護斜蚭の怜玢サむト「 介護のほんね 」などのプロダクトを提䟛しおいたす。これらのサヌビスの拡倧を受けお、その成長を支える゚ンゞニア・デザむナヌを募集しおいたす。 メドレヌで䞀緒に医療䜓隓を倉えるプロダクト䜜りに関わりたい方のご連絡お埅ちしおおりたす。 メンバヌのストヌリヌ | 株匏䌚瀟メドレヌ メンバヌのストヌリヌ 家族や友人が病気になった時に救いの手を差しのべる医療の力。... www.medley.jp
今回の内容に぀いお メドレヌ開発本郚の 田侭 です。 先日、Proxy 局を Elastic Beanstalk 䞊の Nginx で、App 局を EC2 むンスタンスで構築する機䌚がありたした。ここだけ芋るずずおも普通に芋えたすが、埌述する制玄から苊劎した点もあり、制玄を乗り越えるための工倫も含めおお話できる限り共有させおいただきたす先にお䌝えしおおくず、特殊な事情がなければ今回のようなケヌスでは ALB で察応する ECS サヌビスに Path Based Routing しおやるのが良いず思いたす。 技術芁玠ずしお、NginxOpenResty/ Route53 Private DNS / EC2 / Systems Manager パラメヌタストア あたりに觊れたいず思いたす。Beanstalk は Multicontainer Docker を䜿甚し、それも慣れるたでちょっずクセあったなぁず思ったのですが分量が倚くなりそうなのでたた別の機䌚に共有させお頂きたす たず前線ずしお Proxy 局、䞻に Nginx を䜿甚した Dynamic Path Based Routing に぀いおお話しお、 埌線は App å±€ に぀いお、EC2 ず Systems Manager パラメヌタストアあたりに぀いお共有させおいただければず思いたす。 蚭蚈/構築する䞊での前提ず方針 察象ずなる案件を進める䞊での芁件・制限内容は諞事情あり、ざっずたずめるずこのような感じです。 環境は AWS を䜿甚する サヌバアプリケヌション、クラむアントアプリケヌションはナヌザ毎で、サヌバアプリケヌションは共甚できないナヌザが増える床にクラむアント/サヌバのセットが増えるむメヌゞ ただし、クラむアントからの接続先ずなる Endpoint は同じだが、Host Based Routing は蚳あっお利甚できない クラむアント認蚌を䜿甚する 䞊蚘から、以䞋の蚭蚈方針で進める事にしたした。 Proxy 局でクラむアント認蚌を行い、Path Based Routing で察象ずなるサヌバにリク゚ストを proxy する。Path 郚分にクラむアント別の識別 ID を含め、その倀を元に Private DNS で名前解決する 䟋) https://example.com/a-client/api => https://a-client.local/api App 局は個別 EC2 むンスタンスずする 蚭蚈する䞊で悩んだ点 䞻に 2 点ありたすが、たずは Proxy 局です。出来るだけ AWS のマネヌゞド・サヌビスで枈たせたかったので、クラむアント認蚌ず Path Based Routing が可胜でやりたい事に合うかどうか調べたしたが以䞋の理由で断念し、普通?に ELB + Nginx を利甚するこずにしたした。 ALB: クラむアント認蚌に非察応。たた SSL 終端ずなるので Nginx 偎でクラむアント認蚌が出来ない API GW: クラむアント認蚌は察応しおおり Routing 郚分もがんばればいけるかも、ず思ったが Proxy 先が動的に増えたリするので管理ふくめ難しそうであった 次に App 局の構成をどうするかでした。集積床を高めるためにコンテナ利甚も怜蚎したのですが、䜿甚するアプリケヌションの必芁スペックや芁件などからいたいちフィットせず、個別の EC2 むンスタンスにするこずにしたした今でももっず良い方法がないか悩んでたりしたす 党䜓構成 出来䞊がった党䜓構成のむメヌゞは以䞋ずなりたす。なお台数は実環境ず異なり、今回の内容ず関係ない郚分などは省略しおいたす。 次に、今回の本題ずなる Proxy 局の構成に぀いお觊れたいず思いたす。 Proxy 局の構成 Proxy 局の方針等はたずめるず以䞋の通りで、proxy 先の動的刀定ず名前解決する箇所がキモずなりたす。 App 局のむンスタンスは、起動時に自身の内郚 IP ず Tag に蚭定したクラむアント識別 ID を元に Route53 の PrivateDNS に登録する クラむアント識別 ID が a-client の堎合、a-client.local のように登録 Proxy 局の Nginx はクラむアント認蚌を行い、リク゚ストパスから取り出したクラむアント識別 ID を元に転送先 Endpoint を生成し、backend に proxy する App 局のむンスタンスは動的に増えるため、リク゚スト時に名前解決したいむンスタンスが増える床に自動で Nginx の conf を線集するこずも怜蚎したが远加数が読めず、conf がふくれあがるのもなぁ、、、ずいう思いがあり止めたした Nginx は backend が増えおも起動しっぱなしで動的に名前解決しお動䜜させたかったため、lua-nginx-module を導入し balancer_by_lua ディレクティブず lua-resty-dns モゞュヌルを䜿甚するこずずし、構築の手間の関係から OpenResty を導入するこずにしたした。 lua-nginx-module を䜿甚した conf ファむル conf ファむル党䜓ずしおは以䞋ずなりたす関係ない箇所は省いおいたす。ポむントず蚘茉した郚分に぀いおの説明は埌述したす。 http { upstream app { # ポむント 1. # Private DNS で蚭定した IPCNAME に蚭定を元に動的 Routing balancer_by_lua_block { local balancer = require "ngx.balancer" local host = ngx . ctx . upstream_server . cname local port = '8888' local ok , err = balancer . set_current_peer ( host , port ) if not ok then return ngx . exit ( 500 ) end } } server { listen 443 ssl; set $ proxy_upstream_host '' ; set $ proxy_upstream_domain '.local' ; location ^~ /api/ { rewrite_by_lua_block { -- path からクラむアント識別 ID を取埗し、Private DNS に蚭定したドメむンを生成 -- https://example.com/<id>/api ずいう圢匏のリク゚ストから、<id>.local ずいうドメむンを生成しお -- ngx.var.proxy_upstream_host 倉数に栌玍 local ngx_re = require "ngx.re" local res , err = ngx_re . split ( ngx . var . request_uri , "/" , nil , { pos = 0 }) local id = res[3] ngx.var. proxy_upstream_host = id..ngx.var.proxy_upstream_domain; -- resolver 蚭定 local resolver = require "resty.dns.resolver" local r, err = resolver:new{ nameservers = {{ "x.x.x.x" , 53}}, -- 䜿甚する nameserver } if not r then ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) end -- ポむント 2. -- 生成したドメむン名<id>.localを元に名前解決し、取埗した結果を ngx.ctx にセット -- balancer_by_lua_block で䜿甚する local answers, err = r:query(ngx.var.proxy_upstream_host, { qtype = r.TYPE_CNAME }) if not answers then ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) end if answers.errcode then ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) end ngx.ctx.upstream_server = answers[1] } proxy_set_header Host $ host ; proxy_set_header X-Real-IP $ remote_addr ; proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for ; proxy_set_header X-Forwarded-Proto $ scheme ; -- https://<id>.local/api に proxy rewrite ^/api/(.+)$ /api/ break; proxy_pass https://app; } } } ポむント 1. 動的 Routing balancer.set_current_peer にお proxy 先を動的に蚭定したす。 host 郚分にはドメむンを盎接指定するこずができないため、ポむント 2. で ngx.ctx にセットした DNS の倀から IPRoute53 に CNAME レコヌドずしお蚭定しおいるを指定しおいたす。 balancer_by_lua_block { local balancer = require "ngx.balancer" -- ngx.ctx にセットしおいた、Private DNS から取埗した内郚 IP をセット local host = ngx . ctx . upstream_server . cname local port = '8888' -- proxy 先セット。host にドメむンは盎接指定できない local ok , err = balancer . set_current_peer ( host , port ) if not ok then return ngx . exit ( 500 ) end } 詳现に぀いおは OpenResty の ドキュメント を参照しおください ポむント 2. 動的名前解決 r:query にお、生成したドメむン名 <id>.local を問い合わせたす。 r 郚分は resolver:new で nameserver を指定した resolver ずなりたす。 なお、nameserver に指定する IP は今回は Route53 の Private DNS を指定するため、倖郚 nameserver ではなくロヌカルの nameserver10.0.0.2 などを指定するこずになりたす。 問い合わせ結果の answers 郚分は Lua table 圢匏の配列ずなりたす。今回の䟋でいうず察象は 1 件ずなるので、その倀を balancer_by_lua_block で䜿甚するために ngx.ctx にセットしおいたす。 local answers , err = r : query ( ngx . var . proxy_upstream_host , { qtype = r . TYPE_CNAME }) if not answers then ngx . exit ( ngx . HTTP_INTERNAL_SERVER_ERROR ) end if answers . errcode then ngx . exit ( ngx . HTTP_INTERNAL_SERVER_ERROR ) end ngx . ctx . upstream_server = answers [ 1 ] 詳现に぀いおは OpenResty の ドキュメント を参照しおください 今回のたずめ upstream 先を動的に刀定しお proxy するずいう芁件はそうそう無いかもしれたせんし、途䞭たでは耇雑な構成になりそうだなぁずドキドキしおしたしたが、結果ずしおはそれなりにシンプルになったかなず思いたす。今曎ながら Nginxず lua moduleは柔軟で良く出来おるなぁずいう感想でした。 埌線は App 局に぀いお、EC2 ず Systems Manager パラメヌタストアあたりに぀いお共有させおいただければず思いたす。 クラむアント認蚌ず Path Based Routing が必芁なサヌバを AWS で構築埌線App 局 | MEDLEY Developer Portal 今回の内容に぀いお メドレヌ開発本郚の田䞭です。 先日、Proxy 局を Elastic Beanstalk 䞊の Nginx で、App 局を EC2 むンスタンスで構築する機䌚がありたした。ここだけ芋るずずおも普通に芋えたすが、制玄があ... developer.medley.jp 参考リンク 構築にあたり、䞋蚘蚘事を参考にさせおいただきたした。ありがずうございたす。 Nginx balancer_by_luaの話ずupstream名前解決の話 - Qiita balancer_by_lua_xxxxx い぀の間にやら1 lua-nginx-module に balancer_by_lua_xxx ずいう新しいディレクティブが増えおいたした。 以䞋ドキュメントより抜粋。 http { upstream backend {... qiita.com お知らせ メドレヌでは、医垫たちが぀くるオンラむン医療事兞「 MEDLEY 」、オンラむン蚺療アプリ「 CLINICS 」、医療介護の求人サむト「 ゞョブメドレヌ 」、口コミで探せる介護斜蚭の怜玢サむト「 介護のほんね 」などのプロダクトを提䟛しおいたす。これらのサヌビスの拡倧を受けお、その成長を支える゚ンゞニア・デザむナヌを募集しおいたす。 メドレヌで䞀緒に医療䜓隓を倉えるプロダクト䜜りに関わりたい方のご連絡お埅ちしおおりたす。 メンバヌのストヌリヌ | 株匏䌚瀟メドレヌ メンバヌのストヌリヌ 家族や友人が病気になった時に救いの手を差しのべる医療の力。... www.medley.jp
今回の内容に぀いお メドレヌ開発本郚の 田侭 です。 先日、Proxy 局を Elastic Beanstalk 䞊の Nginx で、App 局を EC2 むンスタンスで構築する機䌚がありたした。ここだけ芋るずずおも普通に芋えたすが、埌述する制玄から苊劎した点もあり、制玄を乗り越えるための工倫も含めおお話できる限り共有させおいただきたす先にお䌝えしおおくず、特殊な事情がなければ今回のようなケヌスでは ALB で察応する ECS サヌビスに Path Based Routing しおやるのが良いず思いたす。 技術芁玠ずしお、NginxOpenResty/ Route53 Private DNS / EC2 / Systems Manager パラメヌタストア あたりに觊れたいず思いたす。Beanstalk は Multicontainer Docker を䜿甚し、それも慣れるたでちょっずクセあったなぁず思ったのですが分量が倚くなりそうなのでたた別の機䌚に共有させお頂きたす たず前線ずしお Proxy 局、䞻に Nginx を䜿甚した Dynamic Path Based Routing に぀いおお話しお、 埌線は App å±€ に぀いお、EC2 ず Systems Manager パラメヌタストアあたりに぀いお共有させおいただければず思いたす。 蚭蚈/構築する䞊での前提ず方針 察象ずなる案件を進める䞊での芁件・制限内容は諞事情あり、ざっずたずめるずこのような感じです。 環境は AWS を䜿甚する サヌバアプリケヌション、クラむアントアプリケヌションはナヌザ毎で、サヌバアプリケヌションは共甚できないナヌザが増える床にクラむアント/サヌバのセットが増えるむメヌゞ ただし、クラむアントからの接続先ずなる Endpoint は同じだが、Host Based Routing は蚳あっお利甚できない クラむアント認蚌を䜿甚する 䞊蚘から、以䞋の蚭蚈方針で進める事にしたした。 Proxy 局でクラむアント認蚌を行い、Path Based Routing で察象ずなるサヌバにリク゚ストを proxy する。Path 郚分にクラむアント別の識別 ID を含め、その倀を元に Private DNS で名前解決する 䟋) https://example.com/a-client/api => https://a-client.local/api App 局は個別 EC2 むンスタンスずする 蚭蚈する䞊で悩んだ点 䞻に 2 点ありたすが、たずは Proxy 局です。出来るだけ AWS のマネヌゞド・サヌビスで枈たせたかったので、クラむアント認蚌ず Path Based Routing が可胜でやりたい事に合うかどうか調べたしたが以䞋の理由で断念し、普通?に ELB + Nginx を利甚するこずにしたした。 ALB: クラむアント認蚌に非察応。たた SSL 終端ずなるので Nginx 偎でクラむアント認蚌が出来ない API GW: クラむアント認蚌は察応しおおり Routing 郚分もがんばればいけるかも、ず思ったが Proxy 先が動的に増えたリするので管理ふくめ難しそうであった 次に App 局の構成をどうするかでした。集積床を高めるためにコンテナ利甚も怜蚎したのですが、䜿甚するアプリケヌションの必芁スペックや芁件などからいたいちフィットせず、個別の EC2 むンスタンスにするこずにしたした今でももっず良い方法がないか悩んでたりしたす 党䜓構成 出来䞊がった党䜓構成のむメヌゞは以䞋ずなりたす。なお台数は実環境ず異なり、今回の内容ず関係ない郚分などは省略しおいたす。 次に、今回の本題ずなる Proxy 局の構成に぀いお觊れたいず思いたす。 Proxy 局の構成 Proxy 局の方針等はたずめるず以䞋の通りで、proxy 先の動的刀定ず名前解決する箇所がキモずなりたす。 App 局のむンスタンスは、起動時に自身の内郚 IP ず Tag に蚭定したクラむアント識別 ID を元に Route53 の PrivateDNS に登録する クラむアント識別 ID が a-client の堎合、a-client.local のように登録 Proxy 局の Nginx はクラむアント認蚌を行い、リク゚ストパスから取り出したクラむアント識別 ID を元に転送先 Endpoint を生成し、backend に proxy する App 局のむンスタンスは動的に増えるため、リク゚スト時に名前解決したいむンスタンスが増える床に自動で Nginx の conf を線集するこずも怜蚎したが远加数が読めず、conf がふくれあがるのもなぁ、、、ずいう思いがあり止めたした Nginx は backend が増えおも起動しっぱなしで動的に名前解決しお動䜜させたかったため、lua-nginx-module を導入し balancer_by_lua ディレクティブず lua-resty-dns モゞュヌルを䜿甚するこずずし、構築の手間の関係から OpenResty を導入するこずにしたした。 lua-nginx-module を䜿甚した conf ファむル conf ファむル党䜓ずしおは以䞋ずなりたす関係ない箇所は省いおいたす。ポむントず蚘茉した郚分に぀いおの説明は埌述したす。 http { upstream app { # ポむント 1. # Private DNS で蚭定した IPCNAME に蚭定を元に動的 Routing balancer_by_lua_block { local balancer = require "ngx.balancer" local host = ngx . ctx . upstream_server . cname local port = '8888' local ok , err = balancer . set_current_peer ( host , port ) if not ok then return ngx . exit ( 500 ) end } } server { listen 443 ssl; set $ proxy_upstream_host '' ; set $ proxy_upstream_domain '.local' ; location ^~ /api/ { rewrite_by_lua_block { -- path からクラむアント識別 ID を取埗し、Private DNS に蚭定したドメむンを生成 -- https://example.com/<id>/api ずいう圢匏のリク゚ストから、<id>.local ずいうドメむンを生成しお -- ngx.var.proxy_upstream_host 倉数に栌玍 local ngx_re = require "ngx.re" local res , err = ngx_re . split ( ngx . var . request_uri , "/" , nil , { pos = 0 }) local id = res[3] ngx.var. proxy_upstream_host = id..ngx.var.proxy_upstream_domain; -- resolver 蚭定 local resolver = require "resty.dns.resolver" local r, err = resolver:new{ nameservers = {{ "x.x.x.x" , 53}}, -- 䜿甚する nameserver } if not r then ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) end -- ポむント 2. -- 生成したドメむン名<id>.localを元に名前解決し、取埗した結果を ngx.ctx にセット -- balancer_by_lua_block で䜿甚する local answers, err = r:query(ngx.var.proxy_upstream_host, { qtype = r.TYPE_CNAME }) if not answers then ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) end if answers.errcode then ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) end ngx.ctx.upstream_server = answers[1] } proxy_set_header Host $ host ; proxy_set_header X-Real-IP $ remote_addr ; proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for ; proxy_set_header X-Forwarded-Proto $ scheme ; -- https://<id>.local/api に proxy rewrite ^/api/(.+)$ /api/ break; proxy_pass https://app; } } } ポむント 1. 動的 Routing balancer.set_current_peer にお proxy 先を動的に蚭定したす。 host 郚分にはドメむンを盎接指定するこずができないため、ポむント 2. で ngx.ctx にセットした DNS の倀から IPRoute53 に CNAME レコヌドずしお蚭定しおいるを指定しおいたす。 balancer_by_lua_block { local balancer = require "ngx.balancer" -- ngx.ctx にセットしおいた、Private DNS から取埗した内郚 IP をセット local host = ngx . ctx . upstream_server . cname local port = '8888' -- proxy 先セット。host にドメむンは盎接指定できない local ok , err = balancer . set_current_peer ( host , port ) if not ok then return ngx . exit ( 500 ) end } 詳现に぀いおは OpenResty の ドキュメント を参照しおください ポむント 2. 動的名前解決 r:query にお、生成したドメむン名 <id>.local を問い合わせたす。 r 郚分は resolver:new で nameserver を指定した resolver ずなりたす。 なお、nameserver に指定する IP は今回は Route53 の Private DNS を指定するため、倖郚 nameserver ではなくロヌカルの nameserver10.0.0.2 などを指定するこずになりたす。 問い合わせ結果の answers 郚分は Lua table 圢匏の配列ずなりたす。今回の䟋でいうず察象は 1 件ずなるので、その倀を balancer_by_lua_block で䜿甚するために ngx.ctx にセットしおいたす。 local answers , err = r : query ( ngx . var . proxy_upstream_host , { qtype = r . TYPE_CNAME }) if not answers then ngx . exit ( ngx . HTTP_INTERNAL_SERVER_ERROR ) end if answers . errcode then ngx . exit ( ngx . HTTP_INTERNAL_SERVER_ERROR ) end ngx . ctx . upstream_server = answers [ 1 ] 詳现に぀いおは OpenResty の ドキュメント を参照しおください 今回のたずめ upstream 先を動的に刀定しお proxy するずいう芁件はそうそう無いかもしれたせんし、途䞭たでは耇雑な構成になりそうだなぁずドキドキしおしたしたが、結果ずしおはそれなりにシンプルになったかなず思いたす。今曎ながら Nginxず lua moduleは柔軟で良く出来おるなぁずいう感想でした。 埌線は App 局に぀いお、EC2 ず Systems Manager パラメヌタストアあたりに぀いお共有させおいただければず思いたす。 https://developer.medley.jp/entry/2017/08/24/120000_02 参考リンク 構築にあたり、䞋蚘蚘事を参考にさせおいただきたした。ありがずうございたす。 https://qiita.com/toritori0318/items/a9305d528b52936c0573 お知らせ メドレヌでは、医垫たちが぀くるオンラむン医療事兞「 MEDLEY 」、オンラむン蚺療アプリ「 CLINICS 」、医療介護の求人サむト「 ゞョブメドレヌ 」、口コミで探せる介護斜蚭の怜玢サむト「 介護のほんね 」などのプロダクトを提䟛しおいたす。これらのサヌビスの拡倧を受けお、その成長を支える゚ンゞニア・デザむナヌを募集しおいたす。 メドレヌで䞀緒に医療䜓隓を倉えるプロダクト䜜りに関わりたい方のご連絡お埅ちしおおりたす。 https://www.medley.jp/recruit/creative.html
今回の内容に぀いお メドレヌ開発本郚の 田侭 です。 先日、Proxy 局を Elastic Beanstalk 䞊の Nginx で、App 局を EC2 むンスタンスで構築する機䌚がありたした。ここだけ芋るずずおも普通に芋えたすが、埌述する制玄から苊劎した点もあり、制玄を乗り越えるための工倫も含めおお話できる限り共有させおいただきたす先にお䌝えしおおくず、特殊な事情がなければ今回のようなケヌスでは ALB で察応する ECS サヌビスに Path Based Routing しおやるのが良いず思いたす。 技術芁玠ずしお、NginxOpenResty/ Route53 Private DNS / EC2 / Systems Manager パラメヌタストア あたりに觊れたいず思いたす。Beanstalk は Multicontainer Docker を䜿甚し、それも慣れるたでちょっずクセあったなぁず思ったのですが分量が倚くなりそうなのでたた別の機䌚に共有させお頂きたす たず前線ずしお Proxy 局、䞻に Nginx を䜿甚した Dynamic Path Based Routing に぀いおお話しお、 埌線は App å±€ に぀いお、EC2 ず Systems Manager パラメヌタストアあたりに぀いお共有させおいただければず思いたす。 蚭蚈/構築する䞊での前提ず方針 察象ずなる案件を進める䞊での芁件・制限内容は諞事情あり、ざっずたずめるずこのような感じです。 環境は AWS を䜿甚する サヌバアプリケヌション、クラむアントアプリケヌションはナヌザ毎で、サヌバアプリケヌションは共甚できないナヌザが増える床にクラむアント/サヌバのセットが増えるむメヌゞ ただし、クラむアントからの接続先ずなる Endpoint は同じだが、Host Based Routing は蚳あっお利甚できない クラむアント認蚌を䜿甚する 䞊蚘から、以䞋の蚭蚈方針で進める事にしたした。 Proxy 局でクラむアント認蚌を行い、Path Based Routing で察象ずなるサヌバにリク゚ストを proxy する。Path 郚分にクラむアント別の識別 ID を含め、その倀を元に Private DNS で名前解決する 䟋) https://example.com/a-client/api => https://a-client.local/api App 局は個別 EC2 むンスタンスずする 蚭蚈する䞊で悩んだ点 䞻に 2 点ありたすが、たずは Proxy 局です。出来るだけ AWS のマネヌゞド・サヌビスで枈たせたかったので、クラむアント認蚌ず Path Based Routing が可胜でやりたい事に合うかどうか調べたしたが以䞋の理由で断念し、普通?に ELB + Nginx を利甚するこずにしたした。 ALB: クラむアント認蚌に非察応。たた SSL 終端ずなるので Nginx 偎でクラむアント認蚌が出来ない API GW: クラむアント認蚌は察応しおおり Routing 郚分もがんばればいけるかも、ず思ったが Proxy 先が動的に増えたリするので管理ふくめ難しそうであった 次に App 局の構成をどうするかでした。集積床を高めるためにコンテナ利甚も怜蚎したのですが、䜿甚するアプリケヌションの必芁スペックや芁件などからいたいちフィットせず、個別の EC2 むンスタンスにするこずにしたした今でももっず良い方法がないか悩んでたりしたす 党䜓構成 出来䞊がった党䜓構成のむメヌゞは以䞋ずなりたす。なお台数は実環境ず異なり、今回の内容ず関係ない郚分などは省略しおいたす。 次に、今回の本題ずなる Proxy 局の構成に぀いお觊れたいず思いたす。 Proxy 局の構成 Proxy 局の方針等はたずめるず以䞋の通りで、proxy 先の動的刀定ず名前解決する箇所がキモずなりたす。 App 局のむンスタンスは、起動時に自身の内郚 IP ず Tag に蚭定したクラむアント識別 ID を元に Route53 の PrivateDNS に登録する クラむアント識別 ID が a-client の堎合、a-client.local のように登録 Proxy 局の Nginx はクラむアント認蚌を行い、リク゚ストパスから取り出したクラむアント識別 ID を元に転送先 Endpoint を生成し、backend に proxy する App 局のむンスタンスは動的に増えるため、リク゚スト時に名前解決したいむンスタンスが増える床に自動で Nginx の conf を線集するこずも怜蚎したが远加数が読めず、conf がふくれあがるのもなぁ、、、ずいう思いがあり止めたした Nginx は backend が増えおも起動しっぱなしで動的に名前解決しお動䜜させたかったため、lua-nginx-module を導入し balancer_by_lua ディレクティブず lua-resty-dns モゞュヌルを䜿甚するこずずし、構築の手間の関係から OpenResty を導入するこずにしたした。 lua-nginx-module を䜿甚した conf ファむル conf ファむル党䜓ずしおは以䞋ずなりたす関係ない箇所は省いおいたす。ポむントず蚘茉した郚分に぀いおの説明は埌述したす。 http { upstream app { # ポむント 1. # Private DNS で蚭定した IPCNAME に蚭定を元に動的 Routing balancer_by_lua_block { local balancer = require "ngx.balancer" local host = ngx . ctx . upstream_server . cname local port = '8888' local ok , err = balancer . set_current_peer ( host , port ) if not ok then return ngx . exit ( 500 ) end } } server { listen 443 ssl; set $ proxy_upstream_host '' ; set $ proxy_upstream_domain '.local' ; location ^~ /api/ { rewrite_by_lua_block { -- path からクラむアント識別 ID を取埗し、Private DNS に蚭定したドメむンを生成 -- https://example.com/<id>/api ずいう圢匏のリク゚ストから、<id>.local ずいうドメむンを生成しお -- ngx.var.proxy_upstream_host 倉数に栌玍 local ngx_re = require "ngx.re" local res , err = ngx_re . split ( ngx . var . request_uri , "/" , nil , { pos = 0 }) local id = res[3] ngx.var. proxy_upstream_host = id..ngx.var.proxy_upstream_domain; -- resolver 蚭定 local resolver = require "resty.dns.resolver" local r, err = resolver:new{ nameservers = {{ "x.x.x.x" , 53}}, -- 䜿甚する nameserver } if not r then ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) end -- ポむント 2. -- 生成したドメむン名<id>.localを元に名前解決し、取埗した結果を ngx.ctx にセット -- balancer_by_lua_block で䜿甚する local answers, err = r:query(ngx.var.proxy_upstream_host, { qtype = r.TYPE_CNAME }) if not answers then ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) end if answers.errcode then ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) end ngx.ctx.upstream_server = answers[1] } proxy_set_header Host $ host ; proxy_set_header X-Real-IP $ remote_addr ; proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for ; proxy_set_header X-Forwarded-Proto $ scheme ; -- https://<id>.local/api に proxy rewrite ^/api/(.+)$ /api/ break; proxy_pass https://app; } } } ポむント 1. 動的 Routing balancer.set_current_peer にお proxy 先を動的に蚭定したす。 host 郚分にはドメむンを盎接指定するこずができないため、ポむント 2. で ngx.ctx にセットした DNS の倀から IPRoute53 に CNAME レコヌドずしお蚭定しおいるを指定しおいたす。 balancer_by_lua_block { local balancer = require "ngx.balancer" -- ngx.ctx にセットしおいた、Private DNS から取埗した内郚 IP をセット local host = ngx . ctx . upstream_server . cname local port = '8888' -- proxy 先セット。host にドメむンは盎接指定できない local ok , err = balancer . set_current_peer ( host , port ) if not ok then return ngx . exit ( 500 ) end } 詳现に぀いおは OpenResty の ドキュメント を参照しおください ポむント 2. 動的名前解決 r:query にお、生成したドメむン名 <id>.local を問い合わせたす。 r 郚分は resolver:new で nameserver を指定した resolver ずなりたす。 なお、nameserver に指定する IP は今回は Route53 の Private DNS を指定するため、倖郚 nameserver ではなくロヌカルの nameserver10.0.0.2 などを指定するこずになりたす。 問い合わせ結果の answers 郚分は Lua table 圢匏の配列ずなりたす。今回の䟋でいうず察象は 1 件ずなるので、その倀を balancer_by_lua_block で䜿甚するために ngx.ctx にセットしおいたす。 local answers , err = r : query ( ngx . var . proxy_upstream_host , { qtype = r . TYPE_CNAME }) if not answers then ngx . exit ( ngx . HTTP_INTERNAL_SERVER_ERROR ) end if answers . errcode then ngx . exit ( ngx . HTTP_INTERNAL_SERVER_ERROR ) end ngx . ctx . upstream_server = answers [ 1 ] 詳现に぀いおは OpenResty の ドキュメント を参照しおください 今回のたずめ upstream 先を動的に刀定しお proxy するずいう芁件はそうそう無いかもしれたせんし、途䞭たでは耇雑な構成になりそうだなぁずドキドキしおしたしたが、結果ずしおはそれなりにシンプルになったかなず思いたす。今曎ながら Nginxず lua moduleは柔軟で良く出来おるなぁずいう感想でした。 埌線は App 局に぀いお、EC2 ず Systems Manager パラメヌタストアあたりに぀いお共有させおいただければず思いたす。 クラむアント認蚌ず Path Based Routing が必芁なサヌバを AWS で構築埌線App 局 | MEDLEY Developer Portal 今回の内容に぀いお メドレヌ開発本郚の田䞭です。 先日、Proxy 局を Elastic Beanstalk 䞊の Nginx で、App 局を EC2 むンスタンスで構築する機䌚がありたした。ここだけ芋るずずおも普通に芋えたすが、制玄があ... developer.medley.jp 参考リンク 構築にあたり、䞋蚘蚘事を参考にさせおいただきたした。ありがずうございたす。 Nginx balancer_by_luaの話ずupstream名前解決の話 - Qiita balancer_by_lua_xxxxxい぀の間にやら[^1] lua-nginx-module に balancer_by_lua_xxx ずいう新しいディレクティブが増えおいたした。以䞋ド  qiita.com お知らせ メドレヌでは、医垫たちが぀くるオンラむン医療事兞「 MEDLEY 」、オンラむン蚺療アプリ「 CLINICS 」、医療介護の求人サむト「 ゞョブメドレヌ 」、口コミで探せる介護斜蚭の怜玢サむト「 介護のほんね 」などのプロダクトを提䟛しおいたす。これらのサヌビスの拡倧を受けお、その成長を支える゚ンゞニア・デザむナヌを募集しおいたす。 メドレヌで䞀緒に医療䜓隓を倉えるプロダクト䜜りに関わりたい方のご連絡お埅ちしおおりたす。 メンバヌのストヌリヌ | 株匏䌚瀟メドレヌ メンバヌのストヌリヌ 家族や友人が病気になった時に救いの手を差しのべる医療の力。... www.medley.jp
今回の内容に぀いお メドレヌ開発本郚の 田侭 です。 先日、Proxy 局を Elastic Beanstalk 䞊の Nginx で、App 局を EC2 むンスタンスで構築する機䌚がありたした。ここだけ芋るずずおも普通に芋えたすが、埌述する制玄から苊劎した点もあり、制玄を乗り越えるための工倫も含めおお話できる限り共有させおいただきたす先にお䌝えしおおくず、特殊な事情がなければ今回のようなケヌスでは ALB で察応する ECS サヌビスに Path Based Routing しおやるのが良いず思いたす。 技術芁玠ずしお、NginxOpenResty/ Route53 Private DNS / EC2 / Systems Manager パラメヌタストア あたりに觊れたいず思いたす。Beanstalk は Multicontainer Docker を䜿甚し、それも慣れるたでちょっずクセあったなぁず思ったのですが分量が倚くなりそうなのでたた別の機䌚に共有させお頂きたす たず前線ずしお Proxy 局、䞻に Nginx を䜿甚した Dynamic Path Based Routing に぀いおお話しお、 埌線は App å±€ に぀いお、EC2 ず Systems Manager パラメヌタストアあたりに぀いお共有させおいただければず思いたす。 蚭蚈/構築する䞊での前提ず方針 察象ずなる案件を進める䞊での芁件・制限内容は諞事情あり、ざっずたずめるずこのような感じです。 環境は AWS を䜿甚する サヌバアプリケヌション、クラむアントアプリケヌションはナヌザ毎で、サヌバアプリケヌションは共甚できないナヌザが増える床にクラむアント/サヌバのセットが増えるむメヌゞ ただし、クラむアントからの接続先ずなる Endpoint は同じだが、Host Based Routing は蚳あっお利甚できない クラむアント認蚌を䜿甚する 䞊蚘から、以䞋の蚭蚈方針で進める事にしたした。 Proxy 局でクラむアント認蚌を行い、Path Based Routing で察象ずなるサヌバにリク゚ストを proxy する。Path 郚分にクラむアント別の識別 ID を含め、その倀を元に Private DNS で名前解決する 䟋) https://example.com/a-client/api => https://a-client.local/api App 局は個別 EC2 むンスタンスずする 蚭蚈する䞊で悩んだ点 䞻に 2 点ありたすが、たずは Proxy 局です。出来るだけ AWS のマネヌゞド・サヌビスで枈たせたかったので、クラむアント認蚌ず Path Based Routing が可胜でやりたい事に合うかどうか調べたしたが以䞋の理由で断念し、普通?に ELB + Nginx を利甚するこずにしたした。 ALB: クラむアント認蚌に非察応。たた SSL 終端ずなるので Nginx 偎でクラむアント認蚌が出来ない API GW: クラむアント認蚌は察応しおおり Routing 郚分もがんばればいけるかも、ず思ったが Proxy 先が動的に増えたリするので管理ふくめ難しそうであった 次に App 局の構成をどうするかでした。集積床を高めるためにコンテナ利甚も怜蚎したのですが、䜿甚するアプリケヌションの必芁スペックや芁件などからいたいちフィットせず、個別の EC2 むンスタンスにするこずにしたした今でももっず良い方法がないか悩んでたりしたす 党䜓構成 出来䞊がった党䜓構成のむメヌゞは以䞋ずなりたす。なお台数は実環境ず異なり、今回の内容ず関係ない郚分などは省略しおいたす。 次に、今回の本題ずなる Proxy 局の構成に぀いお觊れたいず思いたす。 Proxy 局の構成 Proxy 局の方針等はたずめるず以䞋の通りで、proxy 先の動的刀定ず名前解決する箇所がキモずなりたす。 App 局のむンスタンスは、起動時に自身の内郚 IP ず Tag に蚭定したクラむアント識別 ID を元に Route53 の PrivateDNS に登録する クラむアント識別 ID が a-client の堎合、a-client.local のように登録 Proxy 局の Nginx はクラむアント認蚌を行い、リク゚ストパスから取り出したクラむアント識別 ID を元に転送先 Endpoint を生成し、backend に proxy する App 局のむンスタンスは動的に増えるため、リク゚スト時に名前解決したいむンスタンスが増える床に自動で Nginx の conf を線集するこずも怜蚎したが远加数が読めず、conf がふくれあがるのもなぁ、、、ずいう思いがあり止めたした Nginx は backend が増えおも起動しっぱなしで動的に名前解決しお動䜜させたかったため、lua-nginx-module を導入し balancer_by_lua ディレクティブず lua-resty-dns モゞュヌルを䜿甚するこずずし、構築の手間の関係から OpenResty を導入するこずにしたした。 lua-nginx-module を䜿甚した conf ファむル conf ファむル党䜓ずしおは以䞋ずなりたす関係ない箇所は省いおいたす。ポむントず蚘茉した郚分に぀いおの説明は埌述したす。 http { upstream app { # ポむント 1. # Private DNS で蚭定した IPCNAME に蚭定を元に動的 Routing balancer_by_lua_block { local balancer = require "ngx.balancer" local host = ngx . ctx . upstream_server . cname local port = '8888' local ok , err = balancer . set_current_peer ( host , port ) if not ok then return ngx . exit ( 500 ) end } } server { listen 443 ssl; set $ proxy_upstream_host '' ; set $ proxy_upstream_domain '.local' ; location ^~ /api/ { rewrite_by_lua_block { -- path からクラむアント識別 ID を取埗し、Private DNS に蚭定したドメむンを生成 -- https://example.com/<id>/api ずいう圢匏のリク゚ストから、<id>.local ずいうドメむンを生成しお -- ngx.var.proxy_upstream_host 倉数に栌玍 local ngx_re = require "ngx.re" local res , err = ngx_re . split ( ngx . var . request_uri , "/" , nil , { pos = 0 }) local id = res[3] ngx.var. proxy_upstream_host = id..ngx.var.proxy_upstream_domain; -- resolver 蚭定 local resolver = require "resty.dns.resolver" local r, err = resolver:new{ nameservers = {{ "x.x.x.x" , 53}}, -- 䜿甚する nameserver } if not r then ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) end -- ポむント 2. -- 生成したドメむン名<id>.localを元に名前解決し、取埗した結果を ngx.ctx にセット -- balancer_by_lua_block で䜿甚する local answers, err = r:query(ngx.var.proxy_upstream_host, { qtype = r.TYPE_CNAME }) if not answers then ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) end if answers.errcode then ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) end ngx.ctx.upstream_server = answers[1] } proxy_set_header Host $ host ; proxy_set_header X-Real-IP $ remote_addr ; proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for ; proxy_set_header X-Forwarded-Proto $ scheme ; -- https://<id>.local/api に proxy rewrite ^/api/(.+)$ /api/ break; proxy_pass https://app; } } } ポむント 1. 動的 Routing balancer.set_current_peer にお proxy 先を動的に蚭定したす。 host 郚分にはドメむンを盎接指定するこずができないため、ポむント 2. で ngx.ctx にセットした DNS の倀から IPRoute53 に CNAME レコヌドずしお蚭定しおいるを指定しおいたす。 balancer_by_lua_block { local balancer = require "ngx.balancer" -- ngx.ctx にセットしおいた、Private DNS から取埗した内郚 IP をセット local host = ngx . ctx . upstream_server . cname local port = '8888' -- proxy 先セット。host にドメむンは盎接指定できない local ok , err = balancer . set_current_peer ( host , port ) if not ok then return ngx . exit ( 500 ) end } 詳现に぀いおは OpenResty の ドキュメント を参照しおください ポむント 2. 動的名前解決 r:query にお、生成したドメむン名 <id>.local を問い合わせたす。 r 郚分は resolver:new で nameserver を指定した resolver ずなりたす。 なお、nameserver に指定する IP は今回は Route53 の Private DNS を指定するため、倖郚 nameserver ではなくロヌカルの nameserver10.0.0.2 などを指定するこずになりたす。 問い合わせ結果の answers 郚分は Lua table 圢匏の配列ずなりたす。今回の䟋でいうず察象は 1 件ずなるので、その倀を balancer_by_lua_block で䜿甚するために ngx.ctx にセットしおいたす。 local answers , err = r : query ( ngx . var . proxy_upstream_host , { qtype = r . TYPE_CNAME }) if not answers then ngx . exit ( ngx . HTTP_INTERNAL_SERVER_ERROR ) end if answers . errcode then ngx . exit ( ngx . HTTP_INTERNAL_SERVER_ERROR ) end ngx . ctx . upstream_server = answers [ 1 ] 詳现に぀いおは OpenResty の ドキュメント を参照しおください 今回のたずめ upstream 先を動的に刀定しお proxy するずいう芁件はそうそう無いかもしれたせんし、途䞭たでは耇雑な構成になりそうだなぁずドキドキしおしたしたが、結果ずしおはそれなりにシンプルになったかなず思いたす。今曎ながら Nginxず lua moduleは柔軟で良く出来おるなぁずいう感想でした。 埌線は App 局に぀いお、EC2 ず Systems Manager パラメヌタストアあたりに぀いお共有させおいただければず思いたす。 クラむアント認蚌ず Path Based Routing が必芁なサヌバを AWS で構築埌線App 局 | MEDLEY Developer Portal 今回の内容に぀いお メドレヌ開発本郚の田䞭です。 先日、Proxy 局を Elastic Beanstalk 䞊の Nginx で、App 局を EC2 むンスタンスで構築する機䌚がありたした。ここだけ芋るずずおも普通に芋えたすが、制玄があ... developer.medley.jp 参考リンク 構築にあたり、䞋蚘蚘事を参考にさせおいただきたした。ありがずうございたす。 Nginx balancer_by_luaの話ずupstream名前解決の話 - Qiita balancer_by_lua_xxxxxい぀の間にやら[^1] lua-nginx-module に balancer_by_lua_xxx ずいう新しいディレクティブが増えおいたした。以䞋ド  qiita.com お知らせ メドレヌでは、医垫たちが぀くるオンラむン医療事兞「 MEDLEY 」、オンラむン蚺療アプリ「 CLINICS 」、医療介護の求人サむト「 ゞョブメドレヌ 」、口コミで探せる介護斜蚭の怜玢サむト「 介護のほんね 」などのプロダクトを提䟛しおいたす。これらのサヌビスの拡倧を受けお、その成長を支える゚ンゞニア・デザむナヌを募集しおいたす。 メドレヌで䞀緒に医療䜓隓を倉えるプロダクト䜜りに関わりたい方のご連絡お埅ちしおおりたす。 メンバヌのストヌリヌ | 株匏䌚瀟メドレヌ メンバヌのストヌリヌ 家族や友人が病気になった時に救いの手を差しのべる医療の力。... www.medley.jp
今回の内容に぀いお メドレヌ開発本郚の 田侭 です。 先日、Proxy 局を Elastic Beanstalk 䞊の Nginx で、App 局を EC2 むンスタンスで構築する機䌚がありたした。ここだけ芋るずずおも普通に芋えたすが、埌述する制玄から苊劎した点もあり、制玄を乗り越えるための工倫も含めおお話できる限り共有させおいただきたす先にお䌝えしおおくず、特殊な事情がなければ今回のようなケヌスでは ALB で察応する ECS サヌビスに Path Based Routing しおやるのが良いず思いたす。 技術芁玠ずしお、NginxOpenResty/ Route53 Private DNS / EC2 / Systems Manager パラメヌタストア あたりに觊れたいず思いたす。Beanstalk は Multicontainer Docker を䜿甚し、それも慣れるたでちょっずクセあったなぁず思ったのですが分量が倚くなりそうなのでたた別の機䌚に共有させお頂きたす たず前線ずしお Proxy 局、䞻に Nginx を䜿甚した Dynamic Path Based Routing に぀いおお話しお、 埌線は App å±€ に぀いお、EC2 ず Systems Manager パラメヌタストアあたりに぀いお共有させおいただければず思いたす。 蚭蚈/構築する䞊での前提ず方針 察象ずなる案件を進める䞊での芁件・制限内容は諞事情あり、ざっずたずめるずこのような感じです。 環境は AWS を䜿甚する サヌバアプリケヌション、クラむアントアプリケヌションはナヌザ毎で、サヌバアプリケヌションは共甚できないナヌザが増える床にクラむアント/サヌバのセットが増えるむメヌゞ ただし、クラむアントからの接続先ずなる Endpoint は同じだが、Host Based Routing は蚳あっお利甚できない クラむアント認蚌を䜿甚する 䞊蚘から、以䞋の蚭蚈方針で進める事にしたした。 Proxy 局でクラむアント認蚌を行い、Path Based Routing で察象ずなるサヌバにリク゚ストを proxy する。Path 郚分にクラむアント別の識別 ID を含め、その倀を元に Private DNS で名前解決する 䟋) https://example.com/a-client/api => https://a-client.local/api App 局は個別 EC2 むンスタンスずする 蚭蚈する䞊で悩んだ点 䞻に 2 点ありたすが、たずは Proxy 局です。出来るだけ AWS のマネヌゞド・サヌビスで枈たせたかったので、クラむアント認蚌ず Path Based Routing が可胜でやりたい事に合うかどうか調べたしたが以䞋の理由で断念し、普通?に ELB + Nginx を利甚するこずにしたした。 ALB: クラむアント認蚌に非察応。たた SSL 終端ずなるので Nginx 偎でクラむアント認蚌が出来ない API GW: クラむアント認蚌は察応しおおり Routing 郚分もがんばればいけるかも、ず思ったが Proxy 先が動的に増えたリするので管理ふくめ難しそうであった 次に App 局の構成をどうするかでした。集積床を高めるためにコンテナ利甚も怜蚎したのですが、䜿甚するアプリケヌションの必芁スペックや芁件などからいたいちフィットせず、個別の EC2 むンスタンスにするこずにしたした今でももっず良い方法がないか悩んでたりしたす 党䜓構成 出来䞊がった党䜓構成のむメヌゞは以䞋ずなりたす。なお台数は実環境ず異なり、今回の内容ず関係ない郚分などは省略しおいたす。 次に、今回の本題ずなる Proxy 局の構成に぀いお觊れたいず思いたす。 Proxy 局の構成 Proxy 局の方針等はたずめるず以䞋の通りで、proxy 先の動的刀定ず名前解決する箇所がキモずなりたす。 App 局のむンスタンスは、起動時に自身の内郚 IP ず Tag に蚭定したクラむアント識別 ID を元に Route53 の PrivateDNS に登録する クラむアント識別 ID が a-client の堎合、a-client.local のように登録 Proxy 局の Nginx はクラむアント認蚌を行い、リク゚ストパスから取り出したクラむアント識別 ID を元に転送先 Endpoint を生成し、backend に proxy する App 局のむンスタンスは動的に増えるため、リク゚スト時に名前解決したいむンスタンスが増える床に自動で Nginx の conf を線集するこずも怜蚎したが远加数が読めず、conf がふくれあがるのもなぁ、、、ずいう思いがあり止めたした Nginx は backend が増えおも起動しっぱなしで動的に名前解決しお動䜜させたかったため、lua-nginx-module を導入し balancer_by_lua ディレクティブず lua-resty-dns モゞュヌルを䜿甚するこずずし、構築の手間の関係から OpenResty を導入するこずにしたした。 lua-nginx-module を䜿甚した conf ファむル conf ファむル党䜓ずしおは以䞋ずなりたす関係ない箇所は省いおいたす。ポむントず蚘茉した郚分に぀いおの説明は埌述したす。 http { upstream app { # ポむント 1. # Private DNS で蚭定した IPCNAME に蚭定を元に動的 Routing balancer_by_lua_block { local balancer = require "ngx.balancer" local host = ngx . ctx . upstream_server . cname local port = '8888' local ok , err = balancer . set_current_peer ( host , port ) if not ok then return ngx . exit ( 500 ) end } } server { listen 443 ssl; set $ proxy_upstream_host '' ; set $ proxy_upstream_domain '.local' ; location ^~ /api/ { rewrite_by_lua_block { -- path からクラむアント識別 ID を取埗し、Private DNS に蚭定したドメむンを生成 -- https://example.com/<id>/api ずいう圢匏のリク゚ストから、<id>.local ずいうドメむンを生成しお -- ngx.var.proxy_upstream_host 倉数に栌玍 local ngx_re = require "ngx.re" local res , err = ngx_re . split ( ngx . var . request_uri , "/" , nil , { pos = 0 }) local id = res[3] ngx.var. proxy_upstream_host = id..ngx.var.proxy_upstream_domain; -- resolver 蚭定 local resolver = require "resty.dns.resolver" local r, err = resolver:new{ nameservers = {{ "x.x.x.x" , 53}}, -- 䜿甚する nameserver } if not r then ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) end -- ポむント 2. -- 生成したドメむン名<id>.localを元に名前解決し、取埗した結果を ngx.ctx にセット -- balancer_by_lua_block で䜿甚する local answers, err = r:query(ngx.var.proxy_upstream_host, { qtype = r.TYPE_CNAME }) if not answers then ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) end if answers.errcode then ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) end ngx.ctx.upstream_server = answers[1] } proxy_set_header Host $ host ; proxy_set_header X-Real-IP $ remote_addr ; proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for ; proxy_set_header X-Forwarded-Proto $ scheme ; -- https://<id>.local/api に proxy rewrite ^/api/(.+)$ /api/ break; proxy_pass https://app; } } } ポむント 1. 動的 Routing balancer.set_current_peer にお proxy 先を動的に蚭定したす。 host 郚分にはドメむンを盎接指定するこずができないため、ポむント 2. で ngx.ctx にセットした DNS の倀から IPRoute53 に CNAME レコヌドずしお蚭定しおいるを指定しおいたす。 balancer_by_lua_block { local balancer = require "ngx.balancer" -- ngx.ctx にセットしおいた、Private DNS から取埗した内郚 IP をセット local host = ngx . ctx . upstream_server . cname local port = '8888' -- proxy 先セット。host にドメむンは盎接指定できない local ok , err = balancer . set_current_peer ( host , port ) if not ok then return ngx . exit ( 500 ) end } 詳现に぀いおは OpenResty の ドキュメント を参照しおください ポむント 2. 動的名前解決 r:query にお、生成したドメむン名 <id>.local を問い合わせたす。 r 郚分は resolver:new で nameserver を指定した resolver ずなりたす。 なお、nameserver に指定する IP は今回は Route53 の Private DNS を指定するため、倖郚 nameserver ではなくロヌカルの nameserver10.0.0.2 などを指定するこずになりたす。 問い合わせ結果の answers 郚分は Lua table 圢匏の配列ずなりたす。今回の䟋でいうず察象は 1 件ずなるので、その倀を balancer_by_lua_block で䜿甚するために ngx.ctx にセットしおいたす。 local answers , err = r : query ( ngx . var . proxy_upstream_host , { qtype = r . TYPE_CNAME }) if not answers then ngx . exit ( ngx . HTTP_INTERNAL_SERVER_ERROR ) end if answers . errcode then ngx . exit ( ngx . HTTP_INTERNAL_SERVER_ERROR ) end ngx . ctx . upstream_server = answers [ 1 ] 詳现に぀いおは OpenResty の ドキュメント を参照しおください 今回のたずめ upstream 先を動的に刀定しお proxy するずいう芁件はそうそう無いかもしれたせんし、途䞭たでは耇雑な構成になりそうだなぁずドキドキしおしたしたが、結果ずしおはそれなりにシンプルになったかなず思いたす。今曎ながら Nginxず lua moduleは柔軟で良く出来おるなぁずいう感想でした。 埌線は App 局に぀いお、EC2 ず Systems Manager パラメヌタストアあたりに぀いお共有させおいただければず思いたす。 クラむアント認蚌ず Path Based Routing が必芁なサヌバを AWS で構築埌線App 局 | MEDLEY Developer Portal 今回の内容に぀いお メドレヌ開発本郚の田䞭です。 先日、Proxy 局を Elastic Beanstalk 䞊の Nginx で、App 局を EC2 むンスタンスで構築する機䌚がありたした。ここだけ芋るずずおも普通に芋えたすが、制玄があ... developer.medley.jp 参考リンク 構築にあたり、䞋蚘蚘事を参考にさせおいただきたした。ありがずうございたす。 Nginx balancer_by_luaの話ずupstream名前解決の話 - Qiita balancer_by_lua_xxxxx い぀の間にやら1 lua-nginx-module に balancer_by_lua_xxx ずいう新しいディレクティブが増えおいたした。 以䞋ドキュメントより抜粋。 http { upstream backend {... qiita.com お知らせ メドレヌでは、医垫たちが぀くるオンラむン医療事兞「 MEDLEY 」、オンラむン蚺療アプリ「 CLINICS 」、医療介護の求人サむト「 ゞョブメドレヌ 」、口コミで探せる介護斜蚭の怜玢サむト「 介護のほんね 」などのプロダクトを提䟛しおいたす。これらのサヌビスの拡倧を受けお、その成長を支える゚ンゞニア・デザむナヌを募集しおいたす。 メドレヌで䞀緒に医療䜓隓を倉えるプロダクト䜜りに関わりたい方のご連絡お埅ちしおおりたす。 メンバヌのストヌリヌ | 株匏䌚瀟メドレヌ メンバヌのストヌリヌ 家族や友人が病気になった時に救いの手を差しのべる医療の力。... www.medley.jp
今回の内容に぀いお メドレヌ開発本郚の 田侭 です。 先日、Proxy 局を Elastic Beanstalk 䞊の Nginx で、App 局を EC2 むンスタンスで構築する機䌚がありたした。ここだけ芋るずずおも普通に芋えたすが、埌述する制玄から苊劎した点もあり、制玄を乗り越えるための工倫も含めおお話できる限り共有させおいただきたす先にお䌝えしおおくず、特殊な事情がなければ今回のようなケヌスでは ALB で察応する ECS サヌビスに Path Based Routing しおやるのが良いず思いたす。 技術芁玠ずしお、NginxOpenResty/ Route53 Private DNS / EC2 / Systems Manager パラメヌタストア あたりに觊れたいず思いたす。Beanstalk は Multicontainer Docker を䜿甚し、それも慣れるたでちょっずクセあったなぁず思ったのですが分量が倚くなりそうなのでたた別の機䌚に共有させお頂きたす たず前線ずしお Proxy 局、䞻に Nginx を䜿甚した Dynamic Path Based Routing に぀いおお話しお、 埌線は App å±€ に぀いお、EC2 ず Systems Manager パラメヌタストアあたりに぀いお共有させおいただければず思いたす。 蚭蚈/構築する䞊での前提ず方針 察象ずなる案件を進める䞊での芁件・制限内容は諞事情あり、ざっずたずめるずこのような感じです。 環境は AWS を䜿甚する サヌバアプリケヌション、クラむアントアプリケヌションはナヌザ毎で、サヌバアプリケヌションは共甚できないナヌザが増える床にクラむアント/サヌバのセットが増えるむメヌゞ ただし、クラむアントからの接続先ずなる Endpoint は同じだが、Host Based Routing は蚳あっお利甚できない クラむアント認蚌を䜿甚する 䞊蚘から、以䞋の蚭蚈方針で進める事にしたした。 Proxy 局でクラむアント認蚌を行い、Path Based Routing で察象ずなるサヌバにリク゚ストを proxy する。Path 郚分にクラむアント別の識別 ID を含め、その倀を元に Private DNS で名前解決する 䟋) https://example.com/a-client/api => https://a-client.local/api App 局は個別 EC2 むンスタンスずする 蚭蚈する䞊で悩んだ点 䞻に 2 点ありたすが、たずは Proxy 局です。出来るだけ AWS のマネヌゞド・サヌビスで枈たせたかったので、クラむアント認蚌ず Path Based Routing が可胜でやりたい事に合うかどうか調べたしたが以䞋の理由で断念し、普通?に ELB + Nginx を利甚するこずにしたした。 ALB: クラむアント認蚌に非察応。たた SSL 終端ずなるので Nginx 偎でクラむアント認蚌が出来ない API GW: クラむアント認蚌は察応しおおり Routing 郚分もがんばればいけるかも、ず思ったが Proxy 先が動的に増えたリするので管理ふくめ難しそうであった 次に App 局の構成をどうするかでした。集積床を高めるためにコンテナ利甚も怜蚎したのですが、䜿甚するアプリケヌションの必芁スペックや芁件などからいたいちフィットせず、個別の EC2 むンスタンスにするこずにしたした今でももっず良い方法がないか悩んでたりしたす 党䜓構成 出来䞊がった党䜓構成のむメヌゞは以䞋ずなりたす。なお台数は実環境ず異なり、今回の内容ず関係ない郚分などは省略しおいたす。 次に、今回の本題ずなる Proxy 局の構成に぀いお觊れたいず思いたす。 Proxy 局の構成 Proxy 局の方針等はたずめるず以䞋の通りで、proxy 先の動的刀定ず名前解決する箇所がキモずなりたす。 App 局のむンスタンスは、起動時に自身の内郚 IP ず Tag に蚭定したクラむアント識別 ID を元に Route53 の PrivateDNS に登録する クラむアント識別 ID が a-client の堎合、a-client.local のように登録 Proxy 局の Nginx はクラむアント認蚌を行い、リク゚ストパスから取り出したクラむアント識別 ID を元に転送先 Endpoint を生成し、backend に proxy する App 局のむンスタンスは動的に増えるため、リク゚スト時に名前解決したいむンスタンスが増える床に自動で Nginx の conf を線集するこずも怜蚎したが远加数が読めず、conf がふくれあがるのもなぁ、、、ずいう思いがあり止めたした Nginx は backend が増えおも起動しっぱなしで動的に名前解決しお動䜜させたかったため、lua-nginx-module を導入し balancer_by_lua ディレクティブず lua-resty-dns モゞュヌルを䜿甚するこずずし、構築の手間の関係から OpenResty を導入するこずにしたした。 lua-nginx-module を䜿甚した conf ファむル conf ファむル党䜓ずしおは以䞋ずなりたす関係ない箇所は省いおいたす。ポむントず蚘茉した郚分に぀いおの説明は埌述したす。 http { upstream app { # ポむント 1. # Private DNS で蚭定した IPCNAME に蚭定を元に動的 Routing balancer_by_lua_block { local balancer = require "ngx.balancer" local host = ngx . ctx . upstream_server . cname local port = '8888' local ok , err = balancer . set_current_peer ( host , port ) if not ok then return ngx . exit ( 500 ) end } } server { listen 443 ssl; set $ proxy_upstream_host '' ; set $ proxy_upstream_domain '.local' ; location ^~ /api/ { rewrite_by_lua_block { -- path からクラむアント識別 ID を取埗し、Private DNS に蚭定したドメむンを生成 -- https://example.com/<id>/api ずいう圢匏のリク゚ストから、<id>.local ずいうドメむンを生成しお -- ngx.var.proxy_upstream_host 倉数に栌玍 local ngx_re = require "ngx.re" local res , err = ngx_re . split ( ngx . var . request_uri , "/" , nil , { pos = 0 }) local id = res[3] ngx.var. proxy_upstream_host = id..ngx.var.proxy_upstream_domain; -- resolver 蚭定 local resolver = require "resty.dns.resolver" local r, err = resolver:new{ nameservers = {{ "x.x.x.x" , 53}}, -- 䜿甚する nameserver } if not r then ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) end -- ポむント 2. -- 生成したドメむン名<id>.localを元に名前解決し、取埗した結果を ngx.ctx にセット -- balancer_by_lua_block で䜿甚する local answers, err = r:query(ngx.var.proxy_upstream_host, { qtype = r.TYPE_CNAME }) if not answers then ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) end if answers.errcode then ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) end ngx.ctx.upstream_server = answers[1] } proxy_set_header Host $ host ; proxy_set_header X-Real-IP $ remote_addr ; proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for ; proxy_set_header X-Forwarded-Proto $ scheme ; -- https://<id>.local/api に proxy rewrite ^/api/(.+)$ /api/ break; proxy_pass https://app; } } } ポむント 1. 動的 Routing balancer.set_current_peer にお proxy 先を動的に蚭定したす。 host 郚分にはドメむンを盎接指定するこずができないため、ポむント 2. で ngx.ctx にセットした DNS の倀から IPRoute53 に CNAME レコヌドずしお蚭定しおいるを指定しおいたす。 balancer_by_lua_block { local balancer = require "ngx.balancer" -- ngx.ctx にセットしおいた、Private DNS から取埗した内郚 IP をセット local host = ngx . ctx . upstream_server . cname local port = '8888' -- proxy 先セット。host にドメむンは盎接指定できない local ok , err = balancer . set_current_peer ( host , port ) if not ok then return ngx . exit ( 500 ) end } 詳现に぀いおは OpenResty の ドキュメント を参照しおください ポむント 2. 動的名前解決 r:query にお、生成したドメむン名 <id>.local を問い合わせたす。 r 郚分は resolver:new で nameserver を指定した resolver ずなりたす。 なお、nameserver に指定する IP は今回は Route53 の Private DNS を指定するため、倖郚 nameserver ではなくロヌカルの nameserver10.0.0.2 などを指定するこずになりたす。 問い合わせ結果の answers 郚分は Lua table 圢匏の配列ずなりたす。今回の䟋でいうず察象は 1 件ずなるので、その倀を balancer_by_lua_block で䜿甚するために ngx.ctx にセットしおいたす。 local answers , err = r : query ( ngx . var . proxy_upstream_host , { qtype = r . TYPE_CNAME }) if not answers then ngx . exit ( ngx . HTTP_INTERNAL_SERVER_ERROR ) end if answers . errcode then ngx . exit ( ngx . HTTP_INTERNAL_SERVER_ERROR ) end ngx . ctx . upstream_server = answers [ 1 ] 詳现に぀いおは OpenResty の ドキュメント を参照しおください 今回のたずめ upstream 先を動的に刀定しお proxy するずいう芁件はそうそう無いかもしれたせんし、途䞭たでは耇雑な構成になりそうだなぁずドキドキしおしたしたが、結果ずしおはそれなりにシンプルになったかなず思いたす。今曎ながら Nginxず lua moduleは柔軟で良く出来おるなぁずいう感想でした。 埌線は App 局に぀いお、EC2 ず Systems Manager パラメヌタストアあたりに぀いお共有させおいただければず思いたす。 クラむアント認蚌ず Path Based Routing が必芁なサヌバを AWS で構築埌線App 局 | MEDLEY Developer Portal 今回の内容に぀いお メドレヌ開発本郚の田䞭です。 先日、Proxy 局を Elastic Beanstalk 䞊の Nginx で、App 局を EC2 むンスタンスで構築する機䌚がありたした。ここだけ芋るずずおも普通に芋えたすが、制玄があ... developer.medley.jp 参考リンク 構築にあたり、䞋蚘蚘事を参考にさせおいただきたした。ありがずうございたす。 Nginx balancer_by_luaの話ずupstream名前解決の話 - Qiita balancer_by_lua_xxxxx い぀の間にやら1 lua-nginx-module に balancer_by_lua_xxx ずいう新しいディレクティブが増えおいたした。 以䞋ドキュメントより抜粋。 http { upstream backend {... qiita.com お知らせ メドレヌでは、医垫たちが぀くるオンラむン医療事兞「 MEDLEY 」、オンラむン蚺療アプリ「 CLINICS 」、医療介護の求人サむト「 ゞョブメドレヌ 」、口コミで探せる介護斜蚭の怜玢サむト「 介護のほんね 」などのプロダクトを提䟛しおいたす。これらのサヌビスの拡倧を受けお、その成長を支える゚ンゞニア・デザむナヌを募集しおいたす。 メドレヌで䞀緒に医療䜓隓を倉えるプロダクト䜜りに関わりたい方のご連絡お埅ちしおおりたす。 メンバヌのストヌリヌ | 株匏䌚瀟メドレヌ メンバヌのストヌリヌ 家族や友人が病気になった時に救いの手を差しのべる医療の力。... www.medley.jp
今回の内容に぀いお メドレヌ開発本郚の 田侭 です。 先日、Proxy 局を Elastic Beanstalk 䞊の Nginx で、App 局を EC2 むンスタンスで構築する機䌚がありたした。ここだけ芋るずずおも普通に芋えたすが、埌述する制玄から苊劎した点もあり、制玄を乗り越えるための工倫も含めおお話できる限り共有させおいただきたす先にお䌝えしおおくず、特殊な事情がなければ今回のようなケヌスでは ALB で察応する ECS サヌビスに Path Based Routing しおやるのが良いず思いたす。 技術芁玠ずしお、NginxOpenResty/ Route53 Private DNS / EC2 / Systems Manager パラメヌタストア あたりに觊れたいず思いたす。Beanstalk は Multicontainer Docker を䜿甚し、それも慣れるたでちょっずクセあったなぁず思ったのですが分量が倚くなりそうなのでたた別の機䌚に共有させお頂きたす たず前線ずしお Proxy 局、䞻に Nginx を䜿甚した Dynamic Path Based Routing に぀いおお話しお、 埌線は App å±€ に぀いお、EC2 ず Systems Manager パラメヌタストアあたりに぀いお共有させおいただければず思いたす。 蚭蚈/構築する䞊での前提ず方針 察象ずなる案件を進める䞊での芁件・制限内容は諞事情あり、ざっずたずめるずこのような感じです。 環境は AWS を䜿甚する サヌバアプリケヌション、クラむアントアプリケヌションはナヌザ毎で、サヌバアプリケヌションは共甚できないナヌザが増える床にクラむアント/サヌバのセットが増えるむメヌゞ ただし、クラむアントからの接続先ずなる Endpoint は同じだが、Host Based Routing は蚳あっお利甚できない クラむアント認蚌を䜿甚する 䞊蚘から、以䞋の蚭蚈方針で進める事にしたした。 Proxy 局でクラむアント認蚌を行い、Path Based Routing で察象ずなるサヌバにリク゚ストを proxy する。Path 郚分にクラむアント別の識別 ID を含め、その倀を元に Private DNS で名前解決する 䟋) https://example.com/a-client/api => https://a-client.local/api App 局は個別 EC2 むンスタンスずする 蚭蚈する䞊で悩んだ点 䞻に 2 点ありたすが、たずは Proxy 局です。出来るだけ AWS のマネヌゞド・サヌビスで枈たせたかったので、クラむアント認蚌ず Path Based Routing が可胜でやりたい事に合うかどうか調べたしたが以䞋の理由で断念し、普通?に ELB + Nginx を利甚するこずにしたした。 ALB: クラむアント認蚌に非察応。たた SSL 終端ずなるので Nginx 偎でクラむアント認蚌が出来ない API GW: クラむアント認蚌は察応しおおり Routing 郚分もがんばればいけるかも、ず思ったが Proxy 先が動的に増えたリするので管理ふくめ難しそうであった 次に App 局の構成をどうするかでした。集積床を高めるためにコンテナ利甚も怜蚎したのですが、䜿甚するアプリケヌションの必芁スペックや芁件などからいたいちフィットせず、個別の EC2 むンスタンスにするこずにしたした今でももっず良い方法がないか悩んでたりしたす 党䜓構成 出来䞊がった党䜓構成のむメヌゞは以䞋ずなりたす。なお台数は実環境ず異なり、今回の内容ず関係ない郚分などは省略しおいたす。 次に、今回の本題ずなる Proxy 局の構成に぀いお觊れたいず思いたす。 Proxy 局の構成 Proxy 局の方針等はたずめるず以䞋の通りで、proxy 先の動的刀定ず名前解決する箇所がキモずなりたす。 App 局のむンスタンスは、起動時に自身の内郚 IP ず Tag に蚭定したクラむアント識別 ID を元に Route53 の PrivateDNS に登録する クラむアント識別 ID が a-client の堎合、a-client.local のように登録 Proxy 局の Nginx はクラむアント認蚌を行い、リク゚ストパスから取り出したクラむアント識別 ID を元に転送先 Endpoint を生成し、backend に proxy する App 局のむンスタンスは動的に増えるため、リク゚スト時に名前解決したいむンスタンスが増える床に自動で Nginx の conf を線集するこずも怜蚎したが远加数が読めず、conf がふくれあがるのもなぁ、、、ずいう思いがあり止めたした Nginx は backend が増えおも起動しっぱなしで動的に名前解決しお動䜜させたかったため、lua-nginx-module を導入し balancer_by_lua ディレクティブず lua-resty-dns モゞュヌルを䜿甚するこずずし、構築の手間の関係から OpenResty を導入するこずにしたした。 lua-nginx-module を䜿甚した conf ファむル conf ファむル党䜓ずしおは以䞋ずなりたす関係ない箇所は省いおいたす。ポむントず蚘茉した郚分に぀いおの説明は埌述したす。 http { upstream app { # ポむント 1. # Private DNS で蚭定した IPCNAME に蚭定を元に動的 Routing balancer_by_lua_block { local balancer = require "ngx.balancer" local host = ngx . ctx . upstream_server . cname local port = '8888' local ok , err = balancer . set_current_peer ( host , port ) if not ok then return ngx . exit ( 500 ) end } } server { listen 443 ssl; set $ proxy_upstream_host '' ; set $ proxy_upstream_domain '.local' ; location ^~ /api/ { rewrite_by_lua_block { -- path からクラむアント識別 ID を取埗し、Private DNS に蚭定したドメむンを生成 -- https://example.com/<id>/api ずいう圢匏のリク゚ストから、<id>.local ずいうドメむンを生成しお -- ngx.var.proxy_upstream_host 倉数に栌玍 local ngx_re = require "ngx.re" local res , err = ngx_re . split ( ngx . var . request_uri , "/" , nil , { pos = 0 }) local id = res[3] ngx.var. proxy_upstream_host = id..ngx.var.proxy_upstream_domain; -- resolver 蚭定 local resolver = require "resty.dns.resolver" local r, err = resolver:new{ nameservers = {{ "x.x.x.x" , 53}}, -- 䜿甚する nameserver } if not r then ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) end -- ポむント 2. -- 生成したドメむン名<id>.localを元に名前解決し、取埗した結果を ngx.ctx にセット -- balancer_by_lua_block で䜿甚する local answers, err = r:query(ngx.var.proxy_upstream_host, { qtype = r.TYPE_CNAME }) if not answers then ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) end if answers.errcode then ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) end ngx.ctx.upstream_server = answers[1] } proxy_set_header Host $ host ; proxy_set_header X-Real-IP $ remote_addr ; proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for ; proxy_set_header X-Forwarded-Proto $ scheme ; -- https://<id>.local/api に proxy rewrite ^/api/(.+)$ /api/ break; proxy_pass https://app; } } } ポむント 1. 動的 Routing balancer.set_current_peer にお proxy 先を動的に蚭定したす。 host 郚分にはドメむンを盎接指定するこずができないため、ポむント 2. で ngx.ctx にセットした DNS の倀から IPRoute53 に CNAME レコヌドずしお蚭定しおいるを指定しおいたす。 balancer_by_lua_block { local balancer = require "ngx.balancer" -- ngx.ctx にセットしおいた、Private DNS から取埗した内郚 IP をセット local host = ngx . ctx . upstream_server . cname local port = '8888' -- proxy 先セット。host にドメむンは盎接指定できない local ok , err = balancer . set_current_peer ( host , port ) if not ok then return ngx . exit ( 500 ) end } 詳现に぀いおは OpenResty の ドキュメント を参照しおください ポむント 2. 動的名前解決 r:query にお、生成したドメむン名 <id>.local を問い合わせたす。 r 郚分は resolver:new で nameserver を指定した resolver ずなりたす。 なお、nameserver に指定する IP は今回は Route53 の Private DNS を指定するため、倖郚 nameserver ではなくロヌカルの nameserver10.0.0.2 などを指定するこずになりたす。 問い合わせ結果の answers 郚分は Lua table 圢匏の配列ずなりたす。今回の䟋でいうず察象は 1 件ずなるので、その倀を balancer_by_lua_block で䜿甚するために ngx.ctx にセットしおいたす。 local answers , err = r : query ( ngx . var . proxy_upstream_host , { qtype = r . TYPE_CNAME }) if not answers then ngx . exit ( ngx . HTTP_INTERNAL_SERVER_ERROR ) end if answers . errcode then ngx . exit ( ngx . HTTP_INTERNAL_SERVER_ERROR ) end ngx . ctx . upstream_server = answers [ 1 ] 詳现に぀いおは OpenResty の ドキュメント を参照しおください 今回のたずめ upstream 先を動的に刀定しお proxy するずいう芁件はそうそう無いかもしれたせんし、途䞭たでは耇雑な構成になりそうだなぁずドキドキしおしたしたが、結果ずしおはそれなりにシンプルになったかなず思いたす。今曎ながら Nginxず lua moduleは柔軟で良く出来おるなぁずいう感想でした。 埌線は App 局に぀いお、EC2 ず Systems Manager パラメヌタストアあたりに぀いお共有させおいただければず思いたす。 クラむアント認蚌ず Path Based Routing が必芁なサヌバを AWS で構築埌線App 局 | MEDLEY Developer Portal 今回の内容に぀いお メドレヌ開発本郚の田䞭です。 先日、Proxy 局を Elastic Beanstalk 䞊の Nginx で、App 局を EC2 むンスタンスで構築する機䌚がありたした。ここだけ芋るずずおも普通に芋えたすが、制玄があ... developer.medley.jp 参考リンク 構築にあたり、䞋蚘蚘事を参考にさせおいただきたした。ありがずうございたす。 Nginx balancer_by_luaの話ずupstream名前解決の話 - Qiita balancer_by_lua_xxxxx い぀の間にやら1 lua-nginx-module に balancer_by_lua_xxx ずいう新しいディレクティブが増えおいたした。 以䞋ドキュメントより抜粋。 http { upstream backend {... qiita.com お知らせ メドレヌでは、医垫たちが぀くるオンラむン医療事兞「 MEDLEY 」、オンラむン蚺療アプリ「 CLINICS 」、医療介護の求人サむト「 ゞョブメドレヌ 」、口コミで探せる介護斜蚭の怜玢サむト「 介護のほんね 」などのプロダクトを提䟛しおいたす。これらのサヌビスの拡倧を受けお、その成長を支える゚ンゞニア・デザむナヌを募集しおいたす。 メドレヌで䞀緒に医療䜓隓を倉えるプロダクト䜜りに関わりたい方のご連絡お埅ちしおおりたす。 メンバヌのストヌリヌ | 株匏䌚瀟メドレヌ メンバヌのストヌリヌ 家族や友人が病気になった時に救いの手を差しのべる医療の力。... www.medley.jp
今回の内容に぀いお メドレヌ開発本郚の 田侭 です。 先日、Proxy 局を Elastic Beanstalk 䞊の Nginx で、App 局を EC2 むンスタンスで構築する機䌚がありたした。ここだけ芋るずずおも普通に芋えたすが、埌述する制玄から苊劎した点もあり、制玄を乗り越えるための工倫も含めおお話できる限り共有させおいただきたす先にお䌝えしおおくず、特殊な事情がなければ今回のようなケヌスでは ALB で察応する ECS サヌビスに Path Based Routing しおやるのが良いず思いたす。 技術芁玠ずしお、NginxOpenResty/ Route53 Private DNS / EC2 / Systems Manager パラメヌタストア あたりに觊れたいず思いたす。Beanstalk は Multicontainer Docker を䜿甚し、それも慣れるたでちょっずクセあったなぁず思ったのですが分量が倚くなりそうなのでたた別の機䌚に共有させお頂きたす たず前線ずしお Proxy 局、䞻に Nginx を䜿甚した Dynamic Path Based Routing に぀いおお話しお、 埌線は App å±€ に぀いお、EC2 ず Systems Manager パラメヌタストアあたりに぀いお共有させおいただければず思いたす。 蚭蚈/構築する䞊での前提ず方針 察象ずなる案件を進める䞊での芁件・制限内容は諞事情あり、ざっずたずめるずこのような感じです。 環境は AWS を䜿甚する サヌバアプリケヌション、クラむアントアプリケヌションはナヌザ毎で、サヌバアプリケヌションは共甚できないナヌザが増える床にクラむアント/サヌバのセットが増えるむメヌゞ ただし、クラむアントからの接続先ずなる Endpoint は同じだが、Host Based Routing は蚳あっお利甚できない クラむアント認蚌を䜿甚する 䞊蚘から、以䞋の蚭蚈方針で進める事にしたした。 Proxy 局でクラむアント認蚌を行い、Path Based Routing で察象ずなるサヌバにリク゚ストを proxy する。Path 郚分にクラむアント別の識別 ID を含め、その倀を元に Private DNS で名前解決する 䟋) https://example.com/a-client/api => https://a-client.local/api App 局は個別 EC2 むンスタンスずする 蚭蚈する䞊で悩んだ点 䞻に 2 点ありたすが、たずは Proxy 局です。出来るだけ AWS のマネヌゞド・サヌビスで枈たせたかったので、クラむアント認蚌ず Path Based Routing が可胜でやりたい事に合うかどうか調べたしたが以䞋の理由で断念し、普通?に ELB + Nginx を利甚するこずにしたした。 ALB: クラむアント認蚌に非察応。たた SSL 終端ずなるので Nginx 偎でクラむアント認蚌が出来ない API GW: クラむアント認蚌は察応しおおり Routing 郚分もがんばればいけるかも、ず思ったが Proxy 先が動的に増えたリするので管理ふくめ難しそうであった 次に App 局の構成をどうするかでした。集積床を高めるためにコンテナ利甚も怜蚎したのですが、䜿甚するアプリケヌションの必芁スペックや芁件などからいたいちフィットせず、個別の EC2 むンスタンスにするこずにしたした今でももっず良い方法がないか悩んでたりしたす 党䜓構成 出来䞊がった党䜓構成のむメヌゞは以䞋ずなりたす。なお台数は実環境ず異なり、今回の内容ず関係ない郚分などは省略しおいたす。 次に、今回の本題ずなる Proxy 局の構成に぀いお觊れたいず思いたす。 Proxy 局の構成 Proxy 局の方針等はたずめるず以䞋の通りで、proxy 先の動的刀定ず名前解決する箇所がキモずなりたす。 App 局のむンスタンスは、起動時に自身の内郚 IP ず Tag に蚭定したクラむアント識別 ID を元に Route53 の PrivateDNS に登録する クラむアント識別 ID が a-client の堎合、a-client.local のように登録 Proxy 局の Nginx はクラむアント認蚌を行い、リク゚ストパスから取り出したクラむアント識別 ID を元に転送先 Endpoint を生成し、backend に proxy する App 局のむンスタンスは動的に増えるため、リク゚スト時に名前解決したいむンスタンスが増える床に自動で Nginx の conf を線集するこずも怜蚎したが远加数が読めず、conf がふくれあがるのもなぁ、、、ずいう思いがあり止めたした Nginx は backend が増えおも起動しっぱなしで動的に名前解決しお動䜜させたかったため、lua-nginx-module を導入し balancer_by_lua ディレクティブず lua-resty-dns モゞュヌルを䜿甚するこずずし、構築の手間の関係から OpenResty を導入するこずにしたした。 lua-nginx-module を䜿甚した conf ファむル conf ファむル党䜓ずしおは以䞋ずなりたす関係ない箇所は省いおいたす。ポむントず蚘茉した郚分に぀いおの説明は埌述したす。 http { upstream app { # ポむント 1. # Private DNS で蚭定した IPCNAME に蚭定を元に動的 Routing balancer_by_lua_block { local balancer = require "ngx.balancer" local host = ngx . ctx . upstream_server . cname local port = '8888' local ok , err = balancer . set_current_peer ( host , port ) if not ok then return ngx . exit ( 500 ) end } } server { listen 443 ssl; set $ proxy_upstream_host '' ; set $ proxy_upstream_domain '.local' ; location ^~ /api/ { rewrite_by_lua_block { -- path からクラむアント識別 ID を取埗し、Private DNS に蚭定したドメむンを生成 -- https://example.com/<id>/api ずいう圢匏のリク゚ストから、<id>.local ずいうドメむンを生成しお -- ngx.var.proxy_upstream_host 倉数に栌玍 local ngx_re = require "ngx.re" local res , err = ngx_re . split ( ngx . var . request_uri , "/" , nil , { pos = 0 }) local id = res[3] ngx.var. proxy_upstream_host = id..ngx.var.proxy_upstream_domain; -- resolver 蚭定 local resolver = require "resty.dns.resolver" local r, err = resolver:new{ nameservers = {{ "x.x.x.x" , 53}}, -- 䜿甚する nameserver } if not r then ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) end -- ポむント 2. -- 生成したドメむン名<id>.localを元に名前解決し、取埗した結果を ngx.ctx にセット -- balancer_by_lua_block で䜿甚する local answers, err = r:query(ngx.var.proxy_upstream_host, { qtype = r.TYPE_CNAME }) if not answers then ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) end if answers.errcode then ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR) end ngx.ctx.upstream_server = answers[1] } proxy_set_header Host $ host ; proxy_set_header X-Real-IP $ remote_addr ; proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for ; proxy_set_header X-Forwarded-Proto $ scheme ; -- https://<id>.local/api に proxy rewrite ^/api/(.+)$ /api/ break; proxy_pass https://app; } } } ポむント 1. 動的 Routing balancer.set_current_peer にお proxy 先を動的に蚭定したす。 host 郚分にはドメむンを盎接指定するこずができないため、ポむント 2. で ngx.ctx にセットした DNS の倀から IPRoute53 に CNAME レコヌドずしお蚭定しおいるを指定しおいたす。 balancer_by_lua_block { local balancer = require "ngx.balancer" -- ngx.ctx にセットしおいた、Private DNS から取埗した内郚 IP をセット local host = ngx . ctx . upstream_server . cname local port = '8888' -- proxy 先セット。host にドメむンは盎接指定できない local ok , err = balancer . set_current_peer ( host , port ) if not ok then return ngx . exit ( 500 ) end } 詳现に぀いおは OpenResty の ドキュメント を参照しおください ポむント 2. 動的名前解決 r:query にお、生成したドメむン名 <id>.local を問い合わせたす。 r 郚分は resolver:new で nameserver を指定した resolver ずなりたす。 なお、nameserver に指定する IP は今回は Route53 の Private DNS を指定するため、倖郚 nameserver ではなくロヌカルの nameserver10.0.0.2 などを指定するこずになりたす。 問い合わせ結果の answers 郚分は Lua table 圢匏の配列ずなりたす。今回の䟋でいうず察象は 1 件ずなるので、その倀を balancer_by_lua_block で䜿甚するために ngx.ctx にセットしおいたす。 local answers , err = r : query ( ngx . var . proxy_upstream_host , { qtype = r . TYPE_CNAME }) if not answers then ngx . exit ( ngx . HTTP_INTERNAL_SERVER_ERROR ) end if answers . errcode then ngx . exit ( ngx . HTTP_INTERNAL_SERVER_ERROR ) end ngx . ctx . upstream_server = answers [ 1 ] 詳现に぀いおは OpenResty の ドキュメント を参照しおください 今回のたずめ upstream 先を動的に刀定しお proxy するずいう芁件はそうそう無いかもしれたせんし、途䞭たでは耇雑な構成になりそうだなぁずドキドキしおしたしたが、結果ずしおはそれなりにシンプルになったかなず思いたす。今曎ながら Nginxず lua moduleは柔軟で良く出来おるなぁずいう感想でした。 埌線は App 局に぀いお、EC2 ず Systems Manager パラメヌタストアあたりに぀いお共有させおいただければず思いたす。 クラむアント認蚌ず Path Based Routing が必芁なサヌバを AWS で構築埌線App 局 | MEDLEY Developer Portal 今回の内容に぀いお メドレヌ開発本郚の田䞭です。 先日、Proxy 局を Elastic Beanstalk 䞊の Nginx で、App 局を EC2 むンスタンスで構築する機䌚がありたした。ここだけ芋るずずおも普通に芋えたすが、制玄があ... developer.medley.jp 参考リンク 構築にあたり、䞋蚘蚘事を参考にさせおいただきたした。ありがずうございたす。 Nginx balancer_by_luaの話ずupstream名前解決の話 - Qiita balancer_by_lua_xxxxx い぀の間にやら1 lua-nginx-module に balancer_by_lua_xxx ずいう新しいディレクティブが増えおいたした。 以䞋ドキュメントより抜粋。 http { upstream backend {... qiita.com お知らせ メドレヌでは、医垫たちが぀くるオンラむン医療事兞「 MEDLEY 」、オンラむン蚺療アプリ「 CLINICS 」、医療介護の求人サむト「 ゞョブメドレヌ 」、口コミで探せる介護斜蚭の怜玢サむト「 介護のほんね 」などのプロダクトを提䟛しおいたす。これらのサヌビスの拡倧を受けお、その成長を支える゚ンゞニア・デザむナヌを募集しおいたす。 メドレヌで䞀緒に医療䜓隓を倉えるプロダクト䜜りに関わりたい方のご連絡お埅ちしおおりたす。 メンバヌのストヌリヌ | 株匏䌚瀟メドレヌ メンバヌのストヌリヌ 家族や友人が病気になった時に救いの手を差しのべる医療の力。... www.medley.jp
開発本郚の平山です。先日、瀟内勉匷䌚「TechLunch」にお瀟倖に公開できない内容の発衚をしおしたいたしたので、その代わりずしお、厚生劎働省が提䟛する「NDB オヌプンデヌタ」をオヌプン化した話に぀いお、ブログを曞こうず思いたす。  NDB オヌプンデヌタずは? www.mhlw.go.jp 䜜成の背景 ◆ レセプト情報・特定健蚺等情報デヌタベヌスNDBは、悉皆性が高いレセプト情報、および怜査倀などの詳现な情報を有する特定健蚺等情報が含たれおおり、囜民の医療動向を評䟡するうえで有甚なデヌタだず考えられおいる。 ◆ 2011 幎床より、医療費適正化蚈画策定に資する目的以倖での NDB デヌタの利甚が認められたが、NDB デヌタの機埮性の高さに鑑み、利甚者に察しおは高いレベルのセキュリティ芁件を課したうえで、デヌタ提䟛が行われおきた。 ◆ 䞀方で、倚くの研究者が必ずしも詳现な個祚デヌタを必芁ずするわけではないため、倚くの人々が䜿甚できるような、あらかじめ定匏化された集蚈デヌタを NDB デヌタをもずに敎備するこずが重芁ではないか、ずいう議論が有識者䌚議等でなされおきた。 ◆ NDB の民間提䟛に関する議論でも、「レセプト情報等の提䟛に関するワヌキンググルヌプ」からの報告では、汎甚性が高く様々なニヌズに䞀定皋床応えうる基瀎的な集蚈衚を䜜成し、公衚しおいくこずがむしろ適圓である、ずいう指摘がみられた。 䜜成の目的 ◆ 倚くの人々が NDB デヌタに基づいた保健医療に関する知芋に接するこずが出来るよう、NDB デヌタを甚いお基瀎的な集蚈衚を䜜成したうえで、公衚する。 ◆ NDB デヌタに基づき、医療の提䟛実態や特定健蚺等の結果をわかりやすく瀺す。 芁は皆さんが、病院に行った時にもらう明现曞に蚘茉されおいる初蚺〇〇点、倖来蚺療料〇〇点のようなデヌタが個人情報が匿名化された状態で収集しその統蚈デヌタを䞀般に公開する、ずいったずころでしょうか。 このようなデヌタがオヌプンになっおいるこずはずおも意矩のあるこずだず思いたすし、公開にたでこぎ぀けた関係者の苊劎が想像されたす。しかし、このような画期的なデヌタ提䟛ではありたすが、Excel ファむルでの提䟛ずなっおおり、か぀加工がしづらいデヌタ構造になっおいるため、デヌタを现かくみおみようずするず非垞に手間がかかるずいう問題がありたす。 NDB オヌプンデヌタのオヌプン化 そこで NDB オヌプンデヌタずしお公開されおいる Excel ファむルを加工し、DB に栌玍し BI ツヌル Redash から参照させるようにしおみたした。 1. デヌタ加工 & DB 取り蟌み 公開サむト にある医科蚺療行為に関する Excel ファむルを取埗し、ログテヌブルずしおよくあるフォヌマットに倉換し DB に取り蟌む。 倉換前 倉換埌 *************************** 1. row *************************** id: 1 practice_category_code: A000 practice_category_name: 初蚺料 practice_code: 111000110 practice_name: 初蚺 practice_type: 倖来 target: all revision: 2014 prefecture: sex: age: score: 251700771 created_at: 0000-00-00 00:00:00 updated_at: 0000-00-00 00:00:00 *************************** 2. row *************************** id: 2 practice_category_code: A000 practice_category_name: 初蚺料 practice_code: 111000110 practice_name: 初蚺 practice_type: 倖来 target: sex_age revision: 2014 prefecture: sex: 男性 age: 04 æ­³ score: 13158090 created_at: 0000-00-00 00:00:00 updated_at: 0000-00-00 00:00:00 *************************** 3. row *************************** id: 3 practice_category_code: A000 practice_category_name: 初蚺料 practice_code: 111000110 practice_name: 初蚺 practice_type: 倖来 target: sex_age revision: 2014 prefecture: sex: 男性 age: 59 æ­³ score: 12444947 created_at: 0000-00-00 00:00:00 updated_at: 0000-00-00 00:00:00 2. デヌタの参照 倉換したデヌタを取り蟌んだ DB を Redash から参照。分析したいデヌタを取埗するためのク゚リを曞いおダッシュボヌド化。 NDB オヌプンデヌタの掻甚䟋 以䞋に簡単なデヌタ掻甚のサンプルを茉せたした。医薬蚺療行為だけでなく特定健蚺や薬剀のデヌタを䜿うずもう少し面癜い気付きがあるかもしれたせん。 いずれにせよ、このように加工可胜な圢でのデヌタ提䟛こそがオヌプンデヌタ提䟛の䟡倀だず思うので、このような仕組みが加速すれば良いなず思いたす。 0-4 æ­³ 男性 蚺療行為点数 90 歳以䞊 男性 蚺療行為点数 140023350 胃瘻より流動食点滎泚入 郜道府県別 150086210 角膜移怍術 幎霡別 たずめ 以䞊、NDB オヌプンデヌタをオヌプン化しおみた話に぀いお曞いおみたした。 このように.go.jp から提䟛されるデヌタは䞀般的に Excel や PDF でのファむル提䟛が基本で、むンタヌネットサヌビスのように API のような圢で提䟛されるこずはありたせん。せっかく貎重なデヌタが提䟛されおいるにも関わらず、それが IT システムず連動しづらいこずで、掻甚されない状況になっおいるのはずおも残念なこずに思いたす。 Code for America の事䟋ではないですが、もっずむンタヌネット系の人材がこのような取り組みに入り蟌んでいくようになれば、より合理的でスマヌトな仕組みが加速し、業界党䜓の IT 化も加速するのではないでしょうか。 お知らせ メドレヌでは、医垫たちが぀くるオンラむン医療事兞「 MEDLEY 」、オンラむン蚺療アプリ「 CLINICS 」、医療介護の求人サむト「 ゞョブメドレヌ 」、口コミで探せる介護斜蚭の怜玢サむト「 介護のほんね 」などのプロダクトを提䟛しおいたす。これらのサヌビスの拡倧を受けお、その成長を支える゚ンゞニア・デザむナヌを募集しおいたす。 メドレヌで䞀緒に医療䜓隓を倉えるプロダクト䜜りに関わりたい方のご連絡お埅ちしおおりたす。 www.medley.jp
開発本郚の平山です。先日、瀟内勉匷䌚「TechLunch」にお瀟倖に公開できない内容の発衚をしおしたいたしたので、その代わりずしお、厚生劎働省が提䟛する「NDB オヌプンデヌタ」をオヌプン化した話に぀いお、ブログを曞こうず思いたす。  NDB オヌプンデヌタずは? www.mhlw.go.jp 䜜成の背景 ◆ レセプト情報・特定健蚺等情報デヌタベヌスNDBは、悉皆性が高いレセプト情報、および怜査倀などの詳现な情報を有する特定健蚺等情報が含たれおおり、囜民の医療動向を評䟡するうえで有甚なデヌタだず考えられおいる。 ◆ 2011 幎床より、医療費適正化蚈画策定に資する目的以倖での NDB デヌタの利甚が認められたが、NDB デヌタの機埮性の高さに鑑み、利甚者に察しおは高いレベルのセキュリティ芁件を課したうえで、デヌタ提䟛が行われおきた。 ◆ 䞀方で、倚くの研究者が必ずしも詳现な個祚デヌタを必芁ずするわけではないため、倚くの人々が䜿甚できるような、あらかじめ定匏化された集蚈デヌタを NDB デヌタをもずに敎備するこずが重芁ではないか、ずいう議論が有識者䌚議等でなされおきた。 ◆ NDB の民間提䟛に関する議論でも、「レセプト情報等の提䟛に関するワヌキンググルヌプ」からの報告では、汎甚性が高く様々なニヌズに䞀定皋床応えうる基瀎的な集蚈衚を䜜成し、公衚しおいくこずがむしろ適圓である、ずいう指摘がみられた。 䜜成の目的 ◆ 倚くの人々が NDB デヌタに基づいた保健医療に関する知芋に接するこずが出来るよう、NDB デヌタを甚いお基瀎的な集蚈衚を䜜成したうえで、公衚する。 ◆ NDB デヌタに基づき、医療の提䟛実態や特定健蚺等の結果をわかりやすく瀺す。 芁は皆さんが、病院に行った時にもらう明现曞に蚘茉されおいる初蚺〇〇点、倖来蚺療料〇〇点のようなデヌタが個人情報が匿名化された状態で収集しその統蚈デヌタを䞀般に公開する、ずいったずころでしょうか。 このようなデヌタがオヌプンになっおいるこずはずおも意矩のあるこずだず思いたすし、公開にたでこぎ぀けた関係者の苊劎が想像されたす。しかし、このような画期的なデヌタ提䟛ではありたすが、Excel ファむルでの提䟛ずなっおおり、か぀加工がしづらいデヌタ構造になっおいるため、デヌタを现かくみおみようずするず非垞に手間がかかるずいう問題がありたす。 NDB オヌプンデヌタのオヌプン化 そこで NDB オヌプンデヌタずしお公開されおいる Excel ファむルを加工し、DB に栌玍し BI ツヌル Redash から参照させるようにしおみたした。 1. デヌタ加工 & DB 取り蟌み 公開サむト にある医科蚺療行為に関する Excel ファむルを取埗し、ログテヌブルずしおよくあるフォヌマットに倉換し DB に取り蟌む。 倉換前 倉換埌 *************************** 1. row *************************** id: 1 practice_category_code: A000 practice_category_name: 初蚺料 practice_code: 111000110 practice_name: 初蚺 practice_type: 倖来 target: all revision: 2014 prefecture: sex: age: score: 251700771 created_at: 0000-00-00 00:00:00 updated_at: 0000-00-00 00:00:00 *************************** 2. row *************************** id: 2 practice_category_code: A000 practice_category_name: 初蚺料 practice_code: 111000110 practice_name: 初蚺 practice_type: 倖来 target: sex_age revision: 2014 prefecture: sex: 男性 age: 04 æ­³ score: 13158090 created_at: 0000-00-00 00:00:00 updated_at: 0000-00-00 00:00:00 *************************** 3. row *************************** id: 3 practice_category_code: A000 practice_category_name: 初蚺料 practice_code: 111000110 practice_name: 初蚺 practice_type: 倖来 target: sex_age revision: 2014 prefecture: sex: 男性 age: 59 æ­³ score: 12444947 created_at: 0000-00-00 00:00:00 updated_at: 0000-00-00 00:00:00 2. デヌタの参照 倉換したデヌタを取り蟌んだ DB を Redash から参照。分析したいデヌタを取埗するためのク゚リを曞いおダッシュボヌド化。 NDB オヌプンデヌタの掻甚䟋 以䞋に簡単なデヌタ掻甚のサンプルを茉せたした。医薬蚺療行為だけでなく特定健蚺や薬剀のデヌタを䜿うずもう少し面癜い気付きがあるかもしれたせん。 いずれにせよ、このように加工可胜な圢でのデヌタ提䟛こそがオヌプンデヌタ提䟛の䟡倀だず思うので、このような仕組みが加速すれば良いなず思いたす。 0-4 æ­³ 男性 蚺療行為点数 90 歳以䞊 男性 蚺療行為点数 140023350 胃瘻より流動食点滎泚入 郜道府県別 150086210 角膜移怍術 幎霡別 たずめ 以䞊、NDB オヌプンデヌタをオヌプン化しおみた話に぀いお曞いおみたした。 このように.go.jp から提䟛されるデヌタは䞀般的に Excel や PDF でのファむル提䟛が基本で、むンタヌネットサヌビスのように API のような圢で提䟛されるこずはありたせん。せっかく貎重なデヌタが提䟛されおいるにも関わらず、それが IT システムず連動しづらいこずで、掻甚されない状況になっおいるのはずおも残念なこずに思いたす。 Code for America の事䟋ではないですが、もっずむンタヌネット系の人材がこのような取り組みに入り蟌んでいくようになれば、より合理的でスマヌトな仕組みが加速し、業界党䜓の IT 化も加速するのではないでしょうか。 お知らせ メドレヌでは、医垫たちが぀くるオンラむン医療事兞「 MEDLEY 」、オンラむン蚺療アプリ「 CLINICS 」、医療介護の求人サむト「 ゞョブメドレヌ 」、口コミで探せる介護斜蚭の怜玢サむト「 介護のほんね 」などのプロダクトを提䟛しおいたす。これらのサヌビスの拡倧を受けお、その成長を支える゚ンゞニア・デザむナヌを募集しおいたす。 メドレヌで䞀緒に医療䜓隓を倉えるプロダクト䜜りに関わりたい方のご連絡お埅ちしおおりたす。 www.medley.jp
開発本郚の平山です。先日、瀟内勉匷䌚「TechLunch」にお瀟倖に公開できない内容の発衚をしおしたいたしたので、その代わりずしお、厚生劎働省が提䟛する「NDB オヌプンデヌタ」をオヌプン化した話に぀いお、ブログを曞こうず思いたす。  NDB オヌプンデヌタずは? www.mhlw.go.jp 䜜成の背景 ◆ レセプト情報・特定健蚺等情報デヌタベヌスNDBは、悉皆性が高いレセプト情報、および怜査倀などの詳现な情報を有する特定健蚺等情報が含たれおおり、囜民の医療動向を評䟡するうえで有甚なデヌタだず考えられおいる。 ◆ 2011 幎床より、医療費適正化蚈画策定に資する目的以倖での NDB デヌタの利甚が認められたが、NDB デヌタの機埮性の高さに鑑み、利甚者に察しおは高いレベルのセキュリティ芁件を課したうえで、デヌタ提䟛が行われおきた。 ◆ 䞀方で、倚くの研究者が必ずしも詳现な個祚デヌタを必芁ずするわけではないため、倚くの人々が䜿甚できるような、あらかじめ定匏化された集蚈デヌタを NDB デヌタをもずに敎備するこずが重芁ではないか、ずいう議論が有識者䌚議等でなされおきた。 ◆ NDB の民間提䟛に関する議論でも、「レセプト情報等の提䟛に関するワヌキンググルヌプ」からの報告では、汎甚性が高く様々なニヌズに䞀定皋床応えうる基瀎的な集蚈衚を䜜成し、公衚しおいくこずがむしろ適圓である、ずいう指摘がみられた。 䜜成の目的 ◆ 倚くの人々が NDB デヌタに基づいた保健医療に関する知芋に接するこずが出来るよう、NDB デヌタを甚いお基瀎的な集蚈衚を䜜成したうえで、公衚する。 ◆ NDB デヌタに基づき、医療の提䟛実態や特定健蚺等の結果をわかりやすく瀺す。 芁は皆さんが、病院に行った時にもらう明现曞に蚘茉されおいる初蚺〇〇点、倖来蚺療料〇〇点のようなデヌタが個人情報が匿名化された状態で収集しその統蚈デヌタを䞀般に公開する、ずいったずころでしょうか。 このようなデヌタがオヌプンになっおいるこずはずおも意矩のあるこずだず思いたすし、公開にたでこぎ぀けた関係者の苊劎が想像されたす。しかし、このような画期的なデヌタ提䟛ではありたすが、Excel ファむルでの提䟛ずなっおおり、か぀加工がしづらいデヌタ構造になっおいるため、デヌタを现かくみおみようずするず非垞に手間がかかるずいう問題がありたす。 NDB オヌプンデヌタのオヌプン化 そこで NDB オヌプンデヌタずしお公開されおいる Excel ファむルを加工し、DB に栌玍し BI ツヌル Redash から参照させるようにしおみたした。 1. デヌタ加工 & DB 取り蟌み 公開サむト にある医科蚺療行為に関する Excel ファむルを取埗し、ログテヌブルずしおよくあるフォヌマットに倉換し DB に取り蟌む。 倉換前 倉換埌 *************************** 1. row *************************** id: 1 practice_category_code: A000 practice_category_name: 初蚺料 practice_code: 111000110 practice_name: 初蚺 practice_type: 倖来 target: all revision: 2014 prefecture: sex: age: score: 251700771 created_at: 0000-00-00 00:00:00 updated_at: 0000-00-00 00:00:00 *************************** 2. row *************************** id: 2 practice_category_code: A000 practice_category_name: 初蚺料 practice_code: 111000110 practice_name: 初蚺 practice_type: 倖来 target: sex_age revision: 2014 prefecture: sex: 男性 age: 04 æ­³ score: 13158090 created_at: 0000-00-00 00:00:00 updated_at: 0000-00-00 00:00:00 *************************** 3. row *************************** id: 3 practice_category_code: A000 practice_category_name: 初蚺料 practice_code: 111000110 practice_name: 初蚺 practice_type: 倖来 target: sex_age revision: 2014 prefecture: sex: 男性 age: 59 æ­³ score: 12444947 created_at: 0000-00-00 00:00:00 updated_at: 0000-00-00 00:00:00 2. デヌタの参照 倉換したデヌタを取り蟌んだ DB を Redash から参照。分析したいデヌタを取埗するためのク゚リを曞いおダッシュボヌド化。 NDB オヌプンデヌタの掻甚䟋 以䞋に簡単なデヌタ掻甚のサンプルを茉せたした。医薬蚺療行為だけでなく特定健蚺や薬剀のデヌタを䜿うずもう少し面癜い気付きがあるかもしれたせん。 いずれにせよ、このように加工可胜な圢でのデヌタ提䟛こそがオヌプンデヌタ提䟛の䟡倀だず思うので、このような仕組みが加速すれば良いなず思いたす。 0-4 æ­³ 男性 蚺療行為点数 90 歳以䞊 男性 蚺療行為点数 140023350 胃瘻より流動食点滎泚入 郜道府県別 150086210 角膜移怍術 幎霡別 たずめ 以䞊、NDB オヌプンデヌタをオヌプン化しおみた話に぀いお曞いおみたした。 このように.go.jp から提䟛されるデヌタは䞀般的に Excel や PDF でのファむル提䟛が基本で、むンタヌネットサヌビスのように API のような圢で提䟛されるこずはありたせん。せっかく貎重なデヌタが提䟛されおいるにも関わらず、それが IT システムず連動しづらいこずで、掻甚されない状況になっおいるのはずおも残念なこずに思いたす。 Code for America の事䟋ではないですが、もっずむンタヌネット系の人材がこのような取り組みに入り蟌んでいくようになれば、より合理的でスマヌトな仕組みが加速し、業界党䜓の IT 化も加速するのではないでしょうか。 お知らせ メドレヌでは、医垫たちが぀くるオンラむン医療事兞「 MEDLEY 」、オンラむン蚺療アプリ「 CLINICS 」、医療介護の求人サむト「 ゞョブメドレヌ 」、口コミで探せる介護斜蚭の怜玢サむト「 介護のほんね 」などのプロダクトを提䟛しおいたす。これらのサヌビスの拡倧を受けお、その成長を支える゚ンゞニア・デザむナヌを募集しおいたす。 メドレヌで䞀緒に医療䜓隓を倉えるプロダクト䜜りに関わりたい方のご連絡お埅ちしおおりたす。 www.medley.jp
開発本郚の平山です。先日、瀟内勉匷䌚「TechLunch」にお瀟倖に公開できない内容の発衚をしおしたいたしたので、その代わりずしお、厚生劎働省が提䟛する「NDB オヌプンデヌタ」をオヌプン化した話に぀いお、ブログを曞こうず思いたす。  NDB オヌプンデヌタずは? www.mhlw.go.jp 䜜成の背景 ◆ レセプト情報・特定健蚺等情報デヌタベヌスNDBは、悉皆性が高いレセプト情報、および怜査倀などの詳现な情報を有する特定健蚺等情報が含たれおおり、囜民の医療動向を評䟡するうえで有甚なデヌタだず考えられおいる。 ◆ 2011 幎床より、医療費適正化蚈画策定に資する目的以倖での NDB デヌタの利甚が認められたが、NDB デヌタの機埮性の高さに鑑み、利甚者に察しおは高いレベルのセキュリティ芁件を課したうえで、デヌタ提䟛が行われおきた。 ◆ 䞀方で、倚くの研究者が必ずしも詳现な個祚デヌタを必芁ずするわけではないため、倚くの人々が䜿甚できるような、あらかじめ定匏化された集蚈デヌタを NDB デヌタをもずに敎備するこずが重芁ではないか、ずいう議論が有識者䌚議等でなされおきた。 ◆ NDB の民間提䟛に関する議論でも、「レセプト情報等の提䟛に関するワヌキンググルヌプ」からの報告では、汎甚性が高く様々なニヌズに䞀定皋床応えうる基瀎的な集蚈衚を䜜成し、公衚しおいくこずがむしろ適圓である、ずいう指摘がみられた。 䜜成の目的 ◆ 倚くの人々が NDB デヌタに基づいた保健医療に関する知芋に接するこずが出来るよう、NDB デヌタを甚いお基瀎的な集蚈衚を䜜成したうえで、公衚する。 ◆ NDB デヌタに基づき、医療の提䟛実態や特定健蚺等の結果をわかりやすく瀺す。 芁は皆さんが、病院に行った時にもらう明现曞に蚘茉されおいる初蚺〇〇点、倖来蚺療料〇〇点のようなデヌタが個人情報が匿名化された状態で収集しその統蚈デヌタを䞀般に公開する、ずいったずころでしょうか。 このようなデヌタがオヌプンになっおいるこずはずおも意矩のあるこずだず思いたすし、公開にたでこぎ぀けた関係者の苊劎が想像されたす。しかし、このような画期的なデヌタ提䟛ではありたすが、Excel ファむルでの提䟛ずなっおおり、か぀加工がしづらいデヌタ構造になっおいるため、デヌタを现かくみおみようずするず非垞に手間がかかるずいう問題がありたす。 NDB オヌプンデヌタのオヌプン化 そこで NDB オヌプンデヌタずしお公開されおいる Excel ファむルを加工し、DB に栌玍し BI ツヌル Redash から参照させるようにしおみたした。 1. デヌタ加工 & DB 取り蟌み 公開サむト にある医科蚺療行為に関する Excel ファむルを取埗し、ログテヌブルずしおよくあるフォヌマットに倉換し DB に取り蟌む。 倉換前 倉換埌 *************************** 1. row *************************** id: 1 practice_category_code: A000 practice_category_name: 初蚺料 practice_code: 111000110 practice_name: 初蚺 practice_type: 倖来 target: all revision: 2014 prefecture: sex: age: score: 251700771 created_at: 0000-00-00 00:00:00 updated_at: 0000-00-00 00:00:00 *************************** 2. row *************************** id: 2 practice_category_code: A000 practice_category_name: 初蚺料 practice_code: 111000110 practice_name: 初蚺 practice_type: 倖来 target: sex_age revision: 2014 prefecture: sex: 男性 age: 04 æ­³ score: 13158090 created_at: 0000-00-00 00:00:00 updated_at: 0000-00-00 00:00:00 *************************** 3. row *************************** id: 3 practice_category_code: A000 practice_category_name: 初蚺料 practice_code: 111000110 practice_name: 初蚺 practice_type: 倖来 target: sex_age revision: 2014 prefecture: sex: 男性 age: 59 æ­³ score: 12444947 created_at: 0000-00-00 00:00:00 updated_at: 0000-00-00 00:00:00 2. デヌタの参照 倉換したデヌタを取り蟌んだ DB を Redash から参照。分析したいデヌタを取埗するためのク゚リを曞いおダッシュボヌド化。 NDB オヌプンデヌタの掻甚䟋 以䞋に簡単なデヌタ掻甚のサンプルを茉せたした。医薬蚺療行為だけでなく特定健蚺や薬剀のデヌタを䜿うずもう少し面癜い気付きがあるかもしれたせん。 いずれにせよ、このように加工可胜な圢でのデヌタ提䟛こそがオヌプンデヌタ提䟛の䟡倀だず思うので、このような仕組みが加速すれば良いなず思いたす。 0-4 æ­³ 男性 蚺療行為点数 90 歳以䞊 男性 蚺療行為点数 140023350 胃瘻より流動食点滎泚入 郜道府県別 150086210 角膜移怍術 幎霡別 たずめ 以䞊、NDB オヌプンデヌタをオヌプン化しおみた話に぀いお曞いおみたした。 このように.go.jp から提䟛されるデヌタは䞀般的に Excel や PDF でのファむル提䟛が基本で、むンタヌネットサヌビスのように API のような圢で提䟛されるこずはありたせん。せっかく貎重なデヌタが提䟛されおいるにも関わらず、それが IT システムず連動しづらいこずで、掻甚されない状況になっおいるのはずおも残念なこずに思いたす。 Code for America の事䟋ではないですが、もっずむンタヌネット系の人材がこのような取り組みに入り蟌んでいくようになれば、より合理的でスマヌトな仕組みが加速し、業界党䜓の IT 化も加速するのではないでしょうか。 お知らせ メドレヌでは、医垫たちが぀くるオンラむン医療事兞「 MEDLEY 」、オンラむン蚺療アプリ「 CLINICS 」、医療介護の求人サむト「 ゞョブメドレヌ 」、口コミで探せる介護斜蚭の怜玢サむト「 介護のほんね 」などのプロダクトを提䟛しおいたす。これらのサヌビスの拡倧を受けお、その成長を支える゚ンゞニア・デザむナヌを募集しおいたす。 メドレヌで䞀緒に医療䜓隓を倉えるプロダクト䜜りに関わりたい方のご連絡お埅ちしおおりたす。 www.medley.jp
開発本郚の平山です。先日、瀟内勉匷䌚「TechLunch」にお瀟倖に公開できない内容の発衚をしおしたいたしたので、その代わりずしお、厚生劎働省が提䟛する「NDB オヌプンデヌタ」をオヌプン化した話に぀いお、ブログを曞こうず思いたす。  NDB オヌプンデヌタずは? www.mhlw.go.jp 䜜成の背景 ◆ レセプト情報・特定健蚺等情報デヌタベヌスNDBは、悉皆性が高いレセプト情報、および怜査倀などの詳现な情報を有する特定健蚺等情報が含たれおおり、囜民の医療動向を評䟡するうえで有甚なデヌタだず考えられおいる。 ◆ 2011 幎床より、医療費適正化蚈画策定に資する目的以倖での NDB デヌタの利甚が認められたが、NDB デヌタの機埮性の高さに鑑み、利甚者に察しおは高いレベルのセキュリティ芁件を課したうえで、デヌタ提䟛が行われおきた。 ◆ 䞀方で、倚くの研究者が必ずしも詳现な個祚デヌタを必芁ずするわけではないため、倚くの人々が䜿甚できるような、あらかじめ定匏化された集蚈デヌタを NDB デヌタをもずに敎備するこずが重芁ではないか、ずいう議論が有識者䌚議等でなされおきた。 ◆ NDB の民間提䟛に関する議論でも、「レセプト情報等の提䟛に関するワヌキンググルヌプ」からの報告では、汎甚性が高く様々なニヌズに䞀定皋床応えうる基瀎的な集蚈衚を䜜成し、公衚しおいくこずがむしろ適圓である、ずいう指摘がみられた。 䜜成の目的 ◆ 倚くの人々が NDB デヌタに基づいた保健医療に関する知芋に接するこずが出来るよう、NDB デヌタを甚いお基瀎的な集蚈衚を䜜成したうえで、公衚する。 ◆ NDB デヌタに基づき、医療の提䟛実態や特定健蚺等の結果をわかりやすく瀺す。 芁は皆さんが、病院に行った時にもらう明现曞に蚘茉されおいる初蚺〇〇点、倖来蚺療料〇〇点のようなデヌタが個人情報が匿名化された状態で収集しその統蚈デヌタを䞀般に公開する、ずいったずころでしょうか。 このようなデヌタがオヌプンになっおいるこずはずおも意矩のあるこずだず思いたすし、公開にたでこぎ぀けた関係者の苊劎が想像されたす。しかし、このような画期的なデヌタ提䟛ではありたすが、Excel ファむルでの提䟛ずなっおおり、か぀加工がしづらいデヌタ構造になっおいるため、デヌタを现かくみおみようずするず非垞に手間がかかるずいう問題がありたす。 NDB オヌプンデヌタのオヌプン化 そこで NDB オヌプンデヌタずしお公開されおいる Excel ファむルを加工し、DB に栌玍し BI ツヌル Redash から参照させるようにしおみたした。 1. デヌタ加工 & DB 取り蟌み 公開サむト にある医科蚺療行為に関する Excel ファむルを取埗し、ログテヌブルずしおよくあるフォヌマットに倉換し DB に取り蟌む。 倉換前 倉換埌 *************************** 1. row *************************** id: 1 practice_category_code: A000 practice_category_name: 初蚺料 practice_code: 111000110 practice_name: 初蚺 practice_type: 倖来 target: all revision: 2014 prefecture: sex: age: score: 251700771 created_at: 0000-00-00 00:00:00 updated_at: 0000-00-00 00:00:00 *************************** 2. row *************************** id: 2 practice_category_code: A000 practice_category_name: 初蚺料 practice_code: 111000110 practice_name: 初蚺 practice_type: 倖来 target: sex_age revision: 2014 prefecture: sex: 男性 age: 04 æ­³ score: 13158090 created_at: 0000-00-00 00:00:00 updated_at: 0000-00-00 00:00:00 *************************** 3. row *************************** id: 3 practice_category_code: A000 practice_category_name: 初蚺料 practice_code: 111000110 practice_name: 初蚺 practice_type: 倖来 target: sex_age revision: 2014 prefecture: sex: 男性 age: 59 æ­³ score: 12444947 created_at: 0000-00-00 00:00:00 updated_at: 0000-00-00 00:00:00 2. デヌタの参照 倉換したデヌタを取り蟌んだ DB を Redash から参照。分析したいデヌタを取埗するためのク゚リを曞いおダッシュボヌド化。 NDB オヌプンデヌタの掻甚䟋 以䞋に簡単なデヌタ掻甚のサンプルを茉せたした。医薬蚺療行為だけでなく特定健蚺や薬剀のデヌタを䜿うずもう少し面癜い気付きがあるかもしれたせん。 いずれにせよ、このように加工可胜な圢でのデヌタ提䟛こそがオヌプンデヌタ提䟛の䟡倀だず思うので、このような仕組みが加速すれば良いなず思いたす。 0-4 æ­³ 男性 蚺療行為点数 90 歳以䞊 男性 蚺療行為点数 140023350 胃瘻より流動食点滎泚入 郜道府県別 150086210 角膜移怍術 幎霡別 たずめ 以䞊、NDB オヌプンデヌタをオヌプン化しおみた話に぀いお曞いおみたした。 このように.go.jp から提䟛されるデヌタは䞀般的に Excel や PDF でのファむル提䟛が基本で、むンタヌネットサヌビスのように API のような圢で提䟛されるこずはありたせん。せっかく貎重なデヌタが提䟛されおいるにも関わらず、それが IT システムず連動しづらいこずで、掻甚されない状況になっおいるのはずおも残念なこずに思いたす。 Code for America の事䟋ではないですが、もっずむンタヌネット系の人材がこのような取り組みに入り蟌んでいくようになれば、より合理的でスマヌトな仕組みが加速し、業界党䜓の IT 化も加速するのではないでしょうか。 お知らせ メドレヌでは、医垫たちが぀くるオンラむン医療事兞「 MEDLEY 」、オンラむン蚺療アプリ「 CLINICS 」、医療介護の求人サむト「 ゞョブメドレヌ 」、口コミで探せる介護斜蚭の怜玢サむト「 介護のほんね 」などのプロダクトを提䟛しおいたす。これらのサヌビスの拡倧を受けお、その成長を支える゚ンゞニア・デザむナヌを募集しおいたす。 メドレヌで䞀緒に医療䜓隓を倉えるプロダクト䜜りに関わりたい方のご連絡お埅ちしおおりたす。 www.medley.jp
開発本郚の平山です。先日、瀟内勉匷䌚「TechLunch」にお瀟倖に公開できない内容の発衚をしおしたいたしたので、その代わりずしお、厚生劎働省が提䟛する「NDB オヌプンデヌタ」をオヌプン化した話に぀いお、ブログを曞こうず思いたす。  NDB オヌプンデヌタずは? www.mhlw.go.jp 䜜成の背景 ◆ レセプト情報・特定健蚺等情報デヌタベヌスNDBは、悉皆性が高いレセプト情報、および怜査倀などの詳现な情報を有する特定健蚺等情報が含たれおおり、囜民の医療動向を評䟡するうえで有甚なデヌタだず考えられおいる。 ◆ 2011 幎床より、医療費適正化蚈画策定に資する目的以倖での NDB デヌタの利甚が認められたが、NDB デヌタの機埮性の高さに鑑み、利甚者に察しおは高いレベルのセキュリティ芁件を課したうえで、デヌタ提䟛が行われおきた。 ◆ 䞀方で、倚くの研究者が必ずしも詳现な個祚デヌタを必芁ずするわけではないため、倚くの人々が䜿甚できるような、あらかじめ定匏化された集蚈デヌタを NDB デヌタをもずに敎備するこずが重芁ではないか、ずいう議論が有識者䌚議等でなされおきた。 ◆ NDB の民間提䟛に関する議論でも、「レセプト情報等の提䟛に関するワヌキンググルヌプ」からの報告では、汎甚性が高く様々なニヌズに䞀定皋床応えうる基瀎的な集蚈衚を䜜成し、公衚しおいくこずがむしろ適圓である、ずいう指摘がみられた。 䜜成の目的 ◆ 倚くの人々が NDB デヌタに基づいた保健医療に関する知芋に接するこずが出来るよう、NDB デヌタを甚いお基瀎的な集蚈衚を䜜成したうえで、公衚する。 ◆ NDB デヌタに基づき、医療の提䟛実態や特定健蚺等の結果をわかりやすく瀺す。 芁は皆さんが、病院に行った時にもらう明现曞に蚘茉されおいる初蚺〇〇点、倖来蚺療料〇〇点のようなデヌタが個人情報が匿名化された状態で収集しその統蚈デヌタを䞀般に公開する、ずいったずころでしょうか。 このようなデヌタがオヌプンになっおいるこずはずおも意矩のあるこずだず思いたすし、公開にたでこぎ぀けた関係者の苊劎が想像されたす。しかし、このような画期的なデヌタ提䟛ではありたすが、Excel ファむルでの提䟛ずなっおおり、か぀加工がしづらいデヌタ構造になっおいるため、デヌタを现かくみおみようずするず非垞に手間がかかるずいう問題がありたす。 NDB オヌプンデヌタのオヌプン化 そこで NDB オヌプンデヌタずしお公開されおいる Excel ファむルを加工し、DB に栌玍し BI ツヌル Redash から参照させるようにしおみたした。 1. デヌタ加工 & DB 取り蟌み 公開サむト にある医科蚺療行為に関する Excel ファむルを取埗し、ログテヌブルずしおよくあるフォヌマットに倉換し DB に取り蟌む。 倉換前 倉換埌 *************************** 1. row *************************** id: 1 practice_category_code: A000 practice_category_name: 初蚺料 practice_code: 111000110 practice_name: 初蚺 practice_type: 倖来 target: all revision: 2014 prefecture: sex: age: score: 251700771 created_at: 0000-00-00 00:00:00 updated_at: 0000-00-00 00:00:00 *************************** 2. row *************************** id: 2 practice_category_code: A000 practice_category_name: 初蚺料 practice_code: 111000110 practice_name: 初蚺 practice_type: 倖来 target: sex_age revision: 2014 prefecture: sex: 男性 age: 04 æ­³ score: 13158090 created_at: 0000-00-00 00:00:00 updated_at: 0000-00-00 00:00:00 *************************** 3. row *************************** id: 3 practice_category_code: A000 practice_category_name: 初蚺料 practice_code: 111000110 practice_name: 初蚺 practice_type: 倖来 target: sex_age revision: 2014 prefecture: sex: 男性 age: 59 æ­³ score: 12444947 created_at: 0000-00-00 00:00:00 updated_at: 0000-00-00 00:00:00 2. デヌタの参照 倉換したデヌタを取り蟌んだ DB を Redash から参照。分析したいデヌタを取埗するためのク゚リを曞いおダッシュボヌド化。 NDB オヌプンデヌタの掻甚䟋 以䞋に簡単なデヌタ掻甚のサンプルを茉せたした。医薬蚺療行為だけでなく特定健蚺や薬剀のデヌタを䜿うずもう少し面癜い気付きがあるかもしれたせん。 いずれにせよ、このように加工可胜な圢でのデヌタ提䟛こそがオヌプンデヌタ提䟛の䟡倀だず思うので、このような仕組みが加速すれば良いなず思いたす。 0-4 æ­³ 男性 蚺療行為点数 90 歳以䞊 男性 蚺療行為点数 140023350 胃瘻より流動食点滎泚入 郜道府県別 150086210 角膜移怍術 幎霡別 たずめ 以䞊、NDB オヌプンデヌタをオヌプン化しおみた話に぀いお曞いおみたした。 このように.go.jp から提䟛されるデヌタは䞀般的に Excel や PDF でのファむル提䟛が基本で、むンタヌネットサヌビスのように API のような圢で提䟛されるこずはありたせん。せっかく貎重なデヌタが提䟛されおいるにも関わらず、それが IT システムず連動しづらいこずで、掻甚されない状況になっおいるのはずおも残念なこずに思いたす。 Code for America の事䟋ではないですが、もっずむンタヌネット系の人材がこのような取り組みに入り蟌んでいくようになれば、より合理的でスマヌトな仕組みが加速し、業界党䜓の IT 化も加速するのではないでしょうか。 お知らせ メドレヌでは、医垫たちが぀くるオンラむン医療事兞「 MEDLEY 」、オンラむン蚺療アプリ「 CLINICS 」、医療介護の求人サむト「 ゞョブメドレヌ 」、口コミで探せる介護斜蚭の怜玢サむト「 介護のほんね 」などのプロダクトを提䟛しおいたす。これらのサヌビスの拡倧を受けお、その成長を支える゚ンゞニア・デザむナヌを募集しおいたす。 メドレヌで䞀緒に医療䜓隓を倉えるプロダクト䜜りに関わりたい方のご連絡お埅ちしおおりたす。 www.medley.jp