Infrastructuram Testis ut Codex cum Pulumi. Pars I

Salvete amici. In antecessum initium novi fluxus in rate "DevOps exercitia et instrumenta" Novam translationem vobiscum communicamus. Vade.

Infrastructuram Testis ut Codex cum Pulumi. Pars I

Utens Pulumi et programmandi causa programmandi linguas pro codice infrastructure (Infrastructure sicut Codex) multa commoda praebet: facultas artes et scientia, eliminatio boilerplati in codice per abstractionem, instrumenta familiaria ad equos tuos, sicut IDEs et linters. Haec omnia instrumenta machinalis programmatis non solum fecundiores nos faciunt, sed etiam qualitatem codicis nostri emendant. Solum igitur naturale est quod usus linguae programmationis generalis propositi nobis permittit ut alius maximus progressus programmandi praxis introducat - тестирование.

In hoc articulo, videbimus quomodo Pulumi adiuvat ut infrastructuram nostram ut-code experiamur.

Infrastructuram Testis ut Codex cum Pulumi. Pars I

Cur infrastructuram test?

Antequam singula pergamus, operae pretium est interrogationem interrogare: "Quare infrastructuram omnino probas?" Causae huius multae sunt, et hic nonnullae sunt;

  • Unitas probatio singularum functionum vel fragmentorum tuorum programmatis logicae
  • Verificat optatum statum infrastructure contra aliquas angustias.
  • Deprehensio errorum communium, sicut defectus encryptionis de situla reposita vel indefensa, aditus apertus ab Interrete ad machinis virtualis.
  • Reperiens exsequendam commeatum infrastructuram.
  • Peragere runtime probationem applicationis logicae currens intra "programmatum" infrastructuram ad reprimendam functionem cum commeatu.
  • Ut videre possumus, amplis est bene probatio infrastructure. Polumi machinationes habet ut quavis in parte hoc spectrum probetur. Incipiamus et vide quomodo operatur.

Unitas temptationis

Programmata pulumi scripta sunt in linguas programmandi generatim ut JavaScript, Python, TypeScript vel Go. Ideo plena potestas harum linguarum iis instrumentis ac bibliothecis, etiam compagibus testium, iis praesto est. Pulumi multi-nubes est, id quod ex quavis nube provisore probare potest.

(In hoc articulo, licet multilinguis et multiloquus, JavaScript et Mocha et focus in AWS utimur. Pythone uti potes. unittest, vade testi compage , vel quodvis aliud testum compage libet. Et sane, Pulumi magna cum Azure, Google Cloud, Kubernetes facit.

Ut vidimus, plures sunt causae cur infrastructuram tuam probare velis codicem tuum. Una earum est probatio unitatis conventionalis. Quia codice tuo functiones habere potest - exempli gratia, ad CIDR computare, nomina, tags dynamice computare, etc. — Probare voles eos probare. Hoc idem est ac scribere unitatem regularem probationes applicationum in lingua programmandi gratissimi.
Ut paulo implicatior fiat, inspicere potes quomodo programmata tua facultates disponat. Ad illustrandum, fingamus nos necessitatem ec2 simplicis servientis creare et ex sequentibus certos esse volumus:

  • Exemplum habent tag Name.
  • Instantiae non debent uti scriptum inline userData - AMI utendum est (imago).
  • Nulla in lorem exposita SSH habeatur.

Hoc exemplum fundatur exemplum meum 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;

Hoc est propositum Pulumi fundamentalis: simpliciter collocat globum securitatis EC2 et exemplum. Sed sciendum, quod hic praevaricamur omnia tria praecepta praedicta. Testimonia scribamus!

scripturam probat

Communis nostrarum probationum structura tamquam Mocha probata regularis erit:

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

Nunc primum nostrum testimonium scribamus: fac ut instantiae tag habeantur Name. Ad hoc reprimendum nos simpliciter impetrare ec2 instantia obiecti et proprietatem congruentem deprime 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();
                }
            });
        });

Spectat ut iusto experimento, sed notatione pauca notatu digna;

  • Quia statum opum ante instruere quaesivimus, nostrae probationes semper "consilium" (vel "praevius") currunt. Ideo multae proprietates sunt quarum bona vel simpliciter insanabiles vel non definientur. Hoc includit omnes possessiones output ratione vestra nubes provisor. Hoc normale pro nostris probationibus - tantum inputationis datae reprehendo. Postea ad hanc constitutionem revertemur, cum fit probatio integratio.
  • Cum omnes Pulumi facultates possessiones sint outputes, et multae ex eis asynchrone aestimantur, necesse est utendi methodo applicanda ad bona accessus. Hoc est simillimum promissionibus ac functionibus then .
  • Cum pluribus proprietatibus utimur ad praebendam URNA in erroris relatum, opus est functione uti pulumi.allad ea cogenda.
  • Denique cum hi valores asynchrone computantur, opus est ut Mocha aedificata in pluma asyncone callback. done vel reddens promissionem.

Postquam omnia constituimus, accessum habebimus ad inputationes sicut valores simplices JavaScript. Property tags est tabula geographica (associativa ordinata), sic te iustum fac ut illud non sit falsum, et clavis est ad Name. Valde simplex est et nunc aliquid probare possumus!

Nunc secundo reprehendo nostrum scribemus. Est etiam simplicius;

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

Et tertiam probationem denique scribamus. Hoc paulo magis complicatum erit quod quaerimus regulas login consociatas cum caterva securitatis, quarum multae esse possunt, et in illis regulis CIDR vagatur, quarum multae etiam esse possunt. sed adscitabimus;

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

Id omne. Nunc ad probationes transeamus!

Currentem probat

In pluribus, probationes more solito currere potes, adhibitis probationibus electionis tuae. Sed unum notum est Pulumi quod attentione dignum est.
De more, ut programmata Pulumi currant, pulimi CLI (mandati Line interface) adhibetur, qui runtime linguam configurat, machinam machinam Pulumi immissionem moderatur ut operationes cum opibus notari et in consilio comprehendi possint, etc. Sed quis est lacus. Cum decurrentes sub dicione fabricarum testium tuarum, nulla communicatio erit inter machinam CLI et Pulumi.

Ut circa hanc quaestionem accedamus, solum opus est ut sequentia definiamus:

  • Nomen proiectum, quod in ambitu variabili continetur PULUMI_NODEJS_PROJECT (Vel, generalius, PULUMI__PROJECT для других языков).
    Nomen ACERVUS qui in ambitu variabilis specificatur PULUMI_NODEJS_STACK (Vel, generalius, PULUMI__ STACK).
    Configuratione variabilium acervus tuus. Possunt obtineri usura an environment variabilis PULUMI_CONFIG earumque forma est JSON tabula cum clavis/pretiis paria.

    Propositum monuerit significans nexum ad machinam per executionem praesto non esse. Hoc magni momenti est quod institutio tua non aliquid actu disponit et mirum si non est quod facere voluisti! Dicere Pulumi hoc prorsus quod opus est, instituere potes PULUMI_TEST_MODE в true.

    Finge opus est ut specificare project nomen in my-ws, Stack name devet Regio AWS us-west-2. Praeceptum lineae ad currendum Mocha probat hoc simile erit:

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

    Hoc faciens, sicut expectatur, ostendet nobis quod tres probationes defecerunt!

    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

    Propositum nostrum figamus:

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

    Et deinde iterum probat currere:

    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)

    Omnia bene ... eua! ✓✓✓

    Id est omnia hodie, sed de instruere probatione in secunda parte translationis loquemur 😉

Source: www.habr.com

Add a comment