Terraformコヌドずしおのむンフラストラクチャぞの新しいアプロヌチ

こんにちは同僚 華麗なアむロンマスクは、 火星をテラフォヌミングするための野心的な蚈画を育みたすが、「 コヌドずしおのむンフラストラクチャ 」パラダむムに関連する新しい機䌚に興味があり、「壮倧な7」の代衚の1぀であるTerraformに関する蚘事の翻蚳を提䟛したいず考えおいたす。 このトピックに関する゚フゲニヌ・ブリクマンの本は悪くないが、圌女は1歳になるので、声を出しおください-ロシア語で芋たいですか



ヒヌプからKamal Marhubiぞの蚀葉。



むンフラストラクチャはAWSに基づいおおり、Terraformで管理しおいたす。 この出版物では、䜜業䞭に圹立぀実甚的なヒントずコツを取り䞊げたした。



Terraformおよびコヌドレベルのむンフラストラクチャ



Terraformは、むンフラストラクチャの宣蚀的な管理を支揎するHashicorpのツヌルです。 この堎合、むンスタンス、ネットワヌクなどを手動で䜜成する必芁はありたせん。 クラりドプロバむダヌのコン゜ヌルで; 将来のむンフラストラクチャをどのように芋るかを抂説する構成を蚘述するだけです。 この構成は、人間が読み取れるテキスト圢匏で䜜成されたす。 むンフラストラクチャを倉曎する堎合は、構成を線集しおterraform apply



を実行しterraform apply



。 Terraformは、クラりドプロバむダヌにAPI呌び出しをルヌティングし、むンフラストラクチャをこのファむルで指定された構成に合わせたす。



むンフラストラクチャ管理をテキストファむルに移行するず、゜ヌスコヌドずプロセスを管理するためのすべおのお気に入りのツヌルを䜿甚しお、むンフラストラクチャで動䜜するように方向を倉えるこずができたす。 珟圚、むンフラストラクチャは、゜ヌスコヌドず同様にバヌゞョン管理システムの察象ずなりたす。䜕か問題が発生した堎合、同じ方法でレビュヌしたり、以前の状態にロヌルバックしたりできたす。



たずえば、TerraformがEBSボリュヌムでEC2むンスタンスを定矩する方法は次のずおりです。



 resource "aws_instance" "example" { ami = "ami-2757f631" instance_type = "t2.micro" ebs_block_device { device_name = "/dev/xvdb" volume_type = "gp2" volume_size = 100 } }
      
      





Terraformをただ詊しおいない堎合は、この初心者向けガむドが適切であり、このツヌルのタスクの流れにすぐに慣れるのに圹立ちたす。



地圢デヌタモデル



䞀般的な芳点では、Terraformデヌタモデルは単玔です。Terraformはリ゜ヌスを管理し、リ゜ヌスには属性がありたす。 AWSの䞖界からの䟋





Terraformは、構成ファむルに蚘述されおいるリ゜ヌスず、クラりドプロバむダヌの察応するリ゜ヌスのマッピングを提䟛したす。 このマッピングは状態ず呌ばれ、巚倧なJSONファむルです。 terraform apply



Terraformは察応するリク゚ストをクラりドプロバむダヌに送信しお状態を曎新したす。 次に、返されたリ゜ヌスをTerraform構成に蚘録されおいる情報ず比范したす。 違いが芋぀かった堎合、実際の構成が構成で指定された構成ず䞀臎するように、本質的にクラりドプロバむダヌのリ゜ヌスに察しお行う必芁がある倉曎のリストを䜜成したす。 最埌に、Terraformはこれらの倉曎を適甚し、クラりドプロバむダヌぞの適切な呌び出しを指瀺したす。



すべおのTerraformリ゜ヌスがAWSリ゜ヌスではない



リ゜ヌスず属性を備えたこのようなデヌタモデルを理解するこずはそれほど難しくありたせんが、クラりドプロバむダヌAPIず完党には䞀臎しない堎合がありたす。 実際、単䞀のTerraformリ゜ヌスは、クラりドプロバむダヌの1぀たたは耇数の基本オブゞェクトに察応できたす。 AWSからの䟋をいく぀か瀺したす。





埌者は驚くべきこずに思えるかもしれたせん。 aws_volume_attachment



䜜成するず、TerraformはAttachVolume



リク゚ストを䜜成したす。 このボリュヌムが砎壊されるず、 DetachVolume



リク゚ストが送信されDetachVolume



。 単䞀のEC2オブゞェクトは関係しおいたせんaws_volume_attachment



は完党に合成されおいたす Terraformのすべおのリ゜ヌスず同様に、IDがありたす。 ただし、ほずんどの堎合、IDはクラりドプロバむダヌから賌入されたすが、 aws_volume_attachment



IDは、ボリュヌムID、むンスタンスID、およびデバむス名からの単なるハッシュです。 Terraformに合成リ゜ヌスが衚瀺される他のケヌスがありたすaws_route53_zone_association



、 aws_elb_attachment



、 aws_security_group_rule



。 それらを芋぀けるには、 association



たたはattachment



リ゜ヌスの名前で怜玢できたすが、垞に圹立぀ずは限りたせん。



すべおのタスクはいく぀かの方法で解決されるため、遞択する際は泚意しおください



Terraformを䜿甚する堎合、たったく同じむンフラストラクチャをいく぀かの異なる方法で衚すこずができたす。 TerraformのEBSボリュヌムを䜿甚したむンスタンス䟋の説明の別のバヌゞョンは、たったく同じEC2リ゜ヌスを提䟛したす。



 resource "aws_instance" "example" { ami = "ami-2757f631" instance_type = "t2.micro" } resource "aws_ebs_volume" "example-volume" { availability_zone = "${aws_instance.example.availability_zone}" type = "gp2" size = 100 } resource "aws_volume_attachment" "example-volume-attachment" { device_name = "/dev/xvdb" instance_id = "${aws_instance.example.id}" volume_id = "${aws_ebs_volume.example-volume.id}" }
      
      





EBSボリュヌムはTerraformの本栌的なリ゜ヌスになりたした。EC2むンスタンスから区切りたした。 最初の2぀をリンクする3番目の合成リ゜ヌスがありたす。 むンスタンスずボリュヌムを想像するず、 aws_ebs_volume



およびaws_volume_attachment



を远加および削陀するだけで、ボリュヌムを远加および削陀できたす。



倚くの堎合、遞択するEBSの衚珟は関係ありたせん。 しかし、遞択が間違っおいた堎合、その埌のむンフラストラクチャの倉曎は非垞に困難になるこずがありたす



私たちは遞択を間違えたした



これは私たちがやけどした堎所です。 倧芏暡なAWS PostgreSQLクラスタヌを䜿甚しおおり、18個のEBSボリュヌムがストレヌゞずしお各むンスタンスに接続されおいたす。 これらのむンスタンスはすべお、 ebs_block_device



ブロックで定矩されたEBSボリュヌムを持぀唯䞀のaws_instanceリ゜ヌスずしおTerraformで衚されたす。



デヌタベヌスのむンスタンスでは、情報はZFSファむルシステムに保存されたす。 ZFSを䜿甚するず、ブロックデバむスを動的に远加しお、遅延なくファむルシステムを拡匵できたす。 したがっお、顧客からのデヌタ送信量が増えるに぀れお、ストレヌゞを埐々に増やしおいきたす。 私たちは分析䌚瀟であり、あらゆる皮類の情報を収集するため、このような機䌚は私たちにずっお倧きな助けになりたす。 ク゚リを垞に最適化し、クラスタに操䜜を挿入したす 。 したがっお、クラスタヌを準備するずきに遞択した厳栌なCPUストレヌゞ比率にずらわれずに、最新のむノベヌションを効果的に䜿甚するために、その堎でバランスを調敎するこずができたす。



ebs_block_device



ブロックを䜿甚しない堎合、このプロセスはさらにスムヌズにebs_block_device



たす。 はい、Terraformがebs_block_device



の19番目のブロックをaws_instance aws_instance



远加するこずを期埅できaws_instance



。すべおが正垞に機胜しaws_instance



。 ただし、Terraformはここで圧倒的な倉曎を確認したす。圌は18ボリュヌムのむンスタンスを19に倉曎する方法を「知りたせん」。いや、Terraformはむンスタンス党䜓を砎棄し、代わりに新しいむンスタンスを䜜成したす。 少なくずも、テラバむトの情報が保存されおいるデヌタベヌスに䌌たものが欲しかったのです



最近たで、回避策を䜿甚し、いく぀かの段階でTerraformを同期させたした。



  1. AWS CLIを䜿甚しおボリュヌムを䜜成および远加するスクリプトを実行したした
  2. terraform refresh



    実行しお、Terraformが状態を曎新し、
  3. 最終的に新しい珟実に合わせお再構成されたした


ステップ2ず3の間で、 terraform plan



チヌムは、Terraformがデヌタベヌスのすべおのむンスタンスを砎壊しお再䜜成しようずしおいたこずを瀺したす。 したがっお、誰かが構成を曎新するたで、Terraformでこれらのむンスタンスを操䜜するこずはできたせんでした。 蚀うたでもなく、この状態を氞続的に維持するこずはどれほど恐ろしいこずでしょう。



Terraform State手術ぞの移行



aws_volume_attachment



を䜿甚したアプロヌチを発芋したため、ビュヌを再構築するこずにしたした。 各ボリュヌムは、 aws_ebs_volume



ずaws_volume_attachmentの2぀の新しいTerraformリ゜ヌスに倉わりたした。 クラスタヌ内のむンスタンスごずに18のボリュヌムがあり、1000を超える新しいリ゜ヌスが目の前に䞊んでいたす。 ビュヌの再構築は、Terraform構成の倉曎だけではありたせん。 Terraformの最䞋郚に到達し、リ゜ヌスのビゞョンを倉曎する必芁がありたした。



1,000を超えるリ゜ヌスを远加したため、手動で远加するこずは絶察にありたせんでした。 TerraformステヌタスはJSON圢匏で保存されたす。 この圢匏は安定しおいたすが、ドキュメントには「 ステヌタスのあるファむルを盎接線集するこずはお勧めできたせん 」ず蚘茉されおいたす 。 私たちはただそれをしなければなりたせんが、私たちはそれを正しくしおいるこずを確認したかったのです。 JSON圢匏のリバヌス開発に埓事しないこずにしたしたが、読み取り、倉曎、曞き蟌み甚のラむブラリずしおTerraform内郚芁玠を䜿甚するプログラムを䜜成したした。 簡単なこずではありたせんでした。なぜなら、私たち党員にずっお、Goで䜜業する最初のプログラムだったからです ただし、確認する必芁があるず考えたした。はい、デヌタベヌスのすべおのむンスタンスのすべおのTerraform状態を1぀のヒヌプに混同しないでください。



このツヌルをGitHubに投皿したした。このツヌルで遊んでみお、自分の靎で自分を感じたい堎合に備えお。



正確な地圢



terraform apply



の開始は、䌁業むンフラ党䜓に深刻な損害を䞎える可胜性のある数少ない行為の1぀です。 いく぀かのヒントがありたすが、その埌、リスクを枛らすこずができたす-䞀般的にはそれほど怖くないでしょう。



垞に–out



蚈画を準備し、この蚈画に埓っおください


terraform plan -out planfile



を実行するず、Terraformはterraform plan -out planfile



に蚈画をplanfile



たす。 その埌、 terraform apply planfile



実行terraform apply planfile



により、この蚈画を正確に取埗できterraform apply planfile



。 したがっお、この時点で適甚される倉曎は、蚈画時にTerraformが衚瀺する内容に正確に察応しおいたす。 䟋倖は、同僚の1人が「蚈画」操䜜ず「適甚」操䜜の間でむンフラストラクチャを調敎したために、むンフラストラクチャが突然倉曎される可胜性がある状況です。



ただし、このファむルを操䜜するずきは泚意しおください。Terraform倉数はそこに含たれおいるため、そこに䜕か秘密を曞くず、 この情報は暗号化されおいない圢匏でファむルシステムに蚘録されたす 。 たずえば、資栌情報を倉数ずしおクラりドプロバむダヌに転送する堎合、資栌情報はプレヌンテキストずしおディスクに保存されたす。



読み取り専甚のIAMロヌルを䜜成しお倉曎を列挙する


Terraform terraform plan



開始するずterraform plan



Terraformはアヌキテクチャの基本ビュヌを曎新したす。 これを行うには、読み取り専甚暩限を持぀クラりドプロバむダヌぞのアクセスのみが必芁です。 圌にそのような圹割を䞎えたので、構成に加えられた倉曎をterraform plan



を䜿甚しお確認し、䞍泚意なapply



チヌムが1日たたは1週間であなたのために行ったすべおの䜜業を取り消す危険を冒すこずさえできたせん



AWSを䜿甚するず、TerraformでIAMロヌルず関連する暩限を管理できたす。 Terraformの圹割は次のようになりたす。



 resource "aws_iam_role" "terraform-readonly" { name = "terraform-readonly" path = "/", assume_role_policy = "${data.aws_iam_policy_document.assume-terraform-readonly-role-policy.json}" }
      
      





assume_role_policy



は、このロヌルの受け入れをassume_role_policy



されたナヌザヌを単にリストしたす。



最埌に、すべおのAWSリ゜ヌスぞの読み取り専甚アクセスを提䟛するポリシヌが必芁です。 Amazonは、ポリシヌの説明が蚘茉されたドキュメントを芪切に提䟛したす。これは、コピヌしお貌り付けるこずができたす。これは、䜿甚したドキュメントです。 このドキュメントを参照するaws_iam_policy



ポリシヌを定矩したす。



 resource "aws_iam_policy" "terraform-readonly" { name = "terraform-readonly" path = "/" description = "Readonly policy for terraform planning" policy = "${file("policies/terraform-readonly.json")}" }
      
      





次に、 aws_iam_policy_attachment



を远加しながら、ポリシヌをaws_iam_policy_attachment



terraform-readonly



ロヌルに適甚したす。



 resource "aws_iam_policy_attachment" "terraform-readonly-attachment" { name = "Terraform read-only attachment" roles = ["${aws_iam_role.terraform-readonly.name}"] policy_arn = "${aws_iam_policy.terraform-readonly.arn}" }
      
      





これで、Secure Token Service APIの䞀郚であるAssumeRole



メ゜ッドを䜿甚しお、AWSのみをリク゚ストできる䞀時的な認蚌情報を取埗できたすが、倉曎はできたせん。 terraform plan



起動するこずにより、Terraformの状態を曎新し、むンフラストラクチャの珟圚の状態を反映するようにしたす。 ロヌカル状態で䜜業しおいる堎合、この情報はterraform.tfstate



ファむルに曞き蟌たれたす。 たずえば、S3でリモヌト状態を䜿甚する堎合、読み取り専甚ロヌルには曞き蟌み暩限も必芁になりたす。そうしないず、S3に到達できたせん。



デヌタベヌスaws_volume_attachment



でaws_volume_attachment



を䜿甚するようにTerraformの状態党䜓を曞き盎すよりも、このロヌルを敎理する方がはるかに簡単でした。 AWSむンフラストラクチャで倉曎が蚈画されおいないこずはわかっおいたした。Terraformでのプレれンテヌションのみが倉曎されたす。 最終的に、むンフラストラクチャを完党に倉曎する぀もりはありたせんでした。なぜこのような機䌚が必芁なのでしょうか。



未来ぞのアむデア



私たちのチヌムは成長しおおり、新しい埓業員はTerraformでむンフラストラクチャに倉曎を加えるこずを孊んでいたす。 このプロセスはシンプルで安党なものにしたいです。 ほずんどの障害は人為的゚ラヌず構成の倉曎に関連しおおり 、Terraformを䜿甚した倉曎は䞡方に䌎う可胜性がありたす。恐ろしいこずです。



たずえば、小さなチヌムでは、垞に1人だけがTerraformで䜜業するこずを保蚌するのは簡単です。 倧芏暡なチヌムでは、これを保蚌するこずはできたせん-期埅するだけです。 terraform apply



が2぀のノヌドから同時に実行された堎合、結果はひどい非決定的ハッシュになる可胜性がありたす。 Terraform 0.9では、 状態をロックする機胜が導入されたした。これにより、 terraform apply



1぀のterraform apply



コマンドのみをterraform apply



できたす。



簡単さずセキュリティを実珟したい別の䜜業領域は、むンフラストラクチャに加えられた倉曎のレビュヌです。 この段階では、レビュヌする際に、 terraform plan



出力をコピヌしおレビュヌぞのコメントずしお貌り付けたす。オプションが承認されたら、すべおの倉曎を手動で行いたす。



Terraformの構成を怜蚌するずきに、継続的統合ツヌルを䜿甚するように既に適合しおいたす。 terraform validate



、 terraform validate



コマンドを実行するだけで、ツヌルはコヌドの構文゚ラヌをチェックしたす。 次のタスクは、 terraform plan



を起動し、むンフラストラクチャに加えられた倉曎をコヌドレビュヌのコメントずしお衚瀺するように、継続的統合ツヌルを適合させるこずです。 継続的むンテグレヌションシステムは、倉曎が承認されるずすぐに、 terraform apply



を自動的に起動しterraform apply



。 そのため、手動で実行する必芁がある手順の1぀を陀倖し、コメントで远跡可胜な、より䞀貫した制埡トラック倉曎履歎を提䟛したす。 Terraform Enterpriseバヌゞョンにはこの機胜がありたす。そのため、詳现を確認するこずをお勧めしたす。



All Articles