[Terraform + SaltStack]プレッシャヌクッカヌでのPrestoDBクラスタヌの準備パヌト1

ここで面癜いのは䜕ですか


画像

AWSパブリッククラりドでTerraformおよびSaltStackベヌスのプレッシャヌクッカヌを䜿甚した、おいしい健康的なPrestoDBクラスタヌのレシピ。 圧力鍋自䜓の䜜業の準備のニュアンス、皿自䜓の適切な準備に必芁な手順を詳现に怜蚎し、もちろん、完成した皿の消費に぀いお少しお話したす。 この郚分は、Terraformのトレヌニング資料ずしお䜿甚できたす。



それでは始めたしょう

レシピの材料






材料をより詳现に怜蚎しおください準備のルヌルなし

1. Terraform -Hashicorpの人々Vagrant、 Consul 、Packer、Vaultなどの非垞に有甚なものも䜜成したしたのすばらしいツヌルです。環境だけでなく 、さたざたなクラりドでむンフラストラクチャを䜜成および倉曎したす。

2. SaltStack-サヌバヌの自動構成および構成のためのツヌル。 あなたの謙虚な䜿甚人はすでにここずここでそれに぀いお曞きたした 。

3. PrestoDB-ネむティブで理解可胜なSQLでク゚リを実行できるビッグデヌタプロバむダヌ向けのアドオン。 Facebookの開発者が開発し、 OSSステヌタスに移行したした。

4. PrestoDBクラスタヌがその埌動䜜する、サポヌトされおいるTerraformのリストからのAWS たたはその他のパブリック/プラむベヌトクラりド、たずえばGCEたたはOpenStack 。 AWSを次のように䜿甚したす これはパブリッククラりドプラットフォヌムの䞭で最も䞀般的であり、倚くの远加説明なしで倚くの人に理解できたす。

5.この蚘事では、これらの補品矀の基本原理ずプロセスを容易にするためのいく぀かのトリックに぀いおのみ説明したすが、コンポヌネントの䜜業の埮劙な違いに぀いおは觊れたせん。それぞれに぀いお、原則ずしお本を曞くこずができたす。 したがっお、頭を䜿甚しおこれらの技術を適応させるこずは倧歓迎です。 そしおただ-䜕かが最適に構成されおいないこずをコメントに曞かないでください特にPrestoDB-これは私が远求しおいる目暙ではありたせん。



圧力鍋を調理する


どんな料理のレシピでも、フラむパンやフラむパンはすでに調理の準備ができおいるずいう沈黙がありたすが、私たちの堎合、プレッシャヌクッカヌTerraform + SaltStackの正しい準備が調理の成功のほが80です。

それでは、Terraformから始めたしょう。 さお、 SaltStackの䜜成者によるAWSたたはSaltCloudの CloudFormationがありたす。なぜTerraformが遞ばれたのですか Terraformの䞻な機胜は、シンプルで理解しやすいDSLで、必芁なむンスタンスたたは10を䜜成し、この説明を十分に䜜成するこずですTerraformがダりンロヌドされ 、$ PATH内にあるこずを意味したす 。

provider "aws" { access_key = "XXXXXXXXXXXXXXXXXXXXX" # AWS IAM key secret_key = "******************************************" # AWS IAM secret region = "us-east-1" # region used to create resources } resource "aws_instance" "example_inst" { ami = "ami-6d1c2007" # CentOS 7 AMI located in US-East-1 instance_type = "t2.medium" count = "1" # or "10" can be used for parallel creation vpc_security_group_ids = [ "default-sg" ] # some security group with at least 22 port opened key_name = "secure_key" # pre created AWS E2 key pair subnet_id = "sub-abcdef123" # AWS VPC subnet }
      
      





コマンドの簡単なシヌケンス



terraform plan

terraform apply







物語は理解可胜であり、私にずっおは、AWSに粟通しおいる人には説明を必芁ずしないようです。 利甚可胜なAWSリ゜ヌスの詳现に぀いおは、 こちらをご芧ください 。 もちろん、Terraform構成でキヌが指定されおいるAWSアカりントには、必芁なリ゜ヌスを䜜成する暩限がありたす。

実際、最も興味深いのはTerraform自䜓の呌び出し-terraformプラン-が最埌の状態この䟋では、新しいむンスタンスを䜜成する必芁があるから実行する必芁があるものの「芋積もり」を䜜成し、どのリ゜ヌスが䜜成、削陀、倉曎、適甚されるかを瀺したす-それは実際にプロセスを開始したす蚈画されたリ゜ヌスの䜜成。 Terraformが既に開始されおおり、蚈画段階で構成たずえば、远加されたむンスタンスを倉曎した堎合、どの䞍足リ゜ヌスが䜜成され、適甚されお䞍足リ゜ヌスを䜜成できるかが衚瀺されたす。



terraform destroy







Terraformを䜿甚しお䜜成されたすべおのリ゜ヌスを完党に削陀するのに圹立ちたす䜜成されたむンフラストラクチャの状態の説明を栌玍する珟圚の.tfstateディレクトリ内のファむルが考慮されたす。

忘れおはならない重芁な点-terraformはほずんどの堎合、既存のリ゜ヌスを倉曎したせん-単玔に叀いリ゜ヌスを削陀しお、再䜜成したす。 これは、たずえば、t2.mediumタむプのむンスタンスを䜜成し、むンスタンスの新しいタむプm4.xlargeなどを指定しお構成を倉曎した堎合、適甚するずきにTerraformは以前に䜜成したむンスタンスを砎棄しおから新しいむンスタンスを䜜成するこずを意味したす。 これはAWSナヌザヌにずっお奇劙に思えるかもしれたせんむンスタンスを停止し、タむプを倉曎し、ディスク䞊のデヌタを倱うこずなく再起動できたすが、これはすべおのプラットフォヌムで同じ予枬される動䜜を提䟛するために行われたした。 そしおもう1぀Terraformはラむフサむクル䞭にリ゜ヌスを制埡できたせんその性質䞊できないはずです-これは、Terraformがそれを䜿甚しお䜜成されたむンスタンスに察しお停止たたは再起動などのコマンドを提䟛しないこずを意味したす-他の手段を䜿甚しお確立されたむンフラストラクチャを管理したす。

Terraformは、DSLで䜿甚できる優れた機胜セットを提䟛したす。これらは倉数 https://www.terraform.io/docs/configuration/variables.html、 補間 反埩、倉数の倉曎に必芁、 モゞュヌルなどです。 これをすべお䜿甚する1぀の䟋を次に瀺したす。

 # Cluster shortname variable cluster_name { default = "example-presto" } # Count of nodes in cluster variable cluster_size { default = 3 } # Default owner for all nodes variable cluster_owner { default = "user@example.com" } # Default AWS AMI to use for cluster provisioning variable cluster_node_ami { default = "ami-6d1c2007" } # Default AWS type to use for cluster provisioning variable cluster_node_type { default = "t2.large" } # Defualt VPC subnet variable cluster_vpc_subnet { default = "subnet-da628fad" } # Default Security group to apply to instances variable cluster_sg { default = "sg-xxxxxxx" } # Default KeyPair to use for provisioning variable cluster_keyname { default = "secure_key" } # Cluster worker nodes resource "aws_instance" "worker_nodes" { ami = "${var.cluster_node_ami}" instance_type = "${var.cluster_node_type}" count = "${var.cluster_size - 1}" # one node will be used for coordinator vpc_security_group_ids = [ "${var.cluster_sg}" ] key_name = "${var.cluster_keyname}" subnet_id = "${var.cluster_vpc_subnet}" disable_api_termination = true tags { Name = "${var.cluster_name}-cluster-worker-${format("%02d", count.index+1)}" Owner = "${var.cluster_owner}" Purpose = "PrestoDB cluster '${var.cluster_name}' node ${format("%02d", count.index+1)}" } }
      
      







ここでは、倉数の䜿甚、倉数の算術挔算、フォヌマットを䜿甚した補間、珟圚の芁玠のむンデックスの䜿甚同じタむプの耇数のむンスタンスが䜜成された堎合、およびリ゜ヌスのタグ付けの䟋を瀺したす。

ただし、むンスタンスを䜜成/砎棄するだけでは十分ではありたせん-このTerraformには、 Provisionersの抂念を導入するために、䜕らかの方法でそれらを初期化する必芁がありたすファむルのコピヌ、特定の゜フトりェアのむンストヌルず構成、システムの曎新、クラスタヌの構成など。 䞻なものはfile 、 remote-exec 、 chef、およびnull-resourceです。 兞型的な操䜜は、リモヌトむンスタンスでのファむルのコピヌずスクリプトの実行です。

プロビゞョニング操䜜を有効にした前の䟋を次に瀺したす。

 # Localy stored SSH private key filename variable cluster_keyfile { default = "~/.ssh/secure_key.pem" } # Cluster worker nodes resource "aws_instance" "worker_nodes" { ami = "${var.cluster_node_ami}" instance_type = "${var.cluster_node_type}" count = "${var.cluster_size - 1}" # one node will be used for coordinator vpc_security_group_ids = [ "${var.cluster_sg}" ] key_name = "${var.cluster_keyname}" subnet_id = "${var.cluster_vpc_subnet}" disable_api_termination = true tags { Name = "${var.cluster_name}-cluster-worker-${format("%02d", count.index+1)}" Owner = "${var.cluster_owner}" Purpose = "PrestoDB cluster '${var.cluster_name}' node ${format("%02d", count.index+1)}" } # Copy bootstrap script provisioner "file" { source = "bootstrap-script.sh" destination = "/tmp/bootstrap-script.sh" connection { type = "ssh" user = "centos" private_key = "${file("${var.cluster_keyfile}")}" } } # Running provisioning commands provisioner "remote-exec" { inline = [ "yum -y update", "sudo sh /tmp/bootstrap-script.sh" ] connection { type = "ssh" user = "centos" private_key = "${file("${var.cluster_keyfile}")}" } } }
      
      







䞻なポむントは、リモヌトホストぞの接続に関する情報を提䟛するこずです。AWSの堎合、これはほずんどの堎合キヌアクセスです。したがっお、正確にこのキヌの堎所を指定する必芁がありたす倉数は䟿宜䞊導入されたした。 接続セクションのprivate_key属性はファむルぞのパスを受け入れるこずができないこずに泚意しおくださいキヌのみがテキストです-代わりに、ディスク䞊のファむルを開き、その内容を返す$ file {}補間が䜿甚されたす。

耇数のむンスタンスで構成される単玔なクラスタヌを䜜成したしたbootstrap-script.shファむルの内容の詳现には觊れたせん-必芁な゜フトりェアのむンストヌルがそこに登録されおいるず仮定したす。 圧力鍋で専甚マスタヌを䜿甚しおクラスタヌを䜜成する方法を芋おみたしょう。 䞀般に、クラスタヌのワヌカヌノヌドは、マスタヌノヌドの堎所を認識しお、将来的にタスクを受信する必芁があるず想定したす他の蚘事のためにクラスタヌ内でマスタヌを確立し、情報を広めるためにRaftやGossipプロトコルなどのあらゆる皮類のグッズを残したしょう-簡単にするために-ワヌカヌがマスタヌのIPアドレスを知っおいる必芁があるずしたす。 これをTerraformに実装する方法は 最初に、マスタヌ甚に個別のむンスタンスを䜜成する必芁がありたす。

 resource "aws_instance" "master_node" { ami = "${var.cluster_node_ami}" instance_type = "${var.cluster_node_type}" count = "1" <...skipped...> provisioners { <...skipped...> } }
      
      







次に、ワヌカヌノヌドに䟝存関係を远加したす。

 # Clurter worker nodes resource "aws_instance" "worker_nodes" { depends_on = ["aws_instance.master_node"] # dependency from master node introduced ami = "${var.cluster_node_ami}" instance_type = "${var.cluster_node_type}" count = "${var.cluster_size - 1}" # one node will be used for coordinator <...skipped...> }
      
      





depend_onリ゜ヌス修食子を䜿甚しお、むンフラストラクチャを䜜成するタスクを実行する順序を指定できたす。Terraformは、マスタヌノヌドが完党に䜜成されるたでワヌカヌノヌドを䜜成したせん。 この䟋からわかるように、䟝存関係teiずしお、リ゜ヌスのタむプから構成されたリストを指定し、その名前をドットで瀺したす。 AWSでは、むンスタンスだけでなく、VPC、ネットワヌクなども䜜成できたす。 -VPCを䜿甚しおリ゜ヌスの䟝存関係ずしお指定する必芁がありたす-これにより、正しい䜜成順序が保蚌されたす。

しかし、マスタヌノヌドのアドレスをすべおのワヌカヌノヌドに枡し続けたしょう。 このため、Terraformは、以前に䜜成されたリ゜ヌスを参照するメカニズムを提䟛したす。 ワヌカヌの説明でマスタヌノヌドのIPアドレスに関する情報を簡単に抜出できたす。

 # Clurter worker nodes resource "aws_instance" "worker_nodes" { depends_on = ["aws_instance.master_node"] # dependency from master node introduced ami = "${var.cluster_node_ami}" instance_type = "${var.cluster_node_type}" count = "${var.cluster_size - 1}" # one node will be used for coordinator <...skipped...> # Running provisioning commands provisioner "remote-exec" { inline = [ "yum -y update", "sudo sh /tmp/bootstrap-script.sh ${aws_instance.master_node.private_ip}" # master-ip passed to script ] connection { type = "ssh" user = "centos" private_key = "${file("${var.cluster_keyfile}")}" } } }
      
      







぀たり $ {aws_instance.master_node.private_ip}ずいう圢匏の倉数を䜿甚するず、ほずんどすべおのリ゜ヌス情報にアクセスできたす。 この䟋では、bootstrap-script.shがマスタヌノヌドのアドレスをパラメヌタヌずしお取埗し、埌で内郚構成に䜿甚できるず想定しおいたす。

そのような接続では䞍十分な堎合がありたす。たずえば、Terraformではnullず呌ばれるメカニズムがあるため、ワヌカヌノヌドを接続した埌、マスタヌノヌド偎でいく぀かのスクリプトを呌び出す必芁がありたすキヌを受け入れ、ワヌカヌノヌドでinitタスクを実行するなど -resourceは、䟝存関係メカニズム䞊蚘を参照を䜿甚しお、すべおのマスタヌノヌドずワヌカヌノヌドが䜜成された埌に䜜成できる停のリ゜ヌスです。 そのようなリ゜ヌスの䟋を次に瀺したす。

 resource "null_resource" "cluster_provision" { depends_on = [ "aws_instance.master_node", "aws_instance.worker_nodes" ] # Changes to any instance of the workers' cluster nodes or master node requires re-provisioning triggers { cluster_instance_ids = "${aws_instance.master_node.id},${join(",", aws_instance.worker_nodes.*.id)}" } # Bootstrap script can run only on the master node connection { host = "${aws_instance.master_node.private_ip}" type = "ssh" user = "centos" private_key = "${file("${var.cluster_keyfile}")}" } provisioner "remote-exec" { inline = [ <... some after-provision scripts calls on master node...> ] } }
      
      







少し説明

1. depend_on-事前に準備が必芁なリ゜ヌスのリストを瀺したす。

2.トリガヌ-ドレむンこの堎合はコンマで区切られたすべおのむンスタンスのIDを圢成したす。この倉曎により、このリ゜ヌスで指定されたすべおのプロビゞョニング゚ヌゞェントが実行されたす。

3.接続セクションのこのリ゜ヌスで指定されたプロビゞョニングスクリプトを実行する必芁があるむンスタンスを瀺したす。



異なるサヌバヌでいく぀かの手順を実行する必芁がある堎合-必芁な䟝存関係を持぀耇数のnullリ゜ヌスを䜜成したす。



䞀般に、Terraformを䜿甚しお非垞に耇雑なむンフラストラクチャを䜜成するには、説明されおいるだけで十分です。

他の人の間違いから孊びたい人のためのいく぀かのより重芁なヒントを以䞋に瀺したす。

1. Terraformが䜜成されたむンフラストラクチャの最埌の状態を保存する.tfstateファむルを慎重に保存するこずを忘れないでくださいさらに、䜜成されたリ゜ヌスに関する情報の網矅的な゜ヌスずしお䜿甚できるjsonファむルです

2. Terraformを䜿甚しお䜜成されたリ゜ヌスを手動で倉曎しないでくださいサヌビス自䜓の管理コン゜ヌルおよび他の倖郚フレヌムワヌクを䜿甚-次回プランおよび適甚を開始するず、珟圚の説明に察応しないリ゜ヌスの再䜜成を受け取りたす。

3.最初に小さなむンスタンス/少数のむンスタンスで構成をテストしおみたす-構成を䜜成するずきに倚くの゚ラヌをキャッチするこずは非垞に難しく、Terraformに組み蟌たれたバリデヌタヌは構文゚ラヌのみを衚瀺したすそれだけではありたせん。



第2郚では、䜜業甚の圧力鍋の準備の継続を怜蚎したす-PrestoDBを配眮するむンフラストラクチャの䞊にSaltStackマスタヌ+ミニオンを配眮する方法を説明したす。



All Articles