ከፑሉሚ ጋር መሠረተ ልማትን እንደ ኮድ በመሞከር ላይ። ክፍል 1

ደህና ከሰአት ጓደኞች። በመጠኑ ላይ አዲስ ፍሰት መጀመርን በመጠባበቅ ላይ "የዴቭኦፕስ ልምዶች እና መሳሪያዎች" አዲስ ትርጉም እያጋራንዎት ነው። ሂድ።

ከፑሉሚ ጋር መሠረተ ልማትን እንደ ኮድ በመሞከር ላይ። ክፍል 1

ለመሠረተ ልማት ኮድ (መሠረተ ልማት እንደ ኮድ) ፑሉሚ እና አጠቃላይ ዓላማ የፕሮግራም ቋንቋዎችን መጠቀም ብዙ ጥቅሞችን ይሰጣል-የችሎታ እና የእውቀት መገኘት ፣ በኮዱ ውስጥ የቦይለር ሰሌዳን በአብስትራክት ማስወገድ ፣ ለቡድንዎ የሚያውቋቸው እንደ አይዲኢዎች እና ሊንተሮች ያሉ። እነዚህ ሁሉ የሶፍትዌር ምህንድስና መሳሪያዎች የበለጠ ምርታማ እንድንሆን ብቻ ሳይሆን የኮድ ጥራትንም ያሻሽላሉ። ስለዚህ አጠቃላይ ዓላማ ያላቸውን የፕሮግራም ቋንቋዎች መጠቀማችን ሌላ አስፈላጊ የሶፍትዌር ልማት ልምምዶችን እንድናስተዋውቅ መፍቀዱ ተፈጥሯዊ ነው። መሞከር.

በዚህ ጽሑፍ ውስጥ ፑሉሚ የእኛን መሠረተ ልማት-እንደ-ኮድ ለመፈተሽ እንዴት እንደሚረዳን እንመለከታለን።

ከፑሉሚ ጋር መሠረተ ልማትን እንደ ኮድ በመሞከር ላይ። ክፍል 1

መሠረተ ልማት ለምን ይፈትሻል?

ወደ ዝርዝር ሁኔታ ከመሄዳችን በፊት ጥያቄውን መጠየቅ ተገቢ ነው-“መሠረተ ልማት ለምን ይፈትሻል?” ለዚህ ብዙ ምክንያቶች አሉ እና ከእነዚህ ውስጥ ጥቂቶቹ እነሆ፡-

  • የግለሰብ ተግባራትን ወይም የፕሮግራም ሎጂክ ቁርጥራጭ አሃድ ሙከራ
  • የተፈለገውን የመሠረተ ልማት ሁኔታ ከተወሰኑ ገደቦች ጋር ያረጋግጣል.
  • እንደ ማከማቻ ባልዲ ምስጠራ አለመኖር ወይም ጥበቃ ያልተደረገለት፣ ከኢንተርኔት ወደ ቨርቹዋል ማሽኖች ክፍት መዳረሻን የመሳሰሉ የተለመዱ ስህተቶችን ማወቅ።
  • የመሠረተ ልማት አቅርቦትን ትግበራ ማረጋገጥ.
  • ከተሰጠ በኋላ ተግባራዊነቱን ለማረጋገጥ በእርስዎ “ፕሮግራም በተዘጋጀው” መሠረተ ልማት ውስጥ የሚሰራ የመተግበሪያ ሎጂክ የሩጫ ጊዜ ሙከራን በማካሄድ ላይ።
  • እንደምናየው, ሰፊ የመሠረተ ልማት ሙከራ አማራጮች አሉ. ፖሉሚ በዚህ ስፔክትረም ላይ በእያንዳንዱ ነጥብ ላይ ለመፈተሽ ዘዴዎች አሉት. እንጀምር እና እንዴት እንደሚሰራ እንይ።

የክፍል ሙከራ

የፑሉሚ ፕሮግራሞች እንደ ጃቫ ስክሪፕት ፣ ፓይዘን ፣ ታይፕ ስክሪፕት ወይም ጎ ባሉ አጠቃላይ ዓላማ የፕሮግራም ቋንቋዎች የተፃፉ ናቸው። ስለዚህ፣ የእነዚህ ቋንቋዎች ሙሉ ኃይል፣ መሳሪያዎቻቸውን እና ቤተ-መጻሕፍትን ጨምሮ፣ የሙከራ ማዕቀፎችን ጨምሮ፣ ለእነሱ ይገኛል። ፑሉሚ ብዙ ደመና ነው፣ ይህ ማለት ከማንኛውም የደመና አቅራቢ ለሙከራ ሊያገለግል ይችላል።

(በዚህ ጽሁፍ ብዙ ቋንቋ ተናጋሪዎች እና ብዙ ደመናዎች ብንሆንም ጃቫ ስክሪፕት እና ሞቻን እንጠቀማለን እና በAWS ላይ እናተኩራለን። Pythonን መጠቀም ይችላሉ። unittestሂድ የሙከራ ማዕቀፍ ወይም ሌላ የሚወዱትን የፍተሻ ማዕቀፍ። እና በእርግጥ ፑሉሚ በአዙሬ፣ ጎግል ክላውድ፣ ኩበርኔትስ ጥሩ ይሰራል።)

እንዳየነው የመሠረተ ልማት ኮድዎን ለመፈተሽ የሚፈልጓቸው በርካታ ምክንያቶች አሉ። ከመካከላቸው አንዱ የተለመደው የዩኒት ሙከራ ነው. ኮድዎ ተግባራት ሊኖሩት ስለሚችል - ለምሳሌ ሲዲአርን ለማስላት በተለዋዋጭ ስሞችን፣ መለያዎችን፣ ወዘተ. - ምናልባት እነሱን ለመፈተሽ ይፈልጉ ይሆናል. ይህ በሚወዱት የፕሮግራም አወጣጥ ቋንቋ መደበኛ የክፍል ፈተናዎችን ከመጻፍ ጋር ተመሳሳይ ነው።
ትንሽ ውስብስብ ለመሆን፣ ፕሮግራምዎ እንዴት ሀብቶችን እንደሚመድብ ማረጋገጥ ይችላሉ። በምሳሌ ለማስረዳት፣ ቀላል EC2 አገልጋይ መፍጠር እንዳለብን እናስብ እና የሚከተሉትን እርግጠኛ መሆን እንፈልጋለን።

  • ምሳሌዎች መለያ አላቸው። Name.
  • ምሳሌዎች የውስጠ-መስመር ስክሪፕት መጠቀም የለባቸውም userData - ኤኤምአይ (ምስል) መጠቀም አለብን።
  • ለኢንተርኔት የተጋለጠ 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 .
  • በስህተት መልዕክቱ ውስጥ የመርጃውን ዩአርኤን ለማሳየት ብዙ ንብረቶችን እየተጠቀምን ስለሆነ ተግባሩን መጠቀም አለብን pulumi.allእነሱን ለማጣመር.
  • በመጨረሻም፣ እነዚህ እሴቶች ያልተመሳሰሉ ስለሆኑ፣ የሞካ አብሮ የተሰራውን የመልሶ መደወያ ጥሪ ባህሪን መጠቀም አለብን። 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();
                }
            });
        });

እና በመጨረሻ ፣ ሦስተኛውን ፈተና እንፃፍ። ይህ ትንሽ የበለጠ የተወሳሰበ ይሆናል ምክንያቱም ከደህንነት ቡድኑ ጋር የተያያዙ የመግቢያ ደንቦችን እየፈለግን ነው, ከእነዚህም ውስጥ ብዙዎቹ ሊኖሩ ይችላሉ, እና በእነዚያ ደንቦች ውስጥ የሲዲአር ክልሎች, ከነዚህም ውስጥ ብዙ ሊሆኑ ይችላሉ. እኛ ግን ችለናል፡-

    // 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 (Command Line በይነገጽ) ጥቅም ላይ ይውላል፣ እሱም የቋንቋውን ሩጫ ጊዜ የሚያዋቅር፣ የፑሉሚ ሞተሩን ጅምር የሚቆጣጠረው ከሃብቶች ጋር ያሉ ስራዎች እንዲመዘገቡ እና በእቅዱ ውስጥ እንዲካተቱ ወዘተ ነው። ይሁን እንጂ አንድ ችግር አለ. በሙከራ ማዕቀፍዎ ቁጥጥር ስር ሲሰሩ በCLI እና በፑሉሚ ሞተር መካከል ምንም አይነት ግንኙነት አይኖርም።

ይህንን ችግር ለመፍታት, የሚከተሉትን መግለጽ ብቻ ያስፈልገናል:

  • የፕሮጀክት ስም፣ በአከባቢው ተለዋዋጭ ውስጥ ያለው 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)

    ሁሉም ነገር ደህና ሆነ... ሁሬ! ✓✓✓

    ለዛሬ ያ ብቻ ነው፣ ግን ስለ ማሰማራት ሙከራ በትርጉሙ ሁለተኛ ክፍል እንነጋገራለን 😉

ምንጭ: hab.com

አስተያየት ያክሉ