يمثل تقديم البنية التحتية كرمز بتنسيق نصي قابل للتكرار أفضل ممارسة بسيطة للأنظمة التي لا تحتاج إلى حملها. هذه الممارسة لها اسم - البنية التحتية كرمز ، وحتى الآن هناك أداتان رائعتان لتنفيذهما ، خاصة في AWS: Terraform و CloudFormation .

مقارنة تجربة مع Terraform و CloudFormation
قبل الانضمام إلى Twitch (المعروف أيضًا باسم Amazon Jr. ) ، عملت في شركة واحدة وبدأت استخدام Terraform لمدة ثلاث سنوات. في مكان جديد ، استخدمت أيضًا Terraform مع القوة والرئيسية ، ثم دفعت الشركة عملية الانتقال إلى كل شيء على غرار Amazon ، بما في ذلك CloudFormation. عملت بجد لتطوير أفضل الممارسات لكليهما ، واستخدمت كلتا الأداتين في سير العمل المعقدة للغاية في جميع أنحاء المنظمة. في وقت لاحق ، عندما كنت أقوم بتقييم عواقب الانتقال من Terraform إلى CloudFormation ، أصبحت مقتنعًا أن Terraform ربما تكون الخيار الأفضل للمؤسسة.
بيتا البرمجيات
لم يصدر Terraform حتى الإصدار 1.0 ، وهذا سبب وجيه لعدم استخدامه. منذ أن اختبرت ذلك بنفسي لأول مرة ، فقد تغير كثيرًا ، ولكن بعد ذلك ، غالبًا ما تم قطع terraform apply
بعد عدة تحديثات أو بعد بضع سنوات من التشغيل. أود أن أقول "الآن كل شيء مختلف" ، لكن ... لذلك يبدو أن الجميع يقول لا؟ هناك تغييرات لا تتوافق مع الإصدارات السابقة ، على الرغم من أنها مناسبة ، وحتى الشعور هو أن بناء الجملة وتجريد تخزين الموارد هي الآن ما تحتاجه. بدا أن الأداة أفضل ، لكن ...: -0
AWS ، من ناحية أخرى ، قام بعمل جيد في الحفاظ على التوافق مع الإصدارات السابقة. كل ذلك ، على الأرجح ، نظرًا لأن خدماتهم يتم اختبارها جيدًا داخل المؤسسة ، ثم يتم إعادة تسميتها ونشرها. لذلك "حاول بجد" لا يزال يقال ضعيف. الحفاظ على التوافق مع الإصدارات السابقة من API لمثل هذا النظام متعدد المتغيرات ومعقدة مثل AWS أمر صعب للغاية. يجب على أي شخص اضطر إلى دعم واجهات برمجة التطبيقات المتاحة للعموم والتي يتم استخدامها على نطاق واسع أن يفهم مدى صعوبة الأمر لسنوات عديدة. لكن سلوك CloudFormation في ذاكرتي لم يتغير على مر السنين.
تعرف على الساق ... إنها رصاصة
حسب علمي ، لا يمكن إزالة مورد مكدس CloudFormation تابع لجهة خارجية من مكدس CF. الوضع مشابه مع Terraform. يسمح لك باستيراد الموارد الحالية إلى مجموعتك. يمكن القول أن الوظيفة رائعة ، ولكن مع القوة العظمى تأتي مسؤولية كبيرة. يتعين على المرء فقط وضع المورد على المكدس ، وأثناء العمل مع مكدسك ، لا يمكنك حذف أو تغيير هذا المورد. بمجرد حدوثها. بطريقة ما ، على موقع Twitch ، قام شخص ما ، دون التآمر على أي شيء خاطئ ، باستيراد مجموعة أمان AWS بطريق الخطأ في مكدس Terraform الخاص به. لقد دخلت العديد من الأوامر و ... مجموعة الأمان (جنبا إلى جنب مع حركة المرور الواردة) اختفت.
الانتعاش الجزئي
في بعض الأحيان لا يمكن لـ CloudFormation الانتقال من حالة إلى أخرى بشكل كامل. في الوقت نفسه ، سيحاول العودة إلى السابق. آسف ، هذا ليس دائما ممكنا. بعد ذلك ، يعد تصحيح ما حدث مخيفًا - فأنت لا تعرف أبدًا ما إذا كان CloudFormation سيكون سعيدًا لأنه متصدع - حتى للإصلاح. لكن هل سينجح أو لا يعود إلى الحالة السابقة ، فهو في الحقيقة لا يعرف كيفية تحديدها ، وهو معلقًا افتراضيًا لساعات في انتظار حدوث معجزة.
على العكس من ذلك ، تميل Terraform إلى التعافي من التحولات غير الناجحة بشكل أكثر أناقة وتوفر أدوات تصحيح أخطاء متقدمة.
تغييرات أوضح في حالة المستند
"حسناً ، موازن التحميل ، أنت تتغيّر. لكن كيف؟"
- مهندس قلق على استعداد للضغط على زر قبول.
أحتاج في بعض الأحيان إلى القيام ببعض المعالجات باستخدام موازن التحميل في مكدس CloudFormation - على سبيل المثال ، قم بإضافة رقم منفذ أو تغيير مجموعة أمان. تغييرات CloudFormation عرض ضعيفة. أنا ، كما هو الحال في المسامير والإبر ، أتحقق من ملف yaml من عشر مرات للتأكد من أنني لم أقم بمسح أي شيء أحتاج إليه ، ولم أقم بإضافة الكثير.
Terraform هو أكثر شفافية في هذا الصدد. في بعض الأحيان يكون شفافًا جدًا (اقرأ: يحصل عليه). لحسن الحظ ، تضمن الإصدار الأخير عرضًا محسنًا للتغييرات - الآن يمكنك أن ترى بوضوح ما الذي يتغير.
مرونة
اكتب البرنامج من العكس.
بعبارة صريحة ، فإن أهم ميزة مميزة للبرامج طويلة العمر هي قدرتها على التكيف مع التغيير. اكتب أي برنامج من العكس. غالبًا ما اخترقت أنني أخذت خدمة "بسيطة" ، ثم بدأت في دفع كل شيء إلى مكدس CloudFormation أو Terraform واحد. وبطبيعة الحال ، بعد أشهر كشفت أنني فهمت كل شيء خاطئ ، والخدمة ليست في الواقع بسيطة! ولذا فإنني بحاجة إلى كسر مكدس كبير بطريقة ما إلى مكونات صغيرة. عند العمل مع CloudFormation ، من الممكن القيام بذلك فقط عن طريق إعادة إنشاء الرصة الحالية أولاً ، لكنني لا أفعل ذلك مع قواعد البيانات الخاصة بي. من ناحية أخرى ، سمحت لك Terraform بتشريح المكدس وتقسيمه إلى أجزاء أصغر يمكن فهمها.
وحدات في بوابة
تعد مشاركة رمز Terraform عبر عدة مكدسات أسهل بكثير من مشاركة كود CloudFormation. باستخدام Terraform ، يمكنك وضع الكود في مستودع git والوصول إليه باستخدام التحكم في الإصدار الدلالي. يمكن لأي شخص لديه حق الوصول إلى هذا المستودع إعادة استخدام الرمز المشترك. مكافئ CloudFormation هو S3 ، لكن ليس لديه نفس المزايا ، وليس هناك سبب واحد يجعلنا نتخلى تمامًا عن git لصالح S3.
نمت المنظمة والقدرة على مشاركة مداخن مشتركة وصلت إلى مستوى حرج. مع Terraform ، كل هذا سهل وطبيعي ، في حين ستجعلك CloudFormation تقفز عبر الحلقات قبل أن تحصل على شيء مشابه.
العمليات كرمز
"دعنا نصح حسنا".
- مهندس قبل 3 سنوات من اختراع دراجة Terraform.
عندما يتعلق الأمر بتطوير البرامج ، فإن Go أو برنامج Java ليس مجرد رمز.

كود كود
بعد كل شيء ، لا يزال هناك البنية التحتية التي تعمل عليها.

البنية التحتية كرمز
لكن من أين هي؟ كيفية مراقبته؟ أين يقيم الكود الخاص بك؟ هل يحتاج المطورون إلى إذن للوصول؟

العمليات كرمز
كونك مطور برامج لا يعني فقط كتابة التعليمات البرمجية.
ليس AWS One: يجب أن تستخدم موفري خدمات آخرين. SignalFx أو PagerDuty أو Github. ربما لديك خادم Jenkins داخلي لـ CI / CD أو لوحة تحكم Grafana داخلية للمراقبة. تم اختيار Infra as Code لأسباب مختلفة ، وأي منها مهم بنفس القدر لكل ما يتعلق بالبرنامج.
عندما كنت أعمل في Twitch ، قمنا بتسريع الخدمات داخل أنظمة Amazon المدمجة المدمجة وأنظمة AWS. قمنا بختم ودعم العديد من الخدمات المصغرة ، مما زاد من تكاليف التشغيل. تم إجراء المناقشات في السياق التالي تقريبًا:
- أنا : لعنة ، الكثير من الإيماءات لتفريق microservice واحد. سيتعين علي استخدام هذه البيانات المهملة لإنشاء حساب AWS (ذهبنا إلى حسابين لخدمات microservice ) ، ثم هذا لإعداد الإشعارات ، هذا لمستودع الشفرات ، وهذا لقائمة عناوين البريد الإلكتروني ، وهذا واحد .. .
- الرصاص : دعنا نصح بخير.
- أنا : الحنق ، لكن السيناريو نفسه سيتغير. ستحتاج إلى طريقة للتحقق من أن جميع أدوات الأمازون المدمجة هذه محدّثة.
- الرصاص : تبدو جيدة. ولهذا سنقوم بكتابة السيناريو.
- أنا : عظيم! وربما لا يزال البرنامج النصي بحاجة إلى تعيين المعلمات. هل سيقبلهم؟
- يؤدي : نعم ، سوف ، أين سيذهب!
- أنا : قد تتغير العملية ، سيتم فقد التوافق مع الإصدارات السابقة. سوف يستغرق بعض التحكم في النسخة الدلالية.
- الرصاص : فكرة عظيمة!
- أنا : يمكن تغيير الأدوات يدويًا ، داخل واجهة المستخدم. نحن بحاجة إلى طريقة للتحقق من هذا وإصلاحه.
... بعد 3 سنوات:
- الرصاص : وحصلنا على terraform.
تتمثل مغزى الخرافة في ذلك: حتى إذا كنت تتدرب على الكعب في جميع الأمازون ، فلا تزال تستخدم شيئًا ليس من AWS ، وهذه الخدمات بها حالة تستخدمها اللغة للتهيئة من أجل مزامنة هذه الحالة.
lambda هو الحل CloudFormation للقضية منطق مخصص. باستخدام lambda ، يمكنك إنشاء وحدات ماكرو أو مورد مخصص . يقدم هذا النهج صعوبات إضافية لا تملكها Terraform في التحكم في الإصدار الدلالي لوحدات git. بالنسبة لي ، كانت المشكلة الأكثر إلحاحًا هي إدارة أذونات جميع هذه lambda المخصصة (وهي العشرات من حسابات AWS). كان هناك مشكلة أخرى ذات أهمية مثل "ما حدث من قبل - دجاجة أم بيضة؟": كان مرتبطًا برمز لامدا. هذه الوظيفة في حد ذاتها هي البنية الأساسية والرمز ، وهي بحاجة إلى المراقبة والتحديثات. كان أبرز ما حدث في التابوت صعوبة تحديث تغييرات رمز lambda بشكل دلالي ؛ كان من الضروري أيضًا التأكد من أن تصرفات المكدس بدون أمر مباشر لا تتغير بين البداية.
أتذكر بطريقة ما أنني كنت أرغب في إنشاء نشر كناري لبيئة Beanstalk المرنة مع موازن تحميل كلاسيكي. تتمثل أسهل طريقة في إجراء عملية نشر ثانية لـ EB بجانب بيئة الإنتاج ، مع اتخاذ خطوة أخرى: من خلال دمج مجموعة نشر الكناري القابلة للتطوير تلقائيًا مع نشر LB في بيئة الإنتاج. ونظرًا لأن Terraform يستخدم AST beantalk كإخراج ، سيتطلب 4 أسطر إضافية من التعليمات البرمجية في Terraform. عندما سألت عما إذا كان هناك حل مشابه في CloudFormation ، أشاروا لي إلى مستودع كامل في بوابة خط أنابيب النشر وأكثر من ذلك: كل هذا من أجل ما يمكن أن تفعله 4 أسطر من شفرة Terraform المؤسفة.
انه يكتشف أفضل الانجراف
تأكد من حقيقة تلبي التوقعات.
يعد اكتشاف Drift عملية قوية جدًا كرمز ، لأنه يساعد على التأكد من أن الواقع يفي بالتوقعات. وهي متوفرة مع كل من CloudFormation و Terraform. ولكن مع نمو رصة العمل ، عاد بحث CloudFormation العائد بإيجابيات كاذبة أكثر فأكثر.
مع Terraform ، لديك خطاطيف لدورة حياة أكثر تطوراً لاكتشاف الانجراف. على سبيل المثال ، يمكنك إدخال الأمر ignore_changes مباشرةً في تعريف مهمة ECS إذا كنت تريد تجاهل التغييرات في تعريف مهمة معينة دون تجاهل التغييرات في نشر ECS بالكامل.
من الصعب إدارة CloudFormation على نطاق واسع عبر البنية التحتية. يتم التعرف على العديد من هذه الصعوبات ، وتحتاج الأداة إلى أشياء مثل aws-cdk ، وهي إطار لتحديد البنية التحتية السحابية في التعليمات البرمجية وتمريرها عبر AWS CloudFormation. سيكون لديه فضول لمعرفة ما سيكون لدى aws-cdk في المستقبل ، ولكن سيكون من الصعب عليه التنافس مع المزايا الأخرى لـ Terraform ؛ لتشديد CloudFormation ، سوف تكون هناك حاجة التغييرات العالمية.
هذه هي "البنية الأساسية ككود" ، وليس "كنص".
إنطباعي الأول عن Terraform كان سيئًا للغاية. أعتقد أنني فقط لم أفهم النهج. ينظر جميع المهندسين تقريبًا في البداية إلى أنه لا إرادي كتنسيق نصي يجب تحويله إلى البنية الأساسية المطلوبة. لا كذلك.
لقد رأيت عدد الممارسات المتبعة لإنشاء رمز جيد يتم تجاهله في Terraform. لقد درست لسنوات لتصبح مبرمج جيد. لا تتخلى عن هذه التجربة لمجرد أنك تعمل مع Terraform. تنطبق الحقائق الشائعة لتطوير البرامج الجيدة أيضًا على Terraform.
كيف لا يمكن توثيق الكود؟
جئت عبر مداخن Terraform ضخمة مع عدم وجود وثائق على الإطلاق. كيف يمكنني كتابة الشفرة في الصفحات - بدون أي وثائق؟ أضف الوثائق التي تشرح كود Terraform الخاص بك (التأكيد هنا على كلمة "code") ، ولماذا هذا القسم مهم للغاية ، وماذا تفعل.
كيف يمكنك نشر الخدمات التي كانت ذات يوم وظيفة رئيسية واحدة () كبيرة؟
التقيت مداخن Terraform معقدة للغاية ، قدمت كوحدة واحدة. لماذا لا ننشر برامج مثل هذا؟ لماذا تقسيم الوظائف الكبيرة إلى وظائف أصغر؟ تنطبق نفس الإجابات على Terraform. إذا كانت الوحدة النمطية الخاصة بك كبيرة جدًا ، فأنت بحاجة إلى تقسيمها إلى وحدات أصغر.
لا تستخدم شركتك المكتبات؟
لقد رأيت كيف يقوم المهندسون ، الذين يقومون بإنتاج مشروع جديد باستخدام Terraform ، بنسخ نسخ ضخمة من الغباء من مشاريع أخرى إلى مشاريعهم الخاصة ، ثم اختيارهم حتى يبدأ العمل. هل تعمل في شركتك مع رمز "القتال"؟ نحن لا نستخدم المكتبات فقط. نعم ، ليس كل شيء يجب أن يكون مكتبة ، لكن أين نحن بدون مكتبات مشتركة من حيث المبدأ؟!
لا تستخدم PEP8 أو gofmt؟
معظم اللغات لديها مخطط تنسيق قياسي مقبول. في بيثون ، هذا هو PEP8. في الذهاب - الحكومة. Terraform لها قناعاتها: terraform fmt
. استخدام للصحة!
هل ستستخدم React دون معرفة JavaScript؟
تستطيع وحدات Terraform تبسيط جزء من البنية التحتية المعقدة التي تقوم بإنشائها ، لكن هذا لا يعني أنه يمكنك تخطيها على الإطلاق. هل تريد استخدام Terraform بشكل صحيح دون فهم الموارد؟ أنت محكوم: سيذهب الوقت ، لكنك لن تتقن Terraform.
هل رمز مفرد ، أو إدخال التبعيات؟
حقن التبعية هو أفضل ممارسة معترف بها لتطوير البرمجيات ، والتي يفضلها النغمات المفردة. كيف يكون هذا مفيداً في Terraform؟ قابلت وحدات Terraform اعتمادًا على حالة بعيدة. بدلاً من كتابة الوحدات النمطية التي تستخرج من حالة بعيدة ، اكتب وحدة نمطية تقبل المعلمات. ثم قم بتمرير هذه المعلمات إلى الوحدة النمطية.
هل تقوم مكتباتك بعشرة أشياء بشكل جيد ، أو شيء واحد رائع؟
تعمل المكتبات التي تركز على مهمة واحدة تعمل بشكل جيد على أفضل نحو. بدلاً من كتابة وحدات Terraform كبيرة تحاول القيام بكل شيء دفعة واحدة ، اجعل أجزاء منها تعمل شيئًا جيدًا. ثم ادمجهم بالطريقة التي تريدها.
كيف يمكنك إجراء تغييرات على المكتبات دون التوافق مع الإصدارات السابقة؟
تحتاج الوحدة النمطية Terraform العامة ، مثل المكتبة العادية ، إلى إعلام المستخدمين بطريقة ما بالتغييرات دون التوافق مع الإصدارات السابقة. عندما تحدث مثل هذه التغييرات في المكتبات ، تكون مزعجة ، ومثلما تكون مزعجة عند إجراء تغييرات دون التوافق مع الإصدارات السابقة في وحدات Terraform. يوصى باستخدام علامات git و semver عند استخدام وحدات Terraform.
هل تم إطلاق خدمة الإنتاج على الكمبيوتر المحمول أو في مركز البيانات؟
لدى Hashicorp أدوات مثل سحابة terraform لإطلاق terraform. تعمل هذه الخدمات المركزية على تسهيل الإدارة والتدقيق والموافقة على تغييرات terraform.
لا تكتب الاختبارات؟
يعترف المهندسون بأنه يجب اختبار الرمز ، لكنهم في كثير من الأحيان يدققون في الفحص عند العمل مع Terraform. للبنية التحتية ، هذا محفوف بلحظات خبيثة. أنصحك بـ "اختبار" أو "إنشاء أمثلة" للمكدس باستخدام الوحدات النمطية التي يمكن نشرها بشكل صحيح للتحقق خلال CI / CD.
تعتمد حياة شركات microservice وموتها على سرعة وتحديث وتدمير مداخن عمل خدمات microservice الجديدة.
النقطة السلبية الأكثر شيوعًا المتعلقة ببنى الخدمات المصغرة والتي لا يمكن التخلص منها بأي شكل من الأشكال مرتبطة بالعمل ، وليس بالكود. إذا كنت تأخذ Terraform ، فقط كوسيلة لأتمتة جانب البنية التحتية فقط من بنية الخدمة الصغيرة ، فإنك بذلك تحرم نفسك من المزايا الحقيقية لهذا النظام. الآن كل شيء يشبه الكود .