پلومي سان ڪوڊ جي طور تي انفراسٽرڪچر جي جانچ. حصو 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 سيڪيورٽي گروپ ۽ هڪ مثال مختص ڪري ٿو. بهرحال، اهو ياد رکڻ گهرجي ته هتي اسان مٿي بيان ڪيل ٽنهي قاعدن کي ٽوڙي رهيا آهيون. اچو ته ٽيسٽ لکون!

لکڻ جا امتحان

اسان جي ٽيسٽن جو عام ڍانچو باقاعده Mocha ٽيسٽن وانگر نظر ايندو:

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 (ڪمانڊ لائن انٽرفيس) استعمال ڪيو ويندو آهي، جيڪو ٻوليءَ جي رن ٽائم کي ترتيب ڏئي ٿو، پلومي انجڻ جي لانچ کي ڪنٽرول ڪري ٿو ته جيئن وسيلن سان آپريشن کي رڪارڊ ڪري سگهجي ۽ پلان ۾ شامل ڪري سگهجي، وغيره. بهرحال، اتي هڪ مسئلو آهي. جڏهن توهان جي ٽيسٽ فريم ورڪ جي ڪنٽرول هيٺ هلندي، اتي CLI ۽ پلومي انجڻ جي وچ ۾ ڪوبه رابطو نه هوندو.

هن مسئلي جي چوڌاري حاصل ڪرڻ لاء، اسان کي صرف هيٺين وضاحت ڪرڻ جي ضرورت آهي:

  • پروجيڪٽ جو نالو، جيڪو ماحول جي متغير ۾ شامل آهي 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. Mocha ٽيسٽ هلائڻ لاءِ ڪمانڊ لائن هن طرح نظر ايندي:

    $ 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

تبصرو شامل ڪريو