පුලුමි සමඟ කේතය ලෙස යටිතල පහසුකම් පරීක්ෂා කිරීම. 1 කොටස

සුභ සන්ධ්‍යාවක් මිත්‍රවරුනි. අනුපාතයේ නව ප්රවාහයක ආරම්භය අපේක්ෂාවෙන් "DevOps භාවිතයන් සහ මෙවලම්" අපි ඔබ සමඟ නව පරිවර්තනයක් බෙදා ගන්නෙමු. යන්න.

පුලුමි සමඟ කේතය ලෙස යටිතල පහසුකම් පරීක්ෂා කිරීම. 1 කොටස

යටිතල පහසුකම් කේතය සඳහා Pulumi සහ පොදු කාර්ය ක්‍රමලේඛන භාෂා භාවිතා කිරීම (කේතය ලෙස යටිතල පහසුකම්) බොහෝ වාසි සපයයි: කුසලතා සහ දැනුම ලබා ගැනීම, වියුක්තකරණය හරහා කේතයේ බොයිලේරු ඉවත් කිරීම, IDE සහ linters වැනි ඔබේ කණ්ඩායමට හුරුපුරුදු මෙවලම්. මෙම සියලු මෘදුකාංග ඉංජිනේරු මෙවලම් අපව වඩාත් ඵලදායී බවට පත් කරනවා පමණක් නොව, අපගේ කේතයේ ගුණාත්මකභාවය වැඩි දියුණු කරයි. එබැවින්, පොදු කාර්ය ක්‍රමලේඛන භාෂා භාවිතය තවත් වැදගත් මෘදුකාංග සංවර්ධන භාවිතයක් හඳුන්වා දීමට අපට ඉඩ සලසා දීම ස්වාභාවිකය. පරීක්ෂා කිරීම.

මෙම ලිපියෙන්, අපි අපගේ යටිතල පහසුකම්-කේතය ලෙස පරීක්ෂා කිරීමට පුළුමි අපට උපකාර කරන්නේ කෙසේදැයි බලමු.

පුලුමි සමඟ කේතය ලෙස යටිතල පහසුකම් පරීක්ෂා කිරීම. 1 කොටස

යටිතල පහසුකම් පරීක්ෂා කරන්නේ ඇයි?

විස්තර කිරීමට පෙර, ප්‍රශ්නය ඇසීම වටී: “ඇයි යටිතල පහසුකම් පරීක්ෂා කරන්නේ?” මේ සඳහා බොහෝ හේතු ඇති අතර ඒවායින් කිහිපයක් මෙන්න:

  • ඔබේ වැඩසටහන් තර්කයේ තනි කාර්යයන් හෝ කොටස්වල ඒකක පරීක්ෂා කිරීම
  • යම් සීමාවන්ට එරෙහිව යටිතල පහසුකම්වල අපේක්ෂිත තත්ත්වය තහවුරු කරයි.
  • ගබඩා බාල්දියක සංකේතනය නොමැතිකම හෝ අනාරක්ෂිත, අන්තර්ජාලයෙන් අථත්‍ය යන්ත්‍ර වෙත විවෘත ප්‍රවේශය වැනි පොදු දෝෂ හඳුනා ගැනීම.
  • යටිතල පහසුකම් සැපයීම ක්රියාත්මක කිරීම පරීක්ෂා කිරීම.
  • ප්‍රතිපාදන ලබා දීමෙන් පසු ක්‍රියාකාරීත්වය පරීක්ෂා කිරීම සඳහා ඔබේ “වැඩසටහන්ගත” යටිතල ව්‍යුහය තුළ ක්‍රියාත්මක වන යෙදුම් තර්කයේ ධාවන කාල පරීක්‍ෂණය සිදු කිරීම.
  • අපට පෙනෙන පරිදි, යටිතල පහසුකම් පරීක්ෂා කිරීමේ විකල්ප රාශියක් ඇත. මෙම වර්ණාවලියේ සෑම ලක්ෂ්‍යයක්ම පරීක්ෂා කිරීම සඳහා Polumi සතුව යාන්ත්‍රණ ඇත. අපි ආරම්භ කර එය ක්‍රියා කරන ආකාරය බලමු.

ඒකක පරීක්ෂාව

Pulumi වැඩසටහන් JavaScript, Python, TypeScript හෝ Go වැනි පොදු කාර්ය ක්‍රමලේඛන භාෂා වලින් ලියා ඇත. එබැවින්, පරීක්ෂණ රාමු ඇතුළුව, ඒවායේ මෙවලම් සහ පුස්තකාල ඇතුළු මෙම භාෂාවල සම්පූර්ණ බලය ඔවුන්ට ලබා ගත හැකිය. Pulumi බහු-වලාකුළු වේ, එයින් අදහස් වන්නේ එය ඕනෑම වලාකුළු සපයන්නෙකුගෙන් පරීක්ෂණ සඳහා භාවිතා කළ හැකි බවයි.

(මෙම ලිපියේදී, බහුභාෂා සහ බහු වලාකුළු වුවද, අපි JavaScript සහ Mocha භාවිතා කරන අතර AWS වෙත අවධානය යොමු කරමු. ඔබට Python භාවිතා කළ හැක. unittest, පරීක්ෂණ රාමුව යන්න, හෝ ඔබ කැමති වෙනත් පරීක්ෂණ රාමුවක්. තවද, ඇත්ත වශයෙන්ම, Pulumi Azure, Google Cloud, Kubernetes සමඟ විශිෂ්ට ලෙස ක්‍රියා කරයි.)

අප දැක ඇති පරිදි, ඔබට ඔබේ යටිතල පහසුකම් කේතය පරීක්ෂා කිරීමට අවශ්‍ය වීමට හේතු කිහිපයක් තිබේ. ඒවායින් එකක් වන්නේ සාම්ප්‍රදායික ඒකක පරීක්ෂාවයි. ඔබගේ කේතයට කාර්යයන් තිබිය හැකි නිසා - උදාහරණයක් ලෙස, CIDR ගණනය කිරීමට, නම්, ටැග්, ආදිය ගතිකව ගණනය කරන්න. - ඔබට ඒවා පරීක්ෂා කිරීමට අවශ්‍ය වනු ඇත. මෙය ඔබගේ ප්‍රියතම ක්‍රමලේඛන භාෂාවෙන් යෙදුම් සඳහා නිත්‍ය ඒකක පරීක්ෂණ ලිවීමට සමාන වේ.
ටිකක් සංකීර්ණ වීමට, ඔබේ වැඩසටහන සම්පත් වෙන් කරන්නේ කෙසේදැයි පරීක්ෂා කළ හැකිය. නිදර්ශනය කිරීම සඳහා, අපට සරල EC2 සේවාදායකයක් නිර්මාණය කිරීමට අවශ්‍ය යැයි සිතමු, අපට පහත සඳහන් දේ ගැන සහතික විය යුතුය:

  • නිදසුන් ටැගයක් ඇත Name.
  • අවස්ථා පේළිගත ස්ක්‍රිප්ට් භාවිතා නොකළ යුතුය userData - අපි AMI (රූපය) භාවිතා කළ යුතුය.
  • අන්තර්ජාලයට නිරාවරණය වන 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;

මෙය මූලික Pulumi වැඩසටහනයි: එය හුදෙක් EC2 ආරක්ෂක කණ්ඩායමක් සහ උදාහරණයක් වෙන් කරයි. කෙසේ වෙතත්, මෙහිදී අප ඉහත සඳහන් කළ නීති තුනම කඩ කරන බව සැලකිල්ලට ගත යුතුය. අපි පරීක්ෂණ ලියමු!

පරීක්ෂණ ලිවීම

අපගේ පරීක්ෂණවල සාමාන්‍ය ව්‍යුහය සාමාන්‍ය Mocha පරීක්ෂණ මෙන් පෙනෙනු ඇත:

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

එය සාමාන්‍ය පරීක්ෂණයක් මෙන් පෙනේ, නමුත් සඳහන් කළ යුතු විශේෂාංග කිහිපයක් සමඟ:

  • අපි යෙදවීමට පෙර සම්පතක තත්ත්වය විමසන නිසා, අපගේ පරීක්ෂණ සෑම විටම "සැලැස්ම" (හෝ "පෙරදසුන්") ආකාරයෙන් ක්‍රියාත්මක වේ. මේ අනුව, බොහෝ ගුණාංග ඇත, ඒවායේ අගයන් සරලව ලබා නොගනු ඇත හෝ නිර්වචනය නොකෙරේ. ඔබගේ වලාකුළු සපයන්නා විසින් ගණනය කරන ලද සියලුම ප්‍රතිදාන ගුණාංග මෙයට ඇතුළත් වේ. අපගේ පරීක්ෂණ සඳහා මෙය සාමාන්‍ය දෙයකි - අපි පරීක්ෂා කරන්නේ ආදාන දත්ත පමණි. ඒකාබද්ධතා පරීක්ෂණ සම්බන්ධයෙන් අපි පසුව මෙම ගැටලුව වෙත ආපසු යන්නෙමු.
  • සියලුම Pulumi සම්පත් ගුණාංග ප්‍රතිදානයන් වන අතර, ඒවායින් බොහොමයක් අසමමුහුර්තව ඇගයීමට ලක් කර ඇති බැවින්, අගයන් වෙත ප්‍රවේශ වීමට අපි අදාළ ක්‍රමය භාවිතා කළ යුතුය. මෙය පොරොන්දු සහ ක්‍රියාවට බෙහෙවින් සමාන ය then .
  • දෝෂ පණිවිඩයේ සම්පත් URN පෙන්වීමට අපි ගුණාංග කිහිපයක් භාවිතා කරන බැවින්, අපි කාර්යය භාවිතා කළ යුතුය pulumi.allඒවා ඒකාබද්ධ කිරීමට.
  • අවසාන වශයෙන්, මෙම අගයන් අසමමුහුර්තව ගණනය කර ඇති බැවින්, අපි Mocha හි බිල්ට්-ඇසින්ක් ආපසු ඇමතුම් විශේෂාංගය භාවිතා කළ යුතුය 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();
                }
            });
        });

අවසාන වශයෙන්, අපි තුන්වන පරීක්ෂණය ලියමු. මෙය තව ටිකක් සංකීර්ණ වනු ඇත, මන්ද අපි ආරක්ෂක කණ්ඩායම හා සම්බන්ධ පිවිසුම් නීති සොයමින් සිටින අතර, ඒවායින් බොහොමයක් තිබිය හැකි අතර, එම නීතිවල CIDR පරාසයන්, ඒවායින් බොහොමයක් තිබිය හැකිය. නමුත් අපි කළමනාකරණය කළේ:

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

එච්චරයි. දැන් අපි පරීක්ෂණ පවත්වමු!

ධාවන පරීක්ෂණ

බොහෝ අවස්ථාවන්හීදී, ඔබ කැමති පරීක්ෂණ රාමුව භාවිතයෙන් ඔබට සුපුරුදු ආකාරයෙන් පරීක්ෂණ ධාවනය කළ හැකිය. නමුත් අවධානය යොමු කළ යුතු පුළුමිගේ එක් අංගයක් තිබේ.
සාමාන්‍යයෙන්, Pulumi වැඩසටහන් ක්‍රියාත්මක කිරීම සඳහා, pulimi CLI (Command Line අතුරුමුහුණත) භාවිතා කරනු ලැබේ, එය භාෂා ධාවන කාලය වින්‍යාස කරයි, Pulumi එන්ජිම දියත් කිරීම පාලනය කරයි, එවිට සම්පත් සමඟ මෙහෙයුම් පටිගත කර සැලැස්මට ඇතුළත් කළ හැකිය. කෙසේ වෙතත්, එක් ගැටළුවක් තිබේ. ඔබගේ පරීක්ෂණ රාමුවේ පාලනය යටතේ ධාවනය වන විට, CLI සහ Pulumi එන්ජිම අතර සන්නිවේදනයක් සිදු නොවේ.

මෙම ගැටළුව මඟහරවා ගැනීම සඳහා, අපට පහත සඳහන් දෑ සඳහන් කිරීමට අවශ්‍ය වේ:

  • පරිසර විචල්‍යයේ අඩංගු ව්‍යාපෘති නාමය 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. Mocha පරීක්ෂණ ධාවනය සඳහා වන විධාන රේඛාව මේ ආකාරයෙන් පෙනෙනු ඇත:

    $ 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)

    සියල්ල හොඳින් සිදු විය ... හුරේ! ✓✓✓

    අදට එපමණයි, නමුත් අපි පරිවර්තනයේ දෙවන කොටසේ යෙදවීමේ පරීක්ෂණය ගැන කතා කරමු 😉

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න