د پلومي سره د کوډ په توګه د زیربنا ازموینه. برخه 1

مازدیګر مو پخیر ملګرو. په نرخ کې د نوي جریان پیل په تمه "DevOps کړنې او وسیلې" یوه نوې ژباړه درسره شریکوو. لاړ شه.

د پلومي سره د کوډ په توګه د زیربنا ازموینه. برخه 1

د انفراسټرکچر کوډ (د کوډ په توګه زیربنا) لپاره د پلومي او عمومي هدف برنامې ژبې کارول ډیری ګټې وړاندې کوي: د مهارتونو او پوهې شتون ، د خلاصون له لارې په کوډ کې د بویلر پلیټ له مینځه وړل ، ستاسو ټیم ته پیژندل شوي اوزار لکه IDEs او لینټرز. دا ټول د سافټویر انجینرۍ وسیلې نه یوازې موږ ډیر ګټور کوي ، بلکه زموږ د کوډ کیفیت هم ښه کوي. له همدې امله، دا یوازې طبیعي ده چې د عمومي هدف پروګرام کولو ژبو کارول موږ ته اجازه راکوي چې د سافټویر پراختیا یو بل مهم تمرین معرفي کړو - ازمونه.

په دې مقاله کې، موږ به وګورو چې څنګه پلومي زموږ سره مرسته کوي زموږ د زیربنا په توګه-کوډ ازموینه وکړي.

د پلومي سره د کوډ په توګه د زیربنا ازموینه. برخه 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د هغوی سره یوځای کول.
  • په نهایت کې ، ځکه چې دا ارزښتونه په غیر متمرکز ډول محاسبه کیږي ، موږ اړتیا لرو د موچا جوړ شوي 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 انجن تر منځ به هیڅ اړیکه ونلري.

د دې مسلې په شاوخوا کې ترلاسه کولو لپاره، موږ یوازې لاندې مشخص کولو ته اړتیا لرو:

  • د پروژې نوم، کوم چې د چاپیریال متغیر کې شامل دی 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

Add a comment