Whakamatau Hanganga hei Waehere me Pulumi. Wāhanga 1

Kia ora e hoa ma. I te tatari mo te tiimata o te rerenga hou i te tere "Nga mahi me nga taputapu DevOps" Kei te tohatoha matou ki a koe he whakamaoritanga hou. Haere.

Whakamatau Hanganga hei Waehere me Pulumi. Wāhanga 1

Ma te whakamahi i te Pulumi me nga reo whakamaarama kaupapa whanui mo te waehere hanganga (Infrastructure as Code) he maha nga painga: te waatea o nga pukenga me te matauranga, te whakakore i te boilerplate i roto i te waehere ma te tangohanga, nga taputapu e mohio ana ki to roopu, penei i nga IDE me nga linters. Ko enei taputapu miihini rorohiko katoa ehara i te mea ka whai hua noa tatou, engari ka whakapai ake i te kounga o ta tatou waehere. Na reira, he mea maori noa ma te whakamahi i nga reo whakamaarama kaupapa whanui ka taea e taatau te whakauru i tetahi atu mahi whanaketanga rorohiko nui - whakamātautau.

I roto i tenei tuhinga, ka titiro tatou me pehea te awhina a Pulumi ki te whakamatautau i a maatau hanganga-hei-waehere.

Whakamatau Hanganga hei Waehere me Pulumi. Wāhanga 1

He aha te whakamatautau i nga hanganga?

I mua i te haere ki nga korero, he pai ki te patai i te patai: "He aha te whakamatautau i nga hanganga katoa?" He maha nga take mo tenei, a koinei etahi o enei:

  • Te whakamatautau i nga mahi takitahi, i nga wahanga ranei o to arorau papatono
  • Manatokohia te ahua e hiahiatia ana o te hanganga ki etahi here.
  • Te kitenga o nga hapa noa, penei i te kore whakamunatanga o te peere rokiroki, kaore ranei i parea, ka tuwhera te uru mai i te Ipurangi ki nga miihini mariko.
  • Te arowhai i te whakatinanatanga o nga hanganga hanganga.
  • Te whakahaere i te wa whakahaere mo te arorau tono e rere ana i roto i to hanganga "whakatakataka" hei tirotiro i te mahi i muri i te whakarato.
  • Kei te kite tatou, he maha nga waahanga whakamatautau mo nga hanganga. He tikanga a Polumi mo te whakamatautau i nga waahi katoa o tenei awhiowhio. Kia timata tatou ka kite pehea te mahi.

Te whakamatautau waeine

Ko nga kaupapa Pulumi ka tuhia ki nga reo whakamaarama kaupapa whanui penei i te JavaScript, Python, TypeScript, Haere ranei. Na reira, ko te mana katoa o enei reo, tae atu ki o raatau taputapu me o raatau whare pukapuka, tae atu ki nga anga whakamatautau, kei te waatea ki a raatau. Ko te Pulumi he maha-kapua, ko te tikanga ka taea te whakamahi mo te whakamatautau mai i tetahi kaiwhakarato kapua.

(I roto i tenei tuhinga, ahakoa he reo maha me te kapua maha, ka whakamahi matou i te JavaScript me te Mocha me te aro ki te AWS. Ka taea e koe te whakamahi i te Python unittest, Haere anga whakamatautau, tetahi atu anga whakamatautau ranei e pai ana koe. Ae, he pai te mahi a Pulumi me Azure, Google Cloud, Kubernetes.)

Kua kite matou, he maha nga take ka hiahia koe ki te whakamatautau i to waehere hanganga. Ko tetahi o enei ko te whakamatautau waeine tikanga. Na te mea ka whai mahi to waehere - hei tauira, ki te tatau CIDR, te tatau i nga ingoa, nga tohu, aha atu. - ka hiahia pea koe ki te whakamatau i a raatau. He rite tenei ki te tuhi i nga whakamatautau wae mo nga tono i roto i to reo hotaka tino pai.
Kia iti ake te uaua, ka taea e koe te tirotiro me pehea te tohatoha rauemi a to kaupapa. Hei whakaatu, me whakaaro tatou me hanga he tūmau EC2 ngawari me te hiahia kia mohio tatou ki enei e whai ake nei:

  • He tohu nga tauira Name.
  • Ko nga tauira me kaua e whakamahi i te tuhi-roto userData - me whakamahi he AMI (whakaahua).
  • Kaua he SSH e kitea ana ki te Ipurangi.

Ko tenei tauira kei runga taku tauira aws-js-tukutuku:

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;

Koinei te kaupapa Pulumi taketake: ka tohatoha noa i te roopu haumarutanga EC2 me tetahi tauira. Heoi ano, me tohu kei te takahia e matou nga ture e toru kua kiia ake nei. Me tuhi nga whakamatautau!

Nga whakamatautau tuhituhi

Ko te hanganga whanui o a maatau whakamatautau ka rite ki nga whakamatautau Mocha auau:

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

Inaianei me tuhi ta maatau whakamatautau tuatahi: kia mohio kei a raatau te tohu Name. Hei tirotiro i tenei ka whiwhi noa tatou i te ahanoa tauira EC2 ka tirohia nga taonga e pa ana 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();
                }
            });
        });

He rite tonu te ahua ki te whakamatautau, engari me etahi ahuatanga hei tohu:

  • Na te mea ka uiuia e matou te ahua o tetahi rauemi i mua i te tukunga, ka whakahaerehia a maatau whakamatautau ki te aratau "mahere" (he "arokite" ranei). No reira, he maha nga taonga e kore e tangohia nga uara, kaore ranei e tautuhia. Kei roto i tenei ko nga ahuatanga whakaputa katoa i tatauhia e to kaiwhakarato kapua. He mea noa tenei mo a maatau whakamatautau - ka tirohia noa e matou nga raraunga whakauru. Ka hoki ano tatou ki tenei take a muri ake nei, ina tae mai ki nga whakamatautau whakauru.
  • I te mea he putanga katoa nga taonga rauemi Pulumi, a he maha nga mea e arotakea ana i te wa kotahi, me whakamahi te tikanga tono kia uru atu ki nga uara. He tino rite tenei ki nga kupu whakaari me te mahi then .
  • I te mea kei te whakamahi tatou i nga taonga maha hei whakaatu i te rauemi URN i roto i te karere hapa, me whakamahi te mahi pulumi.allki te whakakotahi i a raatau.
  • Ka mutu, na te mea ka tatauhia enei uara, me whakamahi tatou i te waahanga waea whakahoki tukutahi a Mocha. done te whakahoki kupu taurangi ranei.

Ina oti nga mea katoa, ka whai waahi tatou ki nga whakaurunga hei uara JavaScript ngawari. Taonga tags he mapi (hoahoa hono), no reira ka tino mohio tatou he (1) karekau he teka, a (2) he matua mo Name. He tino ngawari, inaianei ka taea e taatau te whakamatautau i tetahi mea!

Inaianei me tuhi ta tatou haki tuarua. He maamaa ake:

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

Ka mutu, me tuhi te whakamatautau tuatoru. He uaua ake tenei na te mea e rapu ana matou i nga ture takiuru e pa ana ki te roopu haumaru, he maha pea, me nga awhe CIDR i roto i aua ture, he maha ano hoki. Engari i whakahaerehia e matou:

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

Heoi ano. Inaianei me whakahaere nga whakamatautau!

Te whakahaere whakamatautau

I te nuinga o nga wa, ka taea e koe te whakahaere i nga whakamatautau i roto i nga tikanga o mua, ma te whakamahi i te angamahi whakamatautau e pai ana koe. Engari tera ano tetahi ahuatanga o Pulumi e tika ana kia aro atu.
I te nuinga o te waa, ki te whakahaere i nga kaupapa Pulumi, ka whakamahia te CLI (Atanga Raina Whakahau) e whirihora ana i te waa whakahaere reo, te whakahaere i te whakarewatanga o te miihini Pulumi kia taea ai te tuhi i nga mahi me nga rauemi me te whakauru ki te mahere, me era atu. Heoi ano, kotahi te raru. I te wa e rere ana i raro i te mana o to anga whakamatautau, kaore he korero i waenga i te CLI me te miihini Pulumi.

Hei whakatika i tenei take, me tohu noa nga mea e whai ake nei:

  • Ingoa kaupapa, kei roto i te taurangi taiao PULUMI_NODEJS_PROJECT (ranei, te nuinga ake, PULUMI__PROJECT для других языков).
    Ko te ingoa o te puranga kua tohua ki te taurangi taiao PULUMI_NODEJS_STACK (ranei, te nuinga ake, PULUMI__ STACK).
    Ō taurangi whirihoranga tāpae. Ka taea te tiki ma te whakamahi i te taurangi taiao PULUMI_CONFIG a ko ta ratou whakatakotoranga he mapi JSON me nga takirua matua/uara.

    Ka tukuna e te papatono nga whakatupato e tohu ana kaore te hononga ki te CLI/miihini i te wa e mahia ana. He mea nui tenei na te mea karekau rawa to hotaka e tuku i tetahi mea, ka miharo pea mena ehara i te mea i whakaaro koe ki te mahi! Hei korero ki a Pulumi koinei tonu te mea e hiahia ana koe, ka taea e koe te whakauru PULUMI_TEST_MODE в true.

    Whakaarohia me tohu e tatou te ingoa kaupapa i roto my-ws, ingoa tāpae dev, me te Rohe AWS us-west-2. Ko te rarangi whakahau mo te whakahaere i nga whakamatautau Mocha ka penei te ahua:

    $ PULUMI_TEST_MODE=true 
        PULUMI_NODEJS_STACK="my-ws" 
        PULUMI_NODEJS_PROJECT="dev" 
        PULUMI_CONFIG='{ "aws:region": "us-west-2" }' 
        mocha tests.js

    Ma te mahi i tenei, pera i te mea e tumanakohia ana, ka whakaatu mai e toru nga whakamatautau i rahua!

    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

    Me whakatika ta tatou kaupapa:

    "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;
    

    Na ka whakahaere ano i nga whakamatautau:

    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)

    I pai nga mea katoa... Hurray! ✓✓✓

    Katoa mo tenei ra, engari ka korero tatou mo nga whakamatautau whakaurunga i te wahanga tuarua o te whakamaoritanga 😉

Source: will.com

Tāpiri i te kōrero