Fanandramana fotodrafitrasa toy ny Code miaraka amin'i Pulumi. Fizarana 1

Bonsoir ry namana. Amin'ny fiandrasana ny fanombohan'ny fikorianan'ny vaovao amin'ny tahan'ny "Fanazatra sy fitaovana DevOps" Mizara dikanteny vaovao aminao izahay. Mandehana.

Fanandramana fotodrafitrasa toy ny Code miaraka amin'i Pulumi. Fizarana 1

Ny fampiasana Pulumi sy ny fiteny fandaharana amin'ny ankapobeny ho an'ny kaody fotodrafitrasa (Infrastructure as Code) dia manome tombony maro: ny fisian'ny fahaiza-manao sy ny fahalalana, ny fanafoanana ny boilerplate amin'ny code amin'ny alàlan'ny abstraction, fitaovana mahazatra ny ekipanao, toy ny IDE sy linters. Ireo fitaovana injeniera rindrambaiko rehetra ireo dia tsy vitan'ny hoe mamokatra kokoa antsika, fa manatsara ny kalitaon'ny code. Noho izany, ara-dalàna raha ny fampiasana fiteny fandaharana amin'ny tanjona ankapobeny dia mamela antsika hampiditra fomba fiasa lehibe hafa amin'ny fampandrosoana rindrambaiko - fitiliana.

Amin'ity lahatsoratra ity, hojerentsika ny fomba nanampian'i Pulumi antsika hanandrana ny fotodrafitrasa-as-code.

Fanandramana fotodrafitrasa toy ny Code miaraka amin'i Pulumi. Fizarana 1

Nahoana no andrana fotodrafitrasa?

Alohan'ny handehanana amin'ny antsipiriany dia ilaina ny mametraka ny fanontaniana hoe: "Nahoana ny fotodrafitrasa no andrana?" Misy antony maro mahatonga izany ary ireto ny sasany:

  • Fitsapana vondrona ny fiasan'ny tsirairay na ampahany amin'ny lojikan'ny programanao
  • Manamarina ny toetry ny fotodrafitrasa irina manoloana ny teritery sasany.
  • Fitadiavana lesoka mahazatra, toy ny tsy fisian'ny fanafenana siny fitahirizana na tsy voaaro, misokatra ny fidirana amin'ny Internet mankany amin'ny milina virtoaly.
  • Fanamarinana ny fampiharana ny famatsiana fotodrafitrasa.
  • Fanaovana fitiliana ny lojika fampiharana mandeha ao anatin'ny fotodrafitrasa "voarindra" mba hanamarinana ny fiasa aorian'ny famatsiana.
  • Araka ny hitantsika, misy karazana safidy fitiliana fotodrafitrasa. Polumi dia manana mekanika hanaovana fitiliana isaky ny teboka amin'ity sehatra ity. Andao hatomboka ary hojerentsika ny fomba fiasa.

Fitsapana vondrona

Ny programa Pulumi dia nosoratana tamin'ny fiteny fandaharana amin'ny ankapobeny toa ny JavaScript, Python, TypeScript na Go. Noho izany, ny hery feno amin'ireo fiteny ireo, ao anatin'izany ny fitaovany sy ny tranomboky, anisan'izany ny rafitra fitsapana, dia azon'izy ireo atao. Pulumi dia rahona marobe, izay midika fa azo ampiasaina amin'ny fitsapana amin'ny mpamatsy rahona.

(Ao amin'ity lahatsoratra ity, na dia amin'ny fiteny maro sy multicloud aza dia mampiasa JavaScript sy Mocha izahay ary mifantoka amin'ny AWS. Afaka mampiasa Python ianao unittest, Go test framework, na rafitra fitsapana hafa tianao. Ary mazava ho azy, miasa tsara amin'ny Azure, Google Cloud, Kubernetes i Pulumi.)

Araka ny efa hitantsika, misy antony maromaro mety hanirianao hitsapa ny kaody fotodrafitrasa. Ny iray amin'izy ireo dia ny fitiliana unit mahazatra. Satria mety manana fiasa ny kaodinao - ohatra, kajy CIDR, kajy dynamic ny anarana, marika, sns. - mety ho tianao ny hitsapa azy ireo. Izany dia mitovy amin'ny fanoratana andrana tsy tapaka ho an'ny fampiharana amin'ny fiteny fandaharana tianao indrindra.
Mba hahatonga anao ho sarotra kokoa, azonao atao ny manamarina ny fomba anomezan'ny programanao loharanon-karena. Mba hanazavana, andeha alaivo sary an-tsaina fa mila mamorona mpizara EC2 tsotra isika ary te hahazo antoka amin'ireto manaraka ireto:

  • Misy marika ny tranga Name.
  • Tsy tokony hampiasa script inline ny tranga userData - tsy maintsy mampiasa AMI (sary) isika.
  • Tsy tokony hisy SSH miseho amin'ny Internet.

Ity ohatra ity dia mifototra amin'ny ny ohatra 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;

Ity no programa fototra Pulumi: manolotra vondrona fiarovana EC2 sy ohatra fotsiny. Marihina anefa fa eto isika dia mandika ireo fitsipika telo voalaza etsy ambony. Andeha hanoratra fitsapana!

Fitsapana fanoratana

Ny rafitra ankapoben'ny fitsapana ataontsika dia hitovy amin'ny fitsapana Mocha mahazatra:

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

Andeha isika hanoratra ny fitsapana voalohany ataontsika: ataovy azo antoka fa manana ny marika ny tranga Name. Mba hanamarinana izany dia mahazo ny zavatra ohatra EC2 isika ary manamarina ny fananana mifanaraka amin'izany 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();
                }
            });
        });

Toa fitsapana mahazatra izy io, saingy misy lafin-javatra vitsivitsy tokony ho marihina:

  • Satria manontany ny toetry ny loharano iray izahay alohan'ny fametrahana azy, dia atao amin'ny fomba “plan” (na “preview”) foana ny fitsapanay. Noho izany, misy fananana maro izay tsy horaisina fotsiny na tsy hofaritana ny soatoavina. Tafiditra ao anatin'izany ny fananana vokatra rehetra kajy nataon'ny mpamatsy rahonao. Ara-dalàna izany ho an'ny andranay - ny angona fampidirana ihany no jerena. Hiverina amin'ity olana ity isika any aoriana, rehefa tonga amin'ny andrana fampidirana.
  • Satria ny fananan'ny loharanon-karena Pulumi dia vokatra, ary maro amin'izy ireo no tombanana tsy mifanaraka, mila mampiasa ny fomba fampiharana isika mba hidirana amin'ny soatoavina. Tena mitovy amin'ny fampanantenana sy afunction izany then .
  • Koa satria mampiasa fananana maromaro izahay hanehoana ny loharanon-karena URN amin'ny hafatra diso, dia mila mampiasa ny fiasa pulumi.allhanambatra azy ireo.
  • Farany, satria kajy asynchronous ireo soatoavina ireo dia mila mampiasa ny endri-tsarin'ny async callback an'i Mocha isika. done na mamerina fampanantenana.

Rehefa vita ny zava-drehetra, dia afaka miditra amin'ny fampidirana ho sanda JavaScript tsotra izahay. NY FANANANA tags dia sarintany (array mifandray), ka ho azo antoka fa (1) tsy diso, ary (2) misy fanalahidy ho an'ny Name. Tena tsotra izany ary afaka mitsapa na inona na inona isika izao!

Andeha hosoratana ny fanamarinana faharoa. Tsotra kokoa izany:

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

Ary farany, andao hanoratra ny fitsapana fahatelo. Ho sarotra kokoa izany satria mitady ny fitsipika fidirana mifandray amin'ny vondrona fiarovana, izay mety ho maro, ary ny CIDR amin'ireo fitsipika ireo, izay mety ho maro ihany koa. Saingy nahavita izahay:

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

Izay ihany. Andeha isika hanao ny fitsapana!

Mihazakazaka fitsapana

Amin'ny ankabeazan'ny toe-javatra, azonao atao ny manao fitsapana amin'ny fomba mahazatra, amin'ny fampiasana ny rafitra fitsapana tianao. Saingy misy endri-javatra iray amin'ny Pulumi izay mendrika ny hojerena.
Amin'ny ankapobeny, amin'ny fampandehanana ny programa Pulumi dia ampiasaina ny Pulumi CLI (Command Line interface), izay manitsy ny fotoana fandehan'ny fiteny, mifehy ny fandefasana ny motera Pulumi mba hahafahan'ny asa miaraka amin'ny loharano azo voarakitra sy ampidirina ao amin'ny drafitra, sns. Na izany aza, misy olana iray. Rehefa mihazakazaka eo ambany fifehezan'ny rafitra fitsapana anao dia tsy hisy fifandraisana eo amin'ny CLI sy ny motera Pulumi.

Mba hamahana ity olana ity dia mila mamaritra ireto manaraka ireto isika:

  • Anaran'ny tetikasa, izay voarakitra ao amin'ny fari-piainan'ny tontolo iainana PULUMI_NODEJS_PROJECT (na, amin'ny ankapobeny, PULUMI__PROJECT для других языков).
    Ny anaran'ny stack izay voafaritra ao amin'ny fari-piainan'ny tontolo iainana PULUMI_NODEJS_STACK (na, amin'ny ankapobeny, PULUMI__ STACK).
    Ny fari-piainan'ny stack anao. Azo alaina amin'ny alàlan'ny faribolan'ny tontolo iainana izy ireo PULUMI_CONFIG ary ny sari-tany JSON miaraka amin'ny pairs key/value ny endriny.

    Ny programa dia hamoaka fampitandremana milaza fa tsy misy ny fifandraisana amin'ny CLI/motera mandritra ny famonoana. Zava-dehibe izany satria tsy hampiasa na inona na inona ny programanao ary mety ho gaga raha tsy izany no nokasainao hatao! Mba hilazana an'i Pulumi fa izany indrindra no ilainao dia azonao atao ny mametraka PULUMI_TEST_MODE в true.

    Alaivo sary an-tsaina hoe mila mamaritra ny anaran'ny tetikasa isika my-ws, anarana stack dev, ary ny faritra AWS us-west-2. Ny andalana baiko amin'ny fanaovana fitiliana Mocha dia ho toy izao:

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

    Ny fanaovana izany, araka ny efa nampoizina, dia hampiseho amintsika fa manana fitsapana telo tsy nahomby isika!

    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

    Andao amboary ny programantsika:

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

    Ary avereno indray ny fitsapana:

    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)

    Nandeha tsara ny zava-drehetra... Hurray! ✓✓✓

    Izany ihany no ho an'ny anio, fa hiresaka momba ny fitiliana fametrahana ao amin'ny tapany faharoa amin'ny dikanteny isika 😉

Source: www.habr.com

Add a comment