ደህና ከሰአት ጓደኞች። በመጠኑ ላይ አዲስ ፍሰት መጀመርን በመጠባበቅ ላይ
ለመሠረተ ልማት ኮድ (መሠረተ ልማት እንደ ኮድ) ፑሉሚ እና አጠቃላይ ዓላማ የፕሮግራም ቋንቋዎችን መጠቀም ብዙ ጥቅሞችን ይሰጣል-የችሎታ እና የእውቀት መገኘት ፣ በኮዱ ውስጥ የቦይለር ሰሌዳን በአብስትራክት ማስወገድ ፣ ለቡድንዎ የሚያውቋቸው እንደ አይዲኢዎች እና ሊንተሮች ያሉ። እነዚህ ሁሉ የሶፍትዌር ምህንድስና መሳሪያዎች የበለጠ ምርታማ እንድንሆን ብቻ ሳይሆን የኮድ ጥራትንም ያሻሽላሉ። ስለዚህ አጠቃላይ ዓላማ ያላቸውን የፕሮግራም ቋንቋዎች መጠቀማችን ሌላ አስፈላጊ የሶፍትዌር ልማት ልምምዶችን እንድናስተዋውቅ መፍቀዱ ተፈጥሯዊ ነው። መሞከር.
በዚህ ጽሑፍ ውስጥ ፑሉሚ የእኛን መሠረተ ልማት-እንደ-ኮድ ለመፈተሽ እንዴት እንደሚረዳን እንመለከታለን።
መሠረተ ልማት ለምን ይፈትሻል?
ወደ ዝርዝር ሁኔታ ከመሄዳችን በፊት ጥያቄውን መጠየቅ ተገቢ ነው-“መሠረተ ልማት ለምን ይፈትሻል?” ለዚህ ብዙ ምክንያቶች አሉ እና ከእነዚህ ውስጥ ጥቂቶቹ እነሆ፡-
- የግለሰብ ተግባራትን ወይም የፕሮግራም ሎጂክ ቁርጥራጭ አሃድ ሙከራ
- የተፈለገውን የመሠረተ ልማት ሁኔታ ከተወሰኑ ገደቦች ጋር ያረጋግጣል.
- እንደ ማከማቻ ባልዲ ምስጠራ አለመኖር ወይም ጥበቃ ያልተደረገለት፣ ከኢንተርኔት ወደ ቨርቹዋል ማሽኖች ክፍት መዳረሻን የመሳሰሉ የተለመዱ ስህተቶችን ማወቅ።
- የመሠረተ ልማት አቅርቦትን ትግበራ ማረጋገጥ.
- ከተሰጠ በኋላ ተግባራዊነቱን ለማረጋገጥ በእርስዎ “ፕሮግራም በተዘጋጀው” መሠረተ ልማት ውስጥ የሚሰራ የመተግበሪያ ሎጂክ የሩጫ ጊዜ ሙከራን በማካሄድ ላይ።
- እንደምናየው, ሰፊ የመሠረተ ልማት ሙከራ አማራጮች አሉ. ፖሉሚ በዚህ ስፔክትረም ላይ በእያንዳንዱ ነጥብ ላይ ለመፈተሽ ዘዴዎች አሉት. እንጀምር እና እንዴት እንደሚሰራ እንይ።
የክፍል ሙከራ
የፑሉሚ ፕሮግራሞች እንደ ጃቫ ስክሪፕት ፣ ፓይዘን ፣ ታይፕ ስክሪፕት ወይም ጎ ባሉ አጠቃላይ ዓላማ የፕሮግራም ቋንቋዎች የተፃፉ ናቸው። ስለዚህ፣ የእነዚህ ቋንቋዎች ሙሉ ኃይል፣ መሳሪያዎቻቸውን እና ቤተ-መጻሕፍትን ጨምሮ፣ የሙከራ ማዕቀፎችን ጨምሮ፣ ለእነሱ ይገኛል። ፑሉሚ ብዙ ደመና ነው፣ ይህ ማለት ከማንኛውም የደመና አቅራቢ ለሙከራ ሊያገለግል ይችላል።
(በዚህ ጽሁፍ ብዙ ቋንቋ ተናጋሪዎች እና ብዙ ደመናዎች ብንሆንም ጃቫ ስክሪፕት እና ሞቻን እንጠቀማለን እና በAWS ላይ እናተኩራለን። Pythonን መጠቀም ይችላሉ። unittest
ሂድ የሙከራ ማዕቀፍ ወይም ሌላ የሚወዱትን የፍተሻ ማዕቀፍ። እና በእርግጥ ፑሉሚ በአዙሬ፣ ጎግል ክላውድ፣ ኩበርኔትስ ጥሩ ይሰራል።)
እንዳየነው የመሠረተ ልማት ኮድዎን ለመፈተሽ የሚፈልጓቸው በርካታ ምክንያቶች አሉ። ከመካከላቸው አንዱ የተለመደው የዩኒት ሙከራ ነው. ኮድዎ ተግባራት ሊኖሩት ስለሚችል - ለምሳሌ ሲዲአርን ለማስላት በተለዋዋጭ ስሞችን፣ መለያዎችን፣ ወዘተ. - ምናልባት እነሱን ለመፈተሽ ይፈልጉ ይሆናል. ይህ በሚወዱት የፕሮግራም አወጣጥ ቋንቋ መደበኛ የክፍል ፈተናዎችን ከመጻፍ ጋር ተመሳሳይ ነው።
ትንሽ ውስብስብ ለመሆን፣ ፕሮግራምዎ እንዴት ሀብቶችን እንደሚመድብ ማረጋገጥ ይችላሉ። በምሳሌ ለማስረዳት፣ ቀላል EC2 አገልጋይ መፍጠር እንዳለብን እናስብ እና የሚከተሉትን እርግጠኛ መሆን እንፈልጋለን።
- ምሳሌዎች መለያ አላቸው።
Name
. - ምሳሌዎች የውስጠ-መስመር ስክሪፕት መጠቀም የለባቸውም
userData
- ኤኤምአይ (ምስል) መጠቀም አለብን። - ለኢንተርኔት የተጋለጠ SSH መኖር የለበትም።
ይህ ምሳሌ ላይ የተመሠረተ ነው
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