புலுமியுடன் உள்கட்டமைப்பைக் குறியீடாகச் சோதனை செய்தல். பகுதி 1

இனிய மதியம் நண்பர்களே. விகிதத்தில் புதிய ஓட்டம் தொடங்கும் என்ற எதிர்பார்ப்பில் "DevOps நடைமுறைகள் மற்றும் கருவிகள்" ஒரு புதிய மொழிபெயர்ப்பை உங்களுடன் பகிர்ந்து கொள்கிறோம். போ.

புலுமியுடன் உள்கட்டமைப்பைக் குறியீடாகச் சோதனை செய்தல். பகுதி 1

புலுமி மற்றும் பொது-நோக்க நிரலாக்க மொழிகளை உள்கட்டமைப்பு குறியீடு (உள்கட்டமைப்பு குறியீடு என) பயன்படுத்துவது பல நன்மைகளை வழங்குகிறது: திறன்கள் மற்றும் அறிவின் கிடைக்கும் தன்மை, சுருக்கம் மூலம் குறியீட்டில் கொதிகலன்களை நீக்குதல், உங்கள் குழுவிற்கு தெரிந்த கருவிகளான IDEகள் மற்றும் லின்டர்கள் போன்றவை. இந்த மென்பொருள் பொறியியல் கருவிகள் அனைத்தும் எங்களை அதிக உற்பத்தி செய்ய உதவுவது மட்டுமல்லாமல், எங்கள் குறியீட்டின் தரத்தையும் மேம்படுத்துகிறது. எனவே, பொது நோக்கத்திற்கான நிரலாக்க மொழிகளின் பயன்பாடு மற்றொரு முக்கியமான மென்பொருள் மேம்பாட்டு நடைமுறையை அறிமுகப்படுத்த அனுமதிக்கிறது என்பது இயற்கையானது - சோதனை.

இந்தக் கட்டுரையில், எங்கள் உள்கட்டமைப்பை-குறியீடாகச் சோதிக்க புலுமி எவ்வாறு உதவுகிறது என்பதைப் பார்ப்போம்.

புலுமியுடன் உள்கட்டமைப்பைக் குறியீடாகச் சோதனை செய்தல். பகுதி 1

உள்கட்டமைப்பை ஏன் சோதிக்க வேண்டும்?

விவரங்களுக்குச் செல்வதற்கு முன், "உள்கட்டமைப்பை ஏன் சோதிக்க வேண்டும்?" என்ற கேள்வியைக் கேட்பது மதிப்பு. இதற்கு பல காரணங்கள் உள்ளன, அவற்றில் சில இங்கே:

  • உங்கள் நிரல் தர்க்கத்தின் தனிப்பட்ட செயல்பாடுகள் அல்லது துண்டுகளின் அலகு சோதனை
  • சில கட்டுப்பாடுகளுக்கு எதிராக உள்கட்டமைப்பின் விரும்பிய நிலையைச் சரிபார்க்கிறது.
  • சேமிப்பக வாளியின் குறியாக்கமின்மை அல்லது பாதுகாப்பற்ற, இணையத்திலிருந்து மெய்நிகர் இயந்திரங்களுக்கான திறந்த அணுகல் போன்ற பொதுவான பிழைகளைக் கண்டறிதல்.
  • உள்கட்டமைப்பு வசதிகளை செயல்படுத்துவதை சரிபார்க்கிறது.
  • உங்கள் "திட்டமிடப்பட்ட" உள்கட்டமைப்பிற்குள் இயங்கும் பயன்பாட்டு தர்க்கத்தின் இயக்க நேர சோதனையைச் செய்து, வழங்குவதற்குப் பிறகு செயல்பாட்டைச் சரிபார்க்கவும்.
  • நாம் பார்க்கிறபடி, பரந்த அளவிலான உள்கட்டமைப்பு சோதனை விருப்பங்கள் உள்ளன. இந்த ஸ்பெக்ட்ரமில் ஒவ்வொரு புள்ளியிலும் சோதனை செய்வதற்கான வழிமுறைகளை பொலுமி கொண்டுள்ளது. தொடங்குவோம், அது எவ்வாறு செயல்படுகிறது என்பதைப் பார்ப்போம்.

அலகு சோதனை

புலுமி நிரல்கள் ஜாவாஸ்கிரிப்ட், பைதான், டைப்ஸ்கிரிப்ட் அல்லது கோ போன்ற பொது நோக்கத்திற்கான நிரலாக்க மொழிகளில் எழுதப்படுகின்றன. எனவே, இந்த மொழிகளின் முழு சக்தி, அவற்றின் கருவிகள் மற்றும் நூலகங்கள், சோதனை கட்டமைப்புகள் உட்பட, அவர்களுக்குக் கிடைக்கும். புலுமி பல கிளவுட் ஆகும், அதாவது இது எந்த கிளவுட் வழங்குநரிடமிருந்தும் சோதனைக்கு பயன்படுத்தப்படலாம்.

(இந்த கட்டுரையில், பன்மொழி மற்றும் மல்டிகிளவுட் இருந்தாலும், நாங்கள் ஜாவாஸ்கிரிப்ட் மற்றும் மோச்சாவைப் பயன்படுத்துகிறோம், மேலும் AWS இல் கவனம் செலுத்துகிறோம். நீங்கள் பைத்தானைப் பயன்படுத்தலாம். 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;

இது அடிப்படை புலுமி திட்டம்: இது ஒரு 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 .
  • பிழை செய்தியில் ஆதார 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();
                }
            });
        });

அவ்வளவுதான். இப்போது சோதனைகளை நடத்துவோம்!

இயங்கும் சோதனைகள்

பெரும்பாலான சந்தர்ப்பங்களில், உங்கள் விருப்பப்படி சோதனை கட்டமைப்பைப் பயன்படுத்தி வழக்கமான முறையில் சோதனைகளை இயக்கலாம். ஆனால் புலுமியின் ஒரு அம்சம் கவனிக்கத்தக்கது.
பொதுவாக, புலுமி நிரல்களை இயக்க, புலிமி சிஎல்ஐ (கட்டளை வரி இடைமுகம்) பயன்படுத்தப்படுகிறது, இது மொழி இயக்க நேரத்தை கட்டமைக்கிறது, புலுமி இயந்திரத்தின் வெளியீட்டைக் கட்டுப்படுத்துகிறது, இதனால் ஆதாரங்களுடன் செயல்பாடுகள் பதிவு செய்யப்பட்டு திட்டத்தில் சேர்க்கப்படலாம். இருப்பினும், ஒரு சிக்கல் உள்ளது. உங்கள் சோதனை கட்டமைப்பின் கட்டுப்பாட்டின் கீழ் இயங்கும் போது, ​​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. மோச்சா சோதனைகளை இயக்குவதற்கான கட்டளை வரி இப்படி இருக்கும்:

    $ 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

கருத்தைச் சேர்