A’ dèanamh deuchainn air bun-structar mar chòd le Pulumi. Pàirt 1

Feasgar math a charaidean. Le dùil gun tòisich sruth ùr aig an ìre "Cleachdaidhean agus innealan DevOps" Tha sinn a’ roinn eadar-theangachadh ùr riut. Rachaibh.

A’ dèanamh deuchainn air bun-structar mar chòd le Pulumi. Pàirt 1

Le bhith a’ cleachdadh Pulumi agus cànanan prògramadh adhbhar coitcheann airson còd bun-structair (Bun-structar mar Chòd) tha mòran bhuannachdan ann: sgilean agus eòlas, cuir às do ghoileadair anns a’ chòd tro bhith a’ tarraing às, innealan a tha eòlach air an sgioba agad, leithid IDEs agus lannan. Chan e a-mhàin gu bheil na h-innealan innleadaireachd bathar-bog sin gar dèanamh nas cinneasaiche, ach cuideachd ag adhartachadh càileachd ar còd. Mar sin, tha e gu math nàdarrach gu bheil cleachdadh chànanan prògramadh adhbhar coitcheann a’ toirt cothrom dhut cleachdadh leasachaidh bathar-bog cudromach eile a thoirt a-steach - deuchainn.

San artaigil seo, seallaidh sinn ri mar a bhios Pulumi gar cuideachadh gus ar bun-structar-mar-còd a dhearbhadh.

A’ dèanamh deuchainn air bun-structar mar chòd le Pulumi. Pàirt 1

Carson deuchainn bun-structair?

Mus tèid thu gu mion-fhiosrachadh, is fhiach a’ cheist fhaighneachd: “Carson deuchainn bun-structair idir?” Tha iomadh adhbhar ann airson seo agus seo cuid dhiubh:

  • Deuchainn aonad air gnìomhan fa leth no pìosan de loidsig a’ phrògraim agad
  • A’ dearbhadh staid a’ bhun-structair a tha thu ag iarraidh an aghaidh cuid de chuingealachaidhean.
  • A’ lorg mhearachdan cumanta, leithid dìth crioptachadh bucaid stòraidh no gun dìon, ruigsinneachd fosgailte bhon eadar-lìn gu innealan mas-fhìor.
  • A’ sgrùdadh buileachadh solar bun-structair.
  • A’ dèanamh deuchainn runtime air loidsig tagraidh a tha a’ ruith taobh a-staigh do bhun-structair “prògramaichte” gus sgrùdadh a dhèanamh air gnìomhachd às deidh solarachadh.
  • Mar a chì sinn, tha raon farsaing de roghainnean deuchainn bun-structair ann. Tha uidheamachdan aig Polumi airson deuchainn aig a h-uile puing den speactram seo. Feuch an tòisich sinn agus faic mar a tha e ag obair.

Aonad deuchainn

Tha prògraman Pulumi air an sgrìobhadh ann an cànanan prògramadh adhbhar coitcheann leithid JavaScript, Python, TypeScript no Go. Mar sin, tha làn chumhachd nan cànanan sin, a’ toirt a-steach na h-innealan agus na leabharlannan aca, a’ toirt a-steach frèaman deuchainn, ri fhaighinn dhaibh. Tha Pulumi ioma-sgòth, a tha a’ ciallachadh gum faodar a chleachdadh airson deuchainn bho sholaraiche sgòthan sam bith.

(San artaigil seo, a dh'aindeoin a bhith ioma-chànanach agus multicloud, bidh sinn a 'cleachdadh JavaScript agus Mocha agus a' cuimseachadh air AWS. Faodaidh tu Python a chleachdadh unittest, Rach frèam deuchainn, no frèam deuchainn sam bith eile as toil leat. Agus, gu dearbh, tha Pulumi ag obair gu math le Azure, Google Cloud, Kubernetes.)

Mar a chunnaic sinn, tha grunn adhbharan ann airson gum biodh tu airson do chòd bun-structair a dhearbhadh. Is e aon dhiubh deuchainn aonad àbhaisteach. Leis gum faodadh gnìomhan a bhith aig a’ chòd agad - mar eisimpleir, gus CIDR obrachadh a-mach, àireamhachadh ainmean, tagaichean, msaa gu dinamach. - is dòcha gum bi thu airson deuchainn a dhèanamh orra. Tha seo an aon rud ri bhith a’ sgrìobhadh deuchainnean aonaid cunbhalach airson tagraidhean anns a’ chànan prògramaidh as fheàrr leat.
Gus beagan nas iom-fhillte fhaighinn, faodaidh tu sgrùdadh a dhèanamh air mar a bhios am prògram agad a’ riarachadh ghoireasan. Gus sealltainn, smaoinich sinn gum feum sinn frithealaiche EC2 sìmplidh a chruthachadh agus tha sinn airson a bhith cinnteach às na leanas:

  • Tha tag air cùisean Name.
  • Cha bu chòir do chùisean sgriobt in-loidhne a chleachdadh userData - feumaidh sinn AMI (dealbh) a chleachdadh.
  • Cha bu chòir SSH a bhith fosgailte don eadar-lìn.

Tha an eisimpleir seo stèidhichte air mo eisimpleir aws-js-webserver:

clàr-amais.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 e seo am prògram bunaiteach Pulumi: bidh e dìreach a’ riarachadh buidheann tèarainteachd EC2 agus eisimpleir. Ach, bu chòir a thoirt fa-near gu bheil sinn a 'briseadh nan trì riaghailtean gu h-àrd an seo. Sgrìobhamaid deuchainnean!

Sgrìobhadh deuchainnean

Bidh structar coitcheann ar deuchainnean coltach ri deuchainnean Mocha cunbhalach:

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

A-nis sgrìobhamaid a 'chiad deuchainn againn: dèan cinnteach gu bheil an taga aig na h-eisimpleirean Name. Gus seo a dhearbhadh dìreach gheibh sinn an rud eisimpleir EC2 agus thoir sùil air an togalach fhreagarrach 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();
                }
            });
        });

Tha e coltach ri deuchainn cunbhalach, ach le beagan fheartan as fhiach toirt fa-near:

  • Leis gu bheil sinn a’ ceasnachadh mu staid goireas mus tèid a chleachdadh, bidh na deuchainnean againn an-còmhnaidh gan ruith ann am modh “plana” (no “ro-shealladh”). Mar sin, tha mòran thogalaichean ann nach tèid na luachan aca fhaighinn air ais no nach tèid am mìneachadh. Tha seo a’ toirt a-steach a h-uile seilbh toraidh air a thomhas leis an t-solaraiche sgòthan agad. Tha seo àbhaisteach airson na deuchainnean againn - cha bhith sinn a’ sgrùdadh ach an dàta cuir a-steach. Tillidh sinn chun chùis seo nas fhaide air adhart, nuair a thig e gu deuchainnean amalachaidh.
  • Leis gur e toraidhean a th’ anns a h-uile togalach stòrais Pulumi, agus gu bheil mòran dhiubh air am measadh gu co-shìnte, feumaidh sinn an dòigh tagraidh a chleachdadh gus faighinn gu na luachan. Tha seo glè choltach ri geallaidhean agus gnìomh then .
  • Leis gu bheil sinn a’ cleachdadh grunn fheartan gus an goireas URN a nochdadh anns an teachdaireachd mhearachd, feumaidh sinn an gnìomh a chleachdadh pulumi.alla chur ri chèile.
  • Mu dheireadh, leis gu bheil na luachan sin air an tomhas gu co-shìnte, feumaidh sinn feart callback async togte Mocha a chleachdadh done no gealladh a thilleadh.

Aon uair ‘s gu bheil sinn air a h-uile càil a chuir air dòigh, bidh cothrom againn air na cuir a-steach mar luachan sìmplidh JavaScript. Seilbh tags is e mapa a th’ ann (sreath cheangail), mar sin nì sinn cinnteach nach eil e (1) ceàrr, agus (2) gu bheil iuchair ann airson Name. Tha e gu math sìmplidh agus a-nis is urrainn dhuinn rud sam bith a dhearbhadh!

A-nis sgrìobhamaid an dàrna seic againn. Tha e eadhon nas sìmplidh:

 // 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 mu dheireadh, sgrìobhamaid an treas deuchainn. Bidh seo beagan nas toinnte oir tha sinn a’ coimhead airson na riaghailtean logaidh a-steach co-cheangailte ris a’ bhuidheann tèarainteachd, agus faodaidh mòran dhiubh a bhith ann, agus raointean CIDR anns na riaghailtean sin, agus faodaidh mòran a bhith ann cuideachd. Ach rinn sinn riaghladh:

    // 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 e. A-nis leig leinn na deuchainnean a ruith!

A 'ruith deuchainnean

Anns a 'mhòr-chuid de chùisean, faodaidh tu deuchainnean a ruith san dòigh àbhaisteach, a' cleachdadh an fhrèam deuchainn as fheàrr leat. Ach tha aon fheart de Pulumi as fhiach aire a thoirt dha.
Mar as trice, gus prògraman Pulumi a ruith, thathas a’ cleachdadh an pulimi CLI (eadar-aghaidh Command Line), a bhios a’ rèiteachadh an ùine ruith cànain, a’ cumail smachd air cur air bhog an einnsean Pulumi gus an tèid gnìomhachd le goireasan a chlàradh agus a thoirt a-steach don phlana, msaa. Ach, tha aon duilgheadas ann. Nuair a bhios tu a’ ruith fo smachd an fhrèam deuchainn agad, cha bhith conaltradh sam bith eadar an CLI agus an einnsean Pulumi.

Gus faighinn timcheall air a’ chùis seo, chan fheum sinn ach na leanas a shònrachadh:

  • Ainm a’ phròiseict, a tha ann an caochladair na h-àrainneachd PULUMI_NODEJS_PROJECT (no, san fharsaingeachd, PULUMI__PROJECT для других языков).
    Ainm a’ chruach a tha air a shònrachadh ann an caochladair na h-àrainneachd PULUMI_NODEJS_STACK (no, san fharsaingeachd, PULUMI__ STACK).
    Na caochladairean rèiteachaidh stac agad. Gheibhear iad le bhith a’ cleachdadh caochladair àrainneachd PULUMI_CONFIG agus is e an cruth aca mapa JSON le paidhrichean iuchair/luach.

    Cuiridh am prògram a-mach rabhaidhean a’ nochdadh nach eil an ceangal ris an CLI/einnsean ri fhaighinn nuair a thèid a chur gu bàs. Tha seo cudromach oir cha bhith am prògram agad a’ cleachdadh dad agus dh’ fhaodadh gum biodh e na iongnadh mura b’ e sin a bha thu an dùil a dhèanamh! Gus innse dha Pulumi gur e seo dìreach a tha a dhìth ort, faodaidh tu stàladh PULUMI_TEST_MODE в true.

    Smaoinich gu feum sinn ainm a’ phròiseict a shònrachadh my-ws, ainm cruachan dev, agus Roinn AWS us-west-2. Bidh an loidhne-àithne airson ruith deuchainnean Mocha a’ coimhead 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

    Le bhith a’ dèanamh seo, mar a bhiodh dùil, seallaidh sin dhuinn gu bheil trì deuchainnean air fàiligeadh 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

    Nach socraich sinn ar prògram:

    "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 an uairsin ruith na deuchainnean a-rithist:

    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)

    Chaidh a h-uile càil gu math... Hurray! ✓✓✓

    Tha sin uile airson an-diugh, ach bruidhnidh sinn mu dheuchainnean cleachdadh san dàrna pàirt den eadar-theangachadh 😉

Source: www.habr.com

Cuir beachd ann