Bonneagar a Thástáil mar Chód le Pulumi. Cuid 1

Dea-tráthnóna a chairde. In oirchill tús a chur le sreabhadh nua ag an ráta "Cleachtais agus uirlisí DevOps" Táimid ag roinnt aistriúchán nua leat. Téigh.

Bonneagar a Thástáil mar Chód le Pulumi. Cuid 1

Trí úsáid a bhaint as Pulumi agus teangacha ríomhchláraithe ilchuspóireacha le haghaidh cód bonneagair (Bonneagar mar Chód) tá go leor buntáistí ar fáil: infhaighteacht scileanna agus eolais, deireadh a chur le pláta coire sa chód trí astarraingt, uirlisí a bhfuil aithne ag d’fhoireann orthu, mar IDEanna agus lintéir. Ní hamháin go ndéanann na huirlisí innealtóireachta bogearraí seo go léir muid níos táirgiúla, ach feabhsaíonn siad cáilíocht ár gcód freisin. Dá bhrí sin, níl sé ach nádúrtha go gceadaíonn úsáid na dteangacha ríomhchláraithe ginearálta dúinn cleachtas tábhachtach forbartha bogearraí eile a thabhairt isteach - tástáil.

San Airteagal seo, féachfaimid ar conas a chuidíonn Pulumi linn ár mbonneagar-mar-cód a thástáil.

Bonneagar a Thástáil mar Chód le Pulumi. Cuid 1

Cén fáth bonneagar a thástáil?

Sula ndéantar mionsonrú, is fiú an cheist a chur: “Cén fáth a ndéantar tástáil ar bhonneagar ar chor ar bith?” Tá go leor cúiseanna leis seo agus seo cuid acu:

  • Tástáil aonaid ar fheidhmeanna aonair nó blúirí de loighic do chláir
  • Fíoraíonn sé staid inmhianaithe an bhonneagair i gcoinne srianta áirithe.
  • Earráidí coitianta a bhrath, mar shampla easpa criptithe buicéad stórála nó gan chosaint, rochtain oscailte ón Idirlíon ar mheaisíní fíorúla.
  • Feidhmiú soláthar bonneagair a sheiceáil.
  • Tástáil ama rite a dhéanamh ar loighic feidhmchláir a ritheann laistigh de do bhonneagar “cláraithe” chun feidhmiúlacht a sheiceáil tar éis an tsoláthair.
  • Mar is féidir linn a fheiceáil, tá raon leathan roghanna tástála bonneagair ann. Tá meicníochtaí ag Polumi chun tástáil a dhéanamh ag gach pointe ar an speictream seo. A ligean ar tús a chur agus a fheiceáil conas a oibríonn sé.

Tástáil aonad

Scríobhtar cláir Pulumi i dteangacha ríomhchlárúcháin ilchuspóireacha mar JavaScript, Python, TypeScript nó Go. Dá bhrí sin, tá cumhacht iomlán na dteangacha sin, lena n-áirítear a n-uirlisí agus leabharlanna, lena n-áirítear creataí tástála, ar fáil dóibh. Is il-scamall é Pulumi, rud a chiallaíonn gur féidir é a úsáid le haghaidh tástála ó aon soláthraí scamall.

(San Airteagal seo, in ainneoin a bheith ilteangach agus multicloud, úsáidimid JavaScript agus Mocha agus dírímid ar AWS. Is féidir leat úsáid a bhaint as Python unittest, Go creat tástála, nó aon chreat tástála eile is mian leat. Agus, ar ndóigh, oibríonn Pulumi go hiontach le Azure, Google Cloud, Kubernetes.)

Mar atá feicthe againn, tá go leor cúiseanna ann a d’fhéadfadh gur mhaith leat do chód bonneagair a thástáil. Is é ceann acu tástáil aonad traidisiúnta. Toisc go bhféadfadh feidhmeanna a bheith ag do chód - mar shampla, CIDR a ríomh, ainmneacha, clibeanna, etc. a ríomh go dinimiciúil. - is dócha go mbeidh tú ag iarraidh iad a thástáil. Tá sé seo mar an gcéanna le tástálacha aonaid rialta a scríobh le haghaidh feidhmchlár sa teanga ríomhchlárúcháin is fearr leat.
Chun a fháil beagán níos casta, is féidir leat a sheiceáil conas a leithdháileann do chlár acmhainní. Mar léiriú, déanaimis a shamhlú go gcaithfimid freastalaí EC2 simplí a chruthú agus ba mhaith linn a bheith cinnte de na nithe seo a leanas:

  • Tá clib ag cásanna Name.
  • Níor cheart go n-úsáidfeadh cásanna script inlíne userData - ní mór dúinn AMI (íomhá) a úsáid.
  • Níor cheart go mbeadh aon SSH nochta don Idirlíon.

Tá an sampla seo bunaithe ar mo shampla 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;

Is é seo an bunchlár Pulumi: go simplí leithdháileann sé grúpa slándála EC2 agus sampla. Mar sin féin, ba chóir a thabhairt faoi deara go bhfuil muid ag briseadh na dtrí riail thuasluaite anseo. Scríobhaimis trialacha!

Scríbhneoireacht tástálacha

Beidh cuma thástálacha rialta Mocha ar struchtúr ginearálta ár dtástálacha:

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, открытого в Интернет.
    });
});

Anois scríobhaimis ár gcéad thástáil: déan cinnte go bhfuil an chlib ar na cásanna Name. Chun é seo a sheiceáil ní gá dúinn ach an réad shampla EC2 a fháil agus an t-airí comhfhreagrach a sheiceáil 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();
                }
            });
        });

Breathnaíonn sé cosúil le tástáil rialta, ach le roinnt gnéithe fiú a thabhairt faoi deara:

  • Toisc go gcuirimid ceist faoi staid acmhainne roimh imscaradh, reáchtáiltear ár dtrialacha i mód “plean” (nó “réamhamharc”) i gcónaí. Mar sin, tá go leor maoine ann nach n-aisghabhfar a luachanna nó nach saineofar iad. Áirítear leis seo gach maoin aschuir arna ríomh ag do sholáthraí néil. Is gnách é seo dár dtástálacha - ní dhéanaimid ach na sonraí ionchuir a sheiceáil. Fillfimid ar an tsaincheist seo níos déanaí, nuair a thagann sé le tástálacha comhtháthaithe.
  • Ós rud é gur aschuir iad na hairíonna acmhainne Pulumi go léir, agus go ndéantar go leor díobh a mheas go sioncrónach, ní mór dúinn an modh iarratais a úsáid chun rochtain a fháil ar na luachanna. Tá sé seo an-chosúil le gealltanais agus feidhm then .
  • Ós rud é go bhfuil roinnt airíonna in úsáid againn chun an URN acmhainne a thaispeáint sa teachtaireacht earráide, ní mór dúinn an fheidhm a úsáid pulumi.allchun iad a chur le chéile.
  • Ar deireadh, ós rud é go ríomhtar na luachanna seo go neamhshioncronach, ní mór dúinn gné aisghlaoite aisioncronaithe Mocha a úsáid done nó gealltanas a thabhairt ar ais.

Nuair a bheidh gach rud socraithe againn, beidh rochtain againn ar na hionchuir mar luachanna simplí JavaScript. Maoin tags is léarscáil é (eagar comhthiomsaitheach), mar sin cinnteoimid (1) nach bhfuil sé bréagach, agus (2) go bhfuil eochair ann do Name. Tá sé an-simplí agus anois is féidir linn rud ar bith a thástáil!

Anois scríobhaimis ár dara seic. Tá sé níos simplí fós:

 // 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();
                }
            });
        });

Agus ar deireadh, scríobhaimis an tríú tástáil. Beidh sé seo beagán níos casta toisc go bhfuilimid ag lorg na rialacha logáil isteach a bhaineann leis an ngrúpa slándála, ar féidir go leor díobh a bheith ann, agus na raonta CIDR sna rialacha sin, agus is féidir go leor díobh a bheith ann freisin. Ach d’éirigh linn:

    // 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();
                }
            });
        });

Sin é an méid. Anois déanaimis na tástálacha a rith!

Rith tástálacha

I bhformhór na gcásanna, is féidir leat tástálacha a reáchtáil ar an ngnáthbhealach, ag baint úsáide as an gcreat tástála de do rogha féin. Ach tá gné amháin de Pulumi ar fiú aird a thabhairt air.
De ghnáth, chun cláir Pulumi a reáchtáil, úsáidtear an pulimi CLI (comhéadan Líne Ordú), a chumraíonn an t-am rite teanga, a rialaíonn seoladh an innill Pulumi ionas gur féidir oibríochtaí le hacmhainní a thaifeadadh agus a áireamh sa phlean, etc. Mar sin féin, tá fadhb amháin ann. Agus tú ag rith faoi rialú do chreat tástála, ní bheidh aon chumarsáid idir an CLI agus inneall Pulumi.

Chun dul timpeall ar an gceist seo, níl le déanamh againn ach na nithe seo a leanas a shonrú:

  • Ainm an tionscadail, atá san athróg timpeallachta PULUMI_NODEJS_PROJECT (nó, go ginearálta, PULUMI__PROJECT для других языков).
    Ainm an chruach atá sonraithe san athróg timpeallachta PULUMI_NODEJS_STACK (nó, go ginearálta, PULUMI__ STACK).
    D'athróga cumraíochta stack. Is féidir iad a fháil trí athróg timpeallachta a úsáid PULUMI_CONFIG agus is é léarscáil JSON a bhformáid le péirí eochair/luacha.

    Eiseoidh an clár rabhaidh ag tabhairt le fios nach bhfuil an nasc leis an CLI/inneall ar fáil le linn a fhorghníomhaithe. Tá sé seo tábhachtach mar ní bheidh do chlár ag úsáid aon rud i ndáiríre agus d'fhéadfadh sé a bheith ina ábhar iontais murab é sin a bhí beartaithe agat a dhéanamh! Chun a insint do Pulumi gurb é seo go díreach cad atá uait, is féidir leat a shuiteáil PULUMI_TEST_MODE в true.

    Samhlaigh go gcaithfimid ainm an tionscadail a shonrú i my-ws, ainm cruachta dev, agus Réigiún AWS us-west-2. Féachfaidh an líne ordaithe chun tástálacha Mocha a rith mar seo:

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

    Má dhéantar é seo, mar a bheifí ag súil leis, léireofar dúinn go bhfuil trí thástáil theip againn!

    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

    Déanaimis ár gclár a shocrú:

    "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;
    

    Agus ansin reáchtáil na tástálacha arís:

    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)

    Chuaigh gach rud go maith... Hurray! ✓✓✓

    Sin uile don lá inniu, ach labhróimid faoi thástáil imlonnaithe sa dara cuid den aistriúchán 😉

Foinse: will.com

Add a comment