پلومی کے ساتھ کوڈ کے طور پر انفراسٹرکچر کی جانچ کرنا۔ حصہ 1

شب بخیر دوستوں۔ شرح پر ایک نئے بہاؤ کے آغاز کی توقع میں "DevOps طریقوں اور اوزار" ہم آپ کے ساتھ ایک نیا ترجمہ شیئر کر رہے ہیں۔ جاؤ.

پلومی کے ساتھ کوڈ کے طور پر انفراسٹرکچر کی جانچ کرنا۔ حصہ 1

انفراسٹرکچر کوڈ (انفراسٹرکچر بطور کوڈ) کے لیے پلومی اور عام مقصد کی پروگرامنگ زبانوں کا استعمال بہت سے فوائد فراہم کرتا ہے: مہارت اور علم کی دستیابی، تجرید کے ذریعے کوڈ میں بوائلر پلیٹ کا خاتمہ، آپ کی ٹیم سے واقف ٹولز، جیسے IDEs اور linters۔ یہ تمام سافٹ ویئر انجینئرنگ ٹولز نہ صرف ہمیں زیادہ پیداواری بناتے ہیں بلکہ ہمارے کوڈ کے معیار کو بھی بہتر بناتے ہیں۔ لہذا، یہ فطری ہے کہ عام مقصد کی پروگرامنگ زبانوں کا استعمال ہمیں ایک اور اہم سافٹ ویئر ڈویلپمنٹ پریکٹس متعارف کرانے کی اجازت دیتا ہے۔ جانچ.

اس مضمون میں، ہم دیکھیں گے کہ کس طرح پلومی ہمارے بنیادی ڈھانچے کو کوڈ کے طور پر جانچنے میں ہماری مدد کرتا ہے۔

پلومی کے ساتھ کوڈ کے طور پر انفراسٹرکچر کی جانچ کرنا۔ حصہ 1

بنیادی ڈھانچے کی جانچ کیوں؟

تفصیل میں جانے سے پہلے، یہ سوال پوچھنے کے قابل ہے: "انفراسٹرکچر کی جانچ کیوں؟" اس کی بہت سی وجوہات ہیں اور ان میں سے چند یہ ہیں:

  • آپ کے پروگرام کی منطق کے انفرادی افعال یا ٹکڑوں کی یونٹ ٹیسٹنگ
  • بعض رکاوٹوں کے خلاف بنیادی ڈھانچے کی مطلوبہ حالت کی تصدیق کرتا ہے۔
  • عام غلطیوں کا پتہ لگانا، جیسے اسٹوریج بالٹی کی خفیہ کاری کی کمی یا غیر محفوظ، انٹرنیٹ سے ورچوئل مشینوں تک کھلی رسائی۔
  • بنیادی ڈھانچے کی فراہمی کے نفاذ کی جانچ کرنا۔
  • پروویژننگ کے بعد فعالیت کو چیک کرنے کے لیے آپ کے "پروگرام شدہ" انفراسٹرکچر کے اندر چلنے والی ایپلیکیشن لاجک کی رن ٹائم ٹیسٹنگ کرنا۔
  • جیسا کہ ہم دیکھ سکتے ہیں، بنیادی ڈھانچے کی جانچ کے اختیارات کی ایک وسیع رینج موجود ہے۔ پولومی کے پاس اس سپیکٹرم کے ہر مقام پر جانچ کے لیے میکانزم موجود ہیں۔ آئیے شروع کریں اور دیکھیں کہ یہ کیسے کام کرتا ہے۔

یونٹ ٹیسٹنگ

پلومی پروگرام عام مقصد کی پروگرامنگ زبانوں میں لکھے جاتے ہیں جیسے JavaScript، Python، TypeScript یا Go۔ اس لیے ان زبانوں کی مکمل طاقت، بشمول ان کے آلات اور لائبریریوں، بشمول ٹیسٹ فریم ورک، ان کے لیے دستیاب ہے۔ پلومی ملٹی کلاؤڈ ہے، جس کا مطلب ہے کہ اسے کسی بھی کلاؤڈ فراہم کنندہ سے جانچ کے لیے استعمال کیا جا سکتا ہے۔

(اس مضمون میں کثیر لسانی اور ملٹی کلاؤڈ ہونے کے باوجود، ہم جاوا اسکرپٹ اور موچا استعمال کرتے ہیں اور AWS پر فوکس کرتے ہیں۔ آپ Python استعمال کر سکتے ہیں۔ unittest، ٹیسٹ فریم ورک پر جائیں، یا کوئی اور ٹیسٹ فریم ورک جو آپ پسند کرتے ہیں۔ اور، یقیناً، پلومی Azure، Google Cloud، Kubernetes کے ساتھ بہت اچھا کام کرتا ہے۔)

جیسا کہ ہم نے دیکھا ہے، کئی وجوہات ہیں جن کی وجہ سے آپ اپنے انفراسٹرکچر کوڈ کو جانچنا چاہتے ہیں۔ ان میں سے ایک روایتی یونٹ ٹیسٹنگ ہے۔ کیونکہ آپ کے کوڈ میں فنکشنز ہوسکتے ہیں - مثال کے طور پر، CIDR کا حساب لگانا، متحرک طور پر ناموں، ٹیگز وغیرہ کا حساب لگانا۔ - آپ شاید ان کی جانچ کرنا چاہیں گے۔ یہ آپ کی پسندیدہ پروگرامنگ زبان میں ایپلی کیشنز کے لیے باقاعدہ یونٹ ٹیسٹ لکھنے کے مترادف ہے۔
تھوڑا زیادہ پیچیدہ ہونے کے لیے، آپ چیک کر سکتے ہیں کہ آپ کا پروگرام وسائل کیسے مختص کرتا ہے۔ مثال کے طور پر، آئیے تصور کریں کہ ہمیں ایک سادہ EC2 سرور بنانے کی ضرورت ہے اور ہم درج ذیل چیزوں کا یقین کرنا چاہتے ہیں:

  • مثالوں میں ایک ٹیگ ہوتا ہے۔ Name.
  • مثالوں کو ان لائن اسکرپٹ کا استعمال نہیں کرنا چاہئے۔ userData - ہمیں ایک AMI (تصویر) استعمال کرنا چاہیے۔
  • انٹرنیٹ کے سامنے کوئی SSH نہیں ہونا چاہیے۔

یہ مثال پر مبنی ہے۔ میری مثال aws-js-webserver:

index.js:

"use strict";
 
let aws = require("@pulumi/aws");
 
let group = new aws.ec2.SecurityGroup("web-secgrp", {
    ingress: [
        { protocol: "tcp", fromPort: 22, toPort: 22, cidrBlocks: ["0.0.0.0/0"] },
        { protocol: "tcp", fromPort: 80, toPort: 80, cidrBlocks: ["0.0.0.0/0"] },
    ],
});
 
let userData =
`#!/bin/bash
echo "Hello, World!" > index.html
nohup python -m SimpleHTTPServer 80 &`;
 
let server = new aws.ec2.Instance("web-server-www", {
    instanceType: "t2.micro",
    securityGroups: [ group.name ], // reference the group object above
    ami: "ami-c55673a0"             // AMI for us-east-2 (Ohio),
    userData: userData              // start a simple web server
});
 
exports.group = group;
exports.server = server;
exports.publicIp = server.publicIp;
exports.publicHostName = server.publicDns;

یہ پلومی کا بنیادی پروگرام ہے: یہ صرف ایک EC2 سیکیورٹی گروپ اور ایک مثال مختص کرتا ہے۔ تاہم، یہ واضح رہے کہ یہاں ہم اوپر بیان کردہ تینوں اصولوں کو توڑ رہے ہیں۔ آئیے ٹیسٹ لکھتے ہیں!

تحریری ٹیسٹ

ہمارے ٹیسٹوں کا عمومی ڈھانچہ باقاعدہ موچا ٹیسٹ کی طرح نظر آئے گا:

ec2tests.js

test.js:
let assert = require("assert");
let mocha = require("mocha");
let pulumi = require("@pulumi/pulumi");
let infra = require("./index");
 
describe("Infrastructure", function() {
    let server = infra.server;
    describe("#server", function() {
        // TODO(check 1): Должен быть тэг Name.
        // TODO(check 2): Не должно быть inline-скрипта userData.
    });
    let group = infra.group;
    describe("#group", function() {
        // TODO(check 3): Не должно быть SSH, открытого в Интернет.
    });
});

اب ہم اپنا پہلا ٹیسٹ لکھتے ہیں: یقینی بنائیں کہ مثالوں میں ٹیگ ہے۔ Name. اسے چیک کرنے کے لیے ہم صرف EC2 مثال آبجیکٹ حاصل کرتے ہیں اور متعلقہ پراپرٹی کو چیک کرتے ہیں۔ tags:

 // check 1: Должен быть тэг Name.
        it("must have a name tag", function(done) {
            pulumi.all([server.urn, server.tags]).apply(([urn, tags]) => {
                if (!tags || !tags["Name"]) {
                    done(new Error(`Missing a name tag on server ${urn}`));
                } else {
                    done();
                }
            });
        });

یہ ایک باقاعدہ ٹیسٹ کی طرح لگتا ہے، لیکن قابل توجہ چند خصوصیات کے ساتھ:

  • چونکہ ہم تعیناتی سے پہلے وسائل کی حالت کے بارے میں استفسار کرتے ہیں، اس لیے ہمارے ٹیسٹ ہمیشہ "پلان" (یا "پیش نظارہ") موڈ میں چلائے جاتے ہیں۔ اس طرح، بہت ساری خصوصیات ہیں جن کی قدروں کو صرف بازیافت نہیں کیا جائے گا یا ان کی وضاحت نہیں کی جائے گی۔ اس میں آپ کے کلاؤڈ فراہم کنندہ کے ذریعہ شمار کردہ تمام آؤٹ پٹ خصوصیات شامل ہیں۔ یہ ہمارے ٹیسٹوں کے لیے عام ہے - ہم صرف ان پٹ ڈیٹا کو چیک کرتے ہیں۔ ہم اس مسئلے پر بعد میں واپس جائیں گے، جب بات انضمام کے ٹیسٹ کی ہو گی۔
  • چونکہ پلومی کے تمام وسائل کی خصوصیات آؤٹ پٹ ہیں، اور ان میں سے بہت سے غیر مطابقت پذیر طریقے سے جانچے جاتے ہیں، ہمیں اقدار تک رسائی کے لیے اپلائی کا طریقہ استعمال کرنے کی ضرورت ہے۔ یہ وعدوں اور عمل سے بہت ملتا جلتا ہے۔ then .
  • چونکہ ہم ایرر میسج میں ریسورس URN دکھانے کے لیے کئی پراپرٹیز استعمال کر رہے ہیں، ہمیں فنکشن کو استعمال کرنے کی ضرورت ہے۔ pulumi.allان کو یکجا کرنے کے لئے.
  • آخر میں، چونکہ ان اقدار کو متضاد طور پر شمار کیا جاتا ہے، ہمیں Mocha کی بلٹ ان async کال بیک فیچر استعمال کرنے کی ضرورت ہے done یا وعدہ واپس کرنا۔

ایک بار جب ہم سب کچھ سیٹ کر لیں گے، تو ہمیں جاوا اسکرپٹ کی سادہ اقدار کے طور پر ان پٹ تک رسائی حاصل ہو گی۔ جائیداد tags ایک نقشہ ہے (سماجی صف)، لہذا ہم صرف اس بات کو یقینی بنائیں گے کہ یہ (1) غلط نہیں ہے، اور (2) کے لیے ایک کلید موجود ہے Name. یہ بہت آسان ہے اور اب ہم کسی بھی چیز کی جانچ کر سکتے ہیں!

اب ہم اپنا دوسرا چیک لکھتے ہیں۔ یہ اور بھی آسان ہے:

 // check 2: Не должно быть inline-скрипта userData.
        it("must not use userData (use an AMI instead)", function(done) {
            pulumi.all([server.urn, server.userData]).apply(([urn, userData]) => {
                if (userData) {
                    done(new Error(`Illegal use of userData on server ${urn}`));
                } else {
                    done();
                }
            });
        });

اور آخر میں، آئیے تیسرا ٹیسٹ لکھتے ہیں۔ یہ تھوڑا زیادہ پیچیدہ ہوگا کیونکہ ہم سیکیورٹی گروپ سے وابستہ لاگ ان قوانین کی تلاش کر رہے ہیں، جن میں سے بہت سے ہو سکتے ہیں، اور ان اصولوں میں CIDR کی حدود ہیں، جن میں سے بہت سے ہو سکتے ہیں۔ لیکن ہم نے انتظام کیا:

    // check 3: Не должно быть SSH, открытого в Интернет.
        it("must not open port 22 (SSH) to the Internet", function(done) {
            pulumi.all([ group.urn, group.ingress ]).apply(([ urn, ingress ]) => {
                if (ingress.find(rule =>
                        rule.fromPort == 22 && rule.cidrBlocks.find(block =>
                            block === "0.0.0.0/0"))) {
                    done(new Error(`Illegal SSH port 22 open to the Internet (CIDR 0.0.0.0/0) on group ${urn}`));
                } else {
                    done();
                }
            });
        });

بس۔ اب ٹیسٹ چلائیں!

ٹیسٹ چل رہے ہیں۔

زیادہ تر معاملات میں، آپ اپنی پسند کے ٹیسٹ فریم ورک کا استعمال کرتے ہوئے، معمول کے مطابق ٹیسٹ چلا سکتے ہیں۔ لیکن پلومی کی ایک خصوصیت ہے جس پر توجہ دینے کے قابل ہے۔
عام طور پر، پلومی پروگراموں کو چلانے کے لیے، پلمی سی ایل آئی (کمانڈ لائن انٹرفیس) استعمال کیا جاتا ہے، جو زبان کے رن ٹائم کو ترتیب دیتا ہے، پلومی انجن کے آغاز کو کنٹرول کرتا ہے تاکہ وسائل کے ساتھ آپریشنز کو ریکارڈ کیا جا سکے اور پلان وغیرہ میں شامل کیا جا سکے۔ تاہم، ایک مسئلہ ہے. آپ کے ٹیسٹ فریم ورک کے کنٹرول میں چلنے پر، CLI اور Pulumi انجن کے درمیان کوئی رابطہ نہیں ہوگا۔

اس مسئلے کو حل کرنے کے لیے، ہمیں صرف درج ذیل کی وضاحت کرنے کی ضرورت ہے:

  • پروجیکٹ کا نام، جو ماحولیاتی متغیر میں موجود ہے۔ PULUMI_NODEJS_PROJECT (یا، زیادہ عام طور پر، PULUMI__PROJECT для других языков).
    اسٹیک کا نام جو ماحولیاتی متغیر میں بیان کیا گیا ہے۔ PULUMI_NODEJS_STACK (یا، زیادہ عام طور پر، PULUMI__ STACK).
    آپ کے اسٹیک کنفیگریشن متغیرات۔ وہ ماحولیاتی متغیر کا استعمال کرتے ہوئے حاصل کیے جاسکتے ہیں۔ PULUMI_CONFIG اور ان کی شکل کلیدی/قدر کے جوڑوں کے ساتھ JSON نقشہ ہے۔

    پروگرام انتباہات جاری کرے گا جو اس بات کی نشاندہی کرے گا کہ عملدرآمد کے دوران CLI/انجن سے کنکشن دستیاب نہیں ہے۔ یہ اس لیے اہم ہے کہ آپ کا پروگرام درحقیقت کچھ بھی تعینات نہیں کرے گا اور یہ حیران کن ہو سکتا ہے اگر آپ ایسا نہیں کرنا چاہتے ہیں! پلومی کو بتانے کے لیے کہ یہ بالکل وہی ہے جس کی آپ کو ضرورت ہے، آپ انسٹال کر سکتے ہیں۔ PULUMI_TEST_MODE в true.

    تصور کریں کہ ہمیں پروجیکٹ کا نام بتانے کی ضرورت ہے۔ my-ws، اسٹیک کا نام dev، اور AWS علاقہ us-west-2. موچا ٹیسٹ چلانے کی کمانڈ لائن اس طرح نظر آئے گی:

    $ PULUMI_TEST_MODE=true 
        PULUMI_NODEJS_STACK="my-ws" 
        PULUMI_NODEJS_PROJECT="dev" 
        PULUMI_CONFIG='{ "aws:region": "us-west-2" }' 
        mocha tests.js

    ایسا کرنے سے، جیسا کہ توقع کی جاتی ہے، ہمیں دکھائے گا کہ ہمارے تین ناکام ٹیسٹ ہوئے ہیں!

    Infrastructure
        #server
          1) must have a name tag
     	 2) must not use userData (use an AMI instead)
        #group
          3) must not open port 22 (SSH) to the Internet
    
      0 passing (17ms)
      3 failing
     
     1) Infrastructure
           #server
             must have a name tag:
         Error: Missing a name tag on server
            urn:pulumi:my-ws::my-dev::aws:ec2/instance:Instance::web-server-www
    
     2) Infrastructure
           #server
             must not use userData (use an AMI instead):
         Error: Illegal use of userData on server
            urn:pulumi:my-ws::my-dev::aws:ec2/instance:Instance::web-server-www
    
     3) Infrastructure
           #group
             must not open port 22 (SSH) to the Internet:
         Error: Illegal SSH port 22 open to the Internet (CIDR 0.0.0.0/0) on group

    آئیے اپنے پروگرام کو ٹھیک کریں:

    "use strict";
     
    let aws = require("@pulumi/aws");
     
    let group = new aws.ec2.SecurityGroup("web-secgrp", {
        ingress: [
            { protocol: "tcp", fromPort: 80, toPort: 80, cidrBlocks: ["0.0.0.0/0"] },
        ],
    });
     
    let server = new aws.ec2.Instance("web-server-www", {
        tags: { "Name": "web-server-www" },
        instanceType: "t2.micro",
        securityGroups: [ group.name ], // reference the group object above
        ami: "ami-c55673a0"             // AMI for us-east-2 (Ohio),
    });
     
    exports.group = group;
    exports.server = server;
    exports.publicIp = server.publicIp;
    exports.publicHostName = server.publicDns;
    

    اور پھر دوبارہ ٹیسٹ چلائیں:

    Infrastructure
        #server
          ✓ must have a name tag
          ✓ must not use userData (use an AMI instead)
        #group
          ✓ must not open port 22 (SSH) to the Internet
     
     
     3 passing (16ms)

    سب کچھ ٹھیک ہو گیا... ہیرے! ✓✓✓

    آج کے لیے بس اتنا ہی ہے، لیکن ہم ترجمہ کے دوسرے حصے میں تعیناتی ٹیسٹنگ کے بارے میں بات کریں گے 😉

ماخذ: www.habr.com

نیا تبصرہ شامل کریں