Terraform から CloudFormation に切り替えお埌悔したした

むンフラストラクチャを反埩可胜なテキスト圢匏のコヌドずしお衚珟するこずは、マりスを操䜜する必芁のないシステムにずっおのシンプルなベスト プラクティスです。 この習慣には名前がありたす - コヌドずしおのむンフラストラクチャ、これたでのずころ、特に AWS では、それを実装するための XNUMX ぀の人気のあるツヌルがありたす。 テラフォヌム О クラりドフォヌメヌション.

Terraform から CloudFormation に切り替えお埌悔したした
Terraform ず CloudFormation の゚クスペリ゚ンスを比范する

に来る前に Twitch 別名 アマゟンゞュニア 私は働いた XNUMX回の起動で Terraform を XNUMX 幎間䜿甚したした。 新しい堎所でも、私は Terraform を党力で䜿いたしたが、䌚瀟は CloudFormation を含む Amazon 流のすべおぞの移行を掚進したした。 私は䞡方のベスト プラクティスを熱心に開発し、非垞に耇雑な組織党䜓のワヌクフロヌで䞡方のツヌルを䜿甚しおきたした。 その埌、Terraform から CloudFormation ぞの移行の圱響を慎重に比范怜蚎した結果、おそらく Terraform が組織にずっお最良の遞択であるず確信したした。

恐ろしいテラフォヌミング

ベヌタ版゜フトりェア

Terraform はただバヌゞョン 1.0 さえリリヌスしおいないため、これを䜿甚しないのは十分な理由です。 初めお自分で詊した時からは倧きく倉わりたしたが、圓時は terraform apply 倚くの堎合、数回の曎新埌、たたは単に数幎間の䜿甚埌に故障したす。 「今は䜕もかもが違う」ず蚀いたいずころですが 誰もがそう蚀いそうですよね 適切ではあるものの、以前のバヌゞョンず互換性のない倉曎があり、リ゜ヌス ストアの構文ず抜象化が今必芁なものであるようにさえ感じたす。 楜噚は本圓に良くなったように芋えたすが... :-0

䞀方で、AWS は䞋䜍互換性の維持に優れた仕事をしおきたした。 これはおそらく、サヌビスが組織内で培底的にテストされ、その埌初めお名前が倉曎されお公開されるこずが倚いためです。 したがっお、「圌らは䞀生懞呜努力した」ずいうのは控えめな衚珟です。 AWS のような倚様で耇雑なシステムの API ずの䞋䜍互換性を維持するこずは、非垞に困難です。 これほど広く䜿甚されおいるパブリック API を長幎にわたっお維持しなければならなかった人なら、それを維持するこずがいかに難しいかを理解するはずです。 しかし、私の蚘憶では、CloudFormation の動䜜は䜕幎経っおも倉わっおいたせん。

足に䌚う...それは匟䞞だ

私の知る限りでは、リ゜ヌスを削陀したす アりトサむダヌ CF スタックから CloudFormation スタックを取埗するこずはできたせん。 Terraform に぀いおも同様です。 これにより、既存のリ゜ヌスをスタックにむンポヌトできたす。 その機胜は玠晎らしいずも蚀えたすが、倧きな力には倧きな責任が䌎いたす。 スタックにリ゜ヌスを远加するだけで枈みたす。スタックの操䜜䞭は、このリ゜ヌスを削陀したり倉曎したりするこずはできたせん。 ある日、それが裏目に出おしたった。 ある日、Twitch で、䜕者かが悪意を持っおいないにもかかわらず、誀っお他人の AWS セキュリティ グルヌプを自分の Terraform スタックにむンポヌトしおしたいたした。 いく぀かのコマンドを入力したずころ、セキュリティ グルヌプが (受信トラフィックずずもに) 消えおしたいたした。

テラフォヌムグレヌト

䞍完党な状態からの回埩

CloudFormation がある状態から別の状態に完党に移行できない堎合がありたす。 同時に、以前のものに戻ろうずしたす。 これが垞に実珟できるわけではないのは残念です。 埌で䜕が起こったのかをデバッグするのは非垞に恐ろしいこずです。たずえそれを修正するためであっおも、CloudFormation がハッキングされおも喜ぶかどうかはわかりたせん。 以前の状態に戻るこずが可胜かどうか、圌は実際に刀断する方法を知らず、デフォルトでは奇跡を埅ちながら䜕時間もハングアップしたす。

䞀方、Terraform は倱敗した移行からより適切に回埩する傟向があり、高床なデバッグ ツヌルを提䟛したす。

ドキュメントの状態の倉化がより明確に

「わかりたした、ロヌドバランサヌ、倉曎䞭です。 でもどうやっお」

—䞍安な゚ンゞニア、「承諟」ボタンを抌す準備ができおいたす。

堎合によっおは、ポヌト番号の远加やセキュリティ グルヌプの倉曎など、CloudFormation スタックのロヌド バランサで䜕らかの操䜜を行う必芁がありたす。 ClouFormation では倉曎が適切に衚瀺されたせん。 私は、必芁なものを削陀しおいないか、䞍必芁なものを远加しおいないかを確認するために、yaml ファむルを XNUMX 回再確認したす。

この点においお、Terraform はより透明性が高くなりたす。 時々、圌は透明すぎる぀たり、迷惑なこずさえありたす。 幞いなこずに、最新バヌゞョンには倉曎の衚瀺が改善されおおり、䜕が倉曎されおいるかを正確に確認できるようになりたした。

柔軟性

゜フトりェアを逆方向に曞きたす。

端的に蚀えば、長寿呜の゜フトりェアの最も重芁な特性は、倉化に適応する胜力です。 ゜フトりェアを逆方向に蚘述したす。 ほずんどの堎合、私は「単玔な」サヌビスを採甚し、すべおを XNUMX ぀の CloudFormation たたは Terraform スタックに詰め蟌み始めるずいう間違いを犯したした。 そしおもちろん、数か月埌、私の理解がすべお間違っおいたこずが刀明し、そのサヌビスは実際には単玔なものではありたせんでした。 そしお今床は、䜕らかの方法で倧きなスタックを小さなコンポヌネントに分割する必芁がありたす。 CloudFormation を䜿甚する堎合、これは最初に既存のスタックを再䜜成するこずによっおのみ行うこずができたすが、私はデヌタベヌスではこれを行いたせん。 䞀方、Terraform では、スタックを分析し、より理解しやすい小さな郚分に分割するこずが可胜になりたした。

git のモゞュヌル

Terraform コヌドを耇数のスタック間で共有するこずは、CloudFormation コヌドを共有するよりもはるかに簡単です。 Terraform を䜿甚するず、コヌドを git リポゞトリに配眮し、セマンティック バヌゞョン管理を䜿甚しおアクセスできたす。 このリポゞトリにアクセスできる人は誰でも共有コヌドを再利甚できたす。 CloudFormation に盞圓するのは S3 ですが、同じ利点はなく、S3 を優先しお git を攟棄する必芁がある理由はたったくありたせん。

組織が成長し、共通スタックを共有する機胜が重芁なレベルに達したした。 Terraform を䜿甚するず、これがすべお簡単か぀自然になりたすが、CloudFormation では、このような機胜を実珟する前に困難を乗り越える必芁がありたす。

コヌドずしおの操䜜

「スクリプトを曞いおみたしょう。それでOKです。」

—Terraform 自転車を発明する 3 幎前の゚ンゞニア。

゜フトりェア開発に関しお蚀えば、Go や Java プログラムは単なるコヌドではありたせん。

Terraform から CloudFormation に切り替えお埌悔したした
コヌドずしおのコヌド

それが機胜するむンフラストラクチャもありたす。

Terraform から CloudFormation に切り替えお埌悔したした
コヌドずしおのむンフラストラクチャ

しかし、圌女はどこの出身ですか それを監芖するにはどうすればよいですか? コヌドはどこに存圚したすか? 開発者にはアクセス蚱可が必芁ですか?

Terraform から CloudFormation に切り替えお埌悔したした
コヌドずしおの操䜜

゜フトりェア開発者になるずいうこずは、コヌドを曞くこずだけを意味するわけではありたせん。

AWS だけではありたせん。おそらく他のプロバむダヌを䜿甚しおいるでしょう。 SignalFx、PagerDuty、たたは Github。 おそらく、CI/CD 甚の内郚 Jenkins サヌバヌ、たたは監芖甚の内郚 Grafana ダッシュボヌドがあるでしょう。 Infra as Code が遞択される理由はさたざたですが、それぞれが゜フトりェアに関連するすべおのものにずっお同様に重芁です。

私が Twitch で働いおいたずき、Amazon の組み蟌みシステムず AWS の混合システム内のサヌビスを高速化したした。 私たちは倚くのマむクロサヌビスを量産しおサポヌトしおおり、運甚コストが増加したした。 議論は次のようなものでした。

  • Я: くそヌ、2 ぀のマむクロサヌビスをオヌバヌクロックするにはたくさんのゞェスチャヌが必芁です。 このゎミを䜿っお AWS アカりントを䜜成する必芁がありたす (私たちは XNUMX ぀のアカりントに行きたした) マむクロサヌビス)、次にこれはアラヌトの蚭定甚、これはコヌド リポゞトリ甚、これはメヌル リスト甚、そしおこれは...
  • 鉛: スクリプトを䜜成しおみたしょう。
  • Я: わかりたしたが、スクリプト自䜓は倉曎されたす。 これらすべおの組み蟌み Amazon ギズモが最新であるこずを確認する方法が必芁になりたす。
  • 鉛 いいですね。 そしお、これのためのスクリプトを曞きたす。
  • Я 玠晎らしい そしお、おそらくスクリプトでパラメヌタを蚭定する必芁がありたす。 圌はそれらを受け入れおくれるだろうか
  • 鉛: 圌にどこたでも連れお行っおもらいたしょう!
  • Я: プロセスが倉曎される可胜性があり、䞋䜍互換性が倱われたす。 ある皮のセマンティックなバヌゞョン管理が必芁になりたす。
  • 鉛 いい案
  • Я: ツヌルはナヌザヌ むンタヌフェむス内で手動で倉曎できたす。 これを確認しお修正する方法が必芁です。


3幎埌

  • 鉛そしお、テラフォヌムを手に入れたした。

この話の教蚓は次のずおりです。 アマゟンのすべおにおいお真っ逆さたの堎合、AWS 以倖のものを䟝然ずしお䜿甚しおおり、これらのサヌビスには、蚭定蚀語を䜿甚しおその状態の同期を保぀状態がありたす。

CloudFormation lambda ず git モゞュヌル terraform

lambda は、カスタム ロゞックの問題に察する CloudFormation の゜リュヌションです。 ラムダを䜿甚するず、次のこずができたす マクロを䜜成する たたは ナヌザヌリ゜ヌス。 このアプロヌチでは、Terraform の git モゞュヌルのセマンティック バヌゞョニングには存圚しない耇雑さがさらに加わりたす。 私にずっお、最も差し迫った問題は、これらすべおのナヌザヌ ラムダ (これらは数十の AWS アカりント) のアクセス蚱可を管理するこずでした。 もう XNUMX ぀の重芁な問題は、「鶏が先か、卵が先か?」ずいう問題で、ラムダ コヌドに関連しおいたした。 この機胜自䜓はむンフラストラクチャでありコヌドであり、それ自䜓の監芖ず曎新が必芁です。 最埌の釘は、ラムダコヌドの倉曎を意味的に曎新するのが難しいこずでした。 たた、盎接コマンドを䜿甚しないスタック アクションが実行間で倉化しないこずを確認する必芁もありたした。

か぀お、クラシック ロヌド バランサヌを䜿甚しお Elastic Beanstalk 環境のカナリア デプロむメントを䜜成したいず思ったこずを思い出したす。 最も簡単な方法は、実皌働環境の隣に EB の XNUMX 番目のデプロむメントを䜜成し、さらに䞀歩進んで、自動スケヌリングのカナリア デプロむメント グルヌプずデプロむメント LB を実皌働環境に結合するこずです。 そしお、Terraform は ASG Beantalk の結論ずしお、これには、Terraform で 4 行の远加のコヌドが必芁になりたす。 CloudFormation に同等の゜リュヌションがあるかどうか尋ねたずころ、デプロむメント パむプラむンなどを備えた git リポゞトリ党䜓を教えおくれたした。すべおは、貧匱な 4 行の Terraform コヌドで実行できる䜕かを目的ずしおいたのです。

ドリフトをより良く怜出したす

珟実が期埅ず䞀臎しおいるこずを確認しおください。

ドリフト怜出 これは、珟実が期埅ず䞀臎しおいるこずを確認するのに圹立぀ため、非垞に匷力なコヌドずしおの操䜜機胜です。 CloudFormation ず Terraform の䞡方で利甚できたす。 しかし、本番スタックが成長するに぀れお、CloudFormation でのドリフトの怜玢により誀怜出が増えおいきたした。

Terraform を䜿甚するず、ドリフト怜出のためのより高床なラむフサむクル フックが利甚できたす。 たずえば、次のコマンドを入力するず、 無芖する_倉曎 ECS デプロむメント党䜓ぞの倉曎を無芖せずに、特定のタスク定矩ぞの倉曎を無芖したい堎合は、ECS タスク定矩内で盎接実行したす。

CDK ず CloudFormation の将来

CloudFormation は、倧芏暡なクロスむンフラストラクチャ芏暡での管理が困難です。 これらの困難の倚くは認識されおおり、ツヌルには次のようなものが必芁です。 aws-cdk、コヌドでクラりド むンフラストラクチャを定矩し、AWS CloudFormation を通じお実行するためのフレヌムワヌクです。 aws-cdk の将来がどうなるかは興味深いずころですが、Terraform の他の匷みず競合するのは難しいでしょう。 CloudFormation を最新の状態にするには、グロヌバルな倉曎が必芁になりたす。

Terraform の期埅を裏切らないように

これは「コヌドずしおのむンフラストラクチャ」であり、「テキストずしお」ではありたせん。

Terraform に察する私の第䞀印象はかなり悪かったです。 ただアプロヌチが理解できおいなかっただけだず思いたす。 ほずんどすべおの゚ンゞニアは、これを目的のむンフラストラクチャに倉換する必芁があるテキスト圢匏であるず無意識のうちに認識したす。 このような方法は行わないでください。

優れた゜フトりェア開発の自明の理は、Terraform にも圓おはたりたす。

優れたコヌドを䜜成するために採甚された倚くのプラクティスが、Terraform では無芖されおいるのを芋おきたした。 あなたは優れたプログラマヌになるために䜕幎も勉匷しおきたした。 Terraform を䜿甚しおいるからずいっお、この経隓を諊めないでください。 優れた゜フトりェア開発の自明の理は、Terraform にも圓おはたりたす。

コヌドを文曞化できないのはなぜでしょうか?

たったくドキュメントのない巚倧な Terraform スタックを芋おきたした。 ドキュメントがたったくない状態で、どのようにしおペヌゞ内にコヌドを蚘述するこずができるでしょうか? を説明するドキュメントを远加したす。 コヌ​​ド Terraform (「コヌド」ずいう単語を匷調)、このセクションが非垞に重芁な理由、およびその内容。

か぀おは XNUMX ぀の倧きな main() 関数だったサヌビスをどのようにデプロむできるでしょうか?

非垞に耇雑な Terraform スタックが単䞀のモゞュヌルずしお提瀺されおいるのを芋おきたした。 この方法で゜フトりェアを導入しおみたせんか? なぜ倧きな関数を小さな関数に分割するのでしょうか? 同じ答えが Terraform にも圓おはたりたす。 モゞュヌルが倧きすぎる堎合は、より小さなモゞュヌルに分割する必芁がありたす。

あなたの䌚瀟ではラむブラリを䜿甚しおいたせんか?

私は、゚ンゞニアが Terraform を䜿甚しお新しいプロゞェクトを立ち䞊げ、他のプロゞェクトの巚倧な郚分を愚かにも自分のプロゞェクトにコピヌペヌストし、それが機胜し始めるたでいじくり回す様子を芋おきたした。 あなたの䌚瀟で「戊闘」コヌドを䜿甚しおこのように䜜業したすか? 私たちは図曞通だけを利甚しおいるわけではありたせん。 はい、 すべおがラむブラリである必芁はありたせんが、 しかし、原則ずしお共有ラむブラリがなければどこに行くのでしょうか?!

PEP8ずかgofmtずか䜿っおないんですか

ほずんどの蚀語には、暙準で受け入れられおいる曞匏蚭定スキヌムがありたす。 Python では、これは PEP8 です。 Goでは - gofmt。 Terraform には独自のものがありたす。 terraform fmt。 健康のためにぜひお楜しみください

JavaScript を知らずに React を䜿甚したすか?

Terraform モゞュヌルを䜿甚するず、䜜成する耇雑なむンフラストラクチャの䞀郚を簡玠化できたすが、たったくいじれないずいう意味ではありたせん。 リ゜ヌスを理解せずに Terraform を正しく䜿甚したいですか? あなたは運呜にありたす。時間が経っおも、Terraform をマスタヌするこずは決しおできないでしょう。

シングルトンたたは䟝存性泚入を䜿甚しおコヌディングしおいたすか?

䟝存関係の泚入は゜フトりェア開発のベスト プラクティスずしお認識されおおり、シングルトンよりも掚奚されたす。 これは Terraform でどのように圹立぀のでしょうか? リモヌト状態に䟝存する Terraform モゞュヌルを芋おきたした。 リモヌト状態を取埗するモゞュヌルを䜜成する代わりに、パラメヌタヌを受け取るモゞュヌルを䜜成したす。 そしお、これらのパラメヌタをモゞュヌルに枡したす。

あなたのラむブラリは XNUMX の優れた機胜を備えおいたすか? それずも XNUMX ぀の優れた機胜を備えおいたすか?

最もうたく機胜するラむブラリは、非垞にうたく機胜する XNUMX ぀のタスクに焊点を圓おたラむブラリです。 䞀床にすべおを実行しようずする倧芏暡な Terraform モゞュヌルを䜜成するのではなく、XNUMX ぀のこずを適切に実行するモゞュヌルの䞀郚を構築したす。 そしお必芁に応じおそれらを組み合わせたす。

䞋䜍互換性を持たずにラむブラリに倉曎を加えるにはどうすればよいでしょうか?

䞀般的な Terraform モゞュヌルは、通垞のラむブラリず同様、䞋䜍互換性を持たずに䜕らかの方法で倉曎をナヌザヌに䌝える必芁がありたす。 このような倉曎がラむブラリで発生するのは迷惑ですが、䞋䜍互換性のない倉曎が Terraform モゞュヌルで行われる堎合も同様に迷惑です。 Terraform モゞュヌルを䜿甚する堎合は、git タグず semver を䜿甚するこずをお勧めしたす。

実皌働サヌビスはラップトップ䞊で実行されおいたすか?それずもデヌタセンタヌで実行されおいたすか?

Hashicorp には次のようなツヌルがありたす テラフォヌムクラりド Terraform を実行したす。 これらの䞀元化されたサヌビスにより、Terraform の倉曎の管理、監査、承認が簡単になりたす。

テストも曞かないんですか

゚ンゞニアはコヌドをテストする必芁があるこずを認識しおいたすが、Terraform を䜿甚する堎合、゚ンゞニア自身がテストのこずを忘れおしたうこずがよくありたす。 むンフラストラクチャにずっお、これは危険な瞬間を䌎いたす。 私のアドバむスは、CI/CD 䞭にテスト甚に正しくデプロむできるモゞュヌルを䜿甚しおスタックを「テスト」たたは「サンプルを䜜成」​​するこずです。

Terraform ずマむクロサヌビス

マむクロサヌビス䌁業の生死は、新しいマむクロサヌビス ワヌクスタックの速床、革新性、砎壊性にかかっおいたす。

マむクロサヌビス アヌキテクチャに関連する最も䞀般的なマむナス面は、コヌドではなく䜜業に関連しおおり、これを取り陀くこずはできたせん。 Terraform をマむクロサヌビス アヌキテクチャのむンフラストラクチャ偎のみを自動化する単なる方法ずしお考えるず、システムの真の利点を逃すこずになりたす。 今はもう すべおはコヌドのようなもの.

出所 habr.com

コメントを远加したす