เบชเบฐเบเบฒเบเบเบตเบเบญเบเบเปเบฒเบเบซเบกเบนเปเปเบเบทเปเบญเบ. เปเบเบเบงเบฒเบกเบเบฒเบเบซเบงเบฑเบเบเบญเบเบเบฒเบเปเบฅเบตเปเบกเบเบปเปเบเบเบญเบเบเบฒเบเปเบซเบผเปเบเบปเปเบฒเปเบซเบกเปเปเบเบญเบฑเบเบเบฒ
เบเบฒเบเบเปเบฒเปเบเปเบเบฒเบชเบฒ Pulumi เปเบฅเบฐเบเบฒเบชเบฒเบเบฒเบเบเบฝเบเปเบเบฅเปเบเบฅเบกเบเบปเปเบงเปเบเบชเปเบฒเบฅเบฑเบเบฅเบฐเบซเบฑเบเปเบเบเบชเปเบฒเบเบเบทเปเบเบเบฒเบ (Infrastructure as Code) เบชเบฐเบซเบเบญเบเบเบปเบเบเบฐเปเบซเบเบเบซเบผเบฒเบเบขเปเบฒเบ: เบเบฑเบเบชเบฐเปเบฅเบฐเบเบงเบฒเบกเบฎเบนเป, เบเบฒเบเบเปเบฒเบเบฑเบ boilerplate เปเบเบฅเบฐเบซเบฑเบเปเบเบเบเปเบฒเบเบเบฒเบ abstraction, เปเบเบทเปเบญเบเบกเบทเบเบตเปเบเบธเปเบเปเบเบตเบเบเบฑเบเบเบตเบกเบเบฒเบเบเบญเบเบเปเบฒเบเปเบเบฑเปเบ IDEs เปเบฅเบฐ linters. เปเบเบทเปเบญเบเบกเบทเบงเบดเบชเบฐเบงเบฐเบเปเบฒเบเบญเบเปเบงเบเบฑเบเบซเบกเบปเบเปเบซเบผเบปเปเบฒเบเบตเปเบเปเปเบเบฝเบเปเบเปเปเบฎเบฑเบเปเบซเปเบเบงเบเปเบฎเบปเบฒเบกเบตเบเบปเบเบเบฐเบฅเบดเบเบซเบผเบฒเบ, เปเบเปเบเบฑเบเบเบฑเบเบเบธเบเบเบธเบเบเบฐเบเบฒเบเบเบญเบเบฅเบฐเบซเบฑเบเบเบญเบเบเบงเบเปเบฎเบปเบฒ. เบเบฑเปเบเบเบฑเปเบ, เบกเบฑเบเปเบเบฑเบเปเบฅเบทเปเบญเบเบเปเบฒเบกเบฐเบเบฒเบเบเบตเปเบเบฒเบเบเปเบฒเปเบเปเบเบฒเบชเบฒเบเบฒเบเบเบฝเบเปเบเบฅเปเบเบฅเบกเบเบปเปเบงเปเบเบเปเบงเบเปเบซเปเบเปเบฒเบเบชเบฒเบกเบฒเบเปเบเบฐเบเปเบฒเบเบฒเบเบเบฐเบเบดเบเบฑเบเบเบฒเบเบเบฑเบเบเบฐเบเบฒเบเบญเบเปเบงเบเบตเปเบชเปเบฒเบเบฑเบเบญเบตเบเบญเบฑเบเบซเบเบถเปเบ - เบเบฒเบเบเบปเบเบชเบญเบ.
เปเบเบเบปเบเบเบงเบฒเบกเบเบตเป, เบเบงเบเปเบฎเบปเบฒเบเบฐเปเบเบดเปเบเบงเบดเบเบตเบเบตเป Pulumi เบเปเบงเบเบเบงเบเปเบฎเบปเบฒเบเบปเบเบชเบญเบเปเบเบเบชเปเบฒเบเบเบทเปเบเบเบฒเบเบเบญเบเบเบงเบเปเบฎเบปเบฒ.
เปเบเบฑเบเบซเบเบฑเบเบเปเบญเบเบเบปเบเบชเบญเบเปเบเบเบชเปเบฒเบเบเบทเปเบเบเบฒเบ?
เบเปเบญเบเบเบตเปเบเบฐเปเบเบปเปเบฒเปเบเปเบเบฅเบฒเบเบฅเบฐเบญเบฝเบ, เบกเบฑเบเปเบเบฑเบเบกเบนเบเบเปเบฒเบเบตเปเบเบฐเบเบฒเบกเบเปเบฒเบเบฒเบก: "เปเบเบฑเบเบซเบเบฑเบเบเบฒเบเบเบปเบเบชเบญเบเปเบเบเบชเปเบฒเบเบเบทเปเบเบเบฒเบเบเบฑเบเบซเบกเบปเบ?" เบกเบตเบซเบผเบฒเบเปเบซเบเบเบปเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบตเปเปเบฅเบฐเบเบตเปเปเบกเปเบเบเบฒเบเบชเปเบงเบเบเบญเบเบเบงเบเปเบเบปเบฒ:
- เบเบฒเบเบเบปเบเบชเบญเบเบซเบเปเบงเบเบเบฒเบเบเบญเบเปเบเปเบฅเบฐเบซเบเปเบฒเบเบตเปเบซเบผเบทเบเบดเปเบเบชเปเบงเบเบเบญเบเปเบซเบเบเบปเบเบเบญเบเปเบเบผเปเบเบผเบกเบเบญเบเบเปเบฒเบ
- เบขเบทเบเบขเบฑเบเบชเบฐเบเบฒเบเบฐเบเบตเปเบเปเบญเบเบเบฒเบเบเบญเบเปเบเบเบชเปเบฒเบเบเบทเปเบเบเบฒเบเบเปเปเบเบฑเบเบเปเปเบเปเบฒเบเบฑเบเบเบฒเบเบขเปเบฒเบ.
- เบเบฒเบเบเบงเบเบชเบญเบเบเบงเบฒเบกเบเบดเบเบเบฒเบเบเบปเปเบงเปเบ, เปเบเบฑเปเบ: เบเบฒเบเบเบฒเบเบเบฒเบเปเบเบปเปเบฒเบฅเบฐเบซเบฑเบเบเบญเบเบเบฑเบเปเบเบฑเบเบเปเปเบกเบนเบเบซเบผเบทเบเปเปเบกเบตเบเบฒเบเบเปเบญเบเบเบฑเบ, เปเบเบตเบเบเบฒเบเปเบเบปเปเบฒเปเบเบดเบเบเบฒเบเบญเบดเบเปเบเบตเปเบเบฑเบเปเบเบซเบฒเปเบเบทเปเบญเบ virtual.
- เบเบงเบโเบเบฒโเบเบฒเบโเบเบฐโเบเบดโเบเบฑเบโเบเบฒเบโเบเบฑเบโเบซเบฒโเบเบทเปเบโเบเบฒเบโเปเบเบโเบฅเปเบฒเบ.
- เบเบฐเบเบดเบเบฑเบเบเบฒเบเบเบปเบเบชเบญเบ runtime เบเบญเบเปเบซเบเบเบปเบเบเบญเบเปเบญเบฑเบเบเบฅเบดเปเบเบเบฑเบเบเบตเปเปเบฎเบฑเบเบงเบฝเบเบขเบนเปเปเบเปเบเบเบชเปเบฒเบเบเบทเปเบเบเบฒเบ "เปเบเบเบเบฒเบ" เบเบญเบเบเปเบฒเบเปเบเบทเปเบญเบเบงเบเปเบเบดเปเบเบเบฒเบเปเบฎเบฑเบเบงเบฝเบเบซเบผเบฑเบเบเบฒเบเบเบฒเบเบชเบฐเบซเบเบญเบ.
- เบเบฑเปเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเบชเบฒเบกเบฒเบเปเบซเบฑเบเปเบเป, เบกเบตเบเบฒเบเปเบฅเบทเบญเบเปเบเบเบฒเบเบเบปเบเบชเบญเบเปเบเบเบชเปเบฒเบเบเบทเปเบเบเบฒเบเบเบตเปเบเบงเปเบฒเบเบเบงเบฒเบ. Polumi เบกเบตเบเบปเบเปเบเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบปเบเบชเบญเบเปเบเบเบธเบเบเบธเบเบเปเบฝเบงเบเบฑเบ spectrum เบเบตเป. เปเบซเปเปเบฅเบตเปเบกเบเบปเปเบเปเบฅเบฐเปเบเบดเปเบเบงเปเบฒเบกเบฑเบเปเบฎเบฑเบเบงเบฝเบเปเบเบงเปเบ.
เบเบฒเบโเบเบปเบโเบชเบญเบโเบซเบปเบงโเบซเบเปเบงเบโ
เปเบเบฅเปเบเบฅเบก Pulumi เบเบทเบเบเบฝเบเปเบงเปเปเบเบเบฒเบชเบฒเบเบฒเบเบเบฝเบเปเบเบฅเปเบเบฅเบกเบเบปเปเบงเปเบเปเบเบฑเปเบ JavaScript, Python, TypeScript เบซเบผเบท Go. เบเบฑเปเบเบเบฑเปเบ, เบเบฐเบฅเบฑเบเบเบฒเบเบญเบฑเบเปเบเบฑเบกเบเบตเปเบเบญเบเบเบฒเบชเบฒเปเบซเบผเบปเปเบฒเบเบตเป, เบฅเบงเบกเบเบฑเบเปเบเบทเปเบญเบเบกเบทเปเบฅเบฐเบซเปเบญเบเบชเบฐเบซเบกเบธเบเบเบญเบเปเบเบปเบฒเปเบเบปเปเบฒ, เบฅเบงเบกเบเบฑเบเบเบญเบเบเบฒเบเบเบปเบเบชเบญเบ, เปเบกเปเบเบกเบตเปเบซเปเปเบเบปเบฒเปเบเบปเปเบฒ. Pulumi เปเบกเปเบเบซเบผเบฒเบเบเบฅเบฒเบง, เบเบถเปเบเบซเบกเบฒเบเบเบงเบฒเบกเบงเปเบฒเบกเบฑเบเบชเบฒเบกเบฒเบเบเบทเบเบเปเบฒเปเบเปเบชเปเบฒเบฅเบฑเบเบเบฒเบเบเบปเบเบชเบญเบเบเบฒเบเบเบนเปเปเบซเปเบเปเบฅเบดเบเบฒเบเบเบฑเบเปเบเป.
(เปเบเบเบปเบเบเบงเบฒเบกเบเบตเป, เปเบเบดเบเบงเปเบฒเบเบฐเบกเบตเบซเบผเบฒเบเบเบฒเบชเบฒเปเบฅเบฐ multicloud, เบเบงเบเปเบฎเบปเบฒเปเบเป JavaScript เปเบฅเบฐ Mocha เปเบฅเบฐเบชเบธเบกเปเบชเป AWS. เบเปเบฒเบเบชเบฒเบกเบฒเบเบเปเบฒเปเบเป Python. unittest
, เปเบเบเบญเบเบเบฒเบเบเบปเบเบชเบญเบ, เบซเบผเบทเบเบญเบเบเบฒเบเบเบปเบเบชเบญเบเบญเบทเปเบเปเบเบตเปเบเปเบฒเบเบเปเบญเบเบเบฒเบ. เปเบฅเบฐ, เปเบเปเบเบญเบ, Pulumi เปเบฎเบฑเบเบงเบฝเบเปเบเปเบเบตเบเบฑเบ Azure, Google Cloud, Kubernetes.)
เบเบฑเปเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเปเบเปเปเบซเบฑเบ, เบกเบตเบซเบผเบฒเบเปเบซเบเบเบปเบเบงเปเบฒเปเบเบฑเบเบซเบเบฑเบเบเปเบฒเบเบญเบฒเบเบเบฐเบเปเบญเบเบเบฒเบเบเบปเบเบชเบญเบเบฅเบฐเบซเบฑเบเปเบเบเบชเปเบฒเบเบเบทเปเบเบเบฒเบเบเบญเบเบเปเบฒเบ. เบซเบเบถเปเบเปเบเบเบฑเปเบเปเบกเปเบเบเบฒเบเบเบปเบเบชเบญเบเบซเบเปเบงเบเบเบฒเบเปเบเบเบเบฑเปเบเปเบเบตเบก. เปเบเบทเปเบญเบเบเบฒเบเบงเปเบฒเบฅเบฐเบซเบฑเบเบเบญเบเบเปเบฒเบเบญเบฒเบเบกเบตเบซเบเปเบฒเบเบตเป - เบเบปเบงเบขเปเบฒเบ, เปเบเบทเปเบญเบเบดเบเปเบฅเป CIDR, เบเบดเบเปเบฅเปเปเบเบเปเบเบเบฒเบกเบดเบเบเบทเป, tags, เปเบฅเบฐเบญเบทเปเบเป. - เบเปเบฒเบโเบญเบฒเบโเบเบฐโเบเปเบญเบโเบเบฒเบโเบเบตเปโเบเบฐโเบเบปเบโเบชเบญเบโเปเบซเปโเปเบเบปเบฒโเปเบเบปเปเบฒโ. เบเบตเปเปเบกเปเบเบเบทเบเบฑเบเบเบฑเบเบเบฒเบเบเบฝเบเบเบฒเบเบเบปเบเบชเบญเบเบซเบเปเบงเบเบเบฒเบเบเบปเบเบเบฐเบเบดเบชเปเบฒเบฅเบฑเบเบเปเบฒเบฎเปเบญเบเบชเบฐเบซเบกเบฑเบเปเบเบเบฒเบชเบฒเบเบฒเบเบเบฝเบเปเบเบผเปเบเบผเบกเบเบตเปเบเปเบฒเบเบกเบฑเบ.
เปเบเบทเปเบญเปเบซเปเบกเบตเบเบงเบฒเบกเบชเบฑเบเบชเบปเบเบซเบผเบฒเบ, เบเปเบฒเบเบชเบฒเบกเบฒเบเบเบงเบเปเบเบดเปเบเบงเปเบฒเปเบเบเบเบฒเบเบเบญเบเบเปเบฒเบเบเบฑเบเบชเบฑเบเบเบฑเบเบเบฐเบเบฒเบเบญเบเปเบเบงเปเบ. เปเบเบทเปเบญเบชเบฐเปเบเบเปเบซเปเปเบซเบฑเบ, เปเบซเปเบเบดเบเบเบฐเบเบฒเบเบฒเบเบงเปเบฒเบเบงเบเปเบฎเบปเบฒเบเปเบฒเปเบเบฑเบเบเปเบญเบเบชเปเบฒเบเปเบเบทเปเบญเบเปเบกเปเบเปเบฒเบ EC2 เบเปเบฒเบเบเบฒเบเปเบฅเบฐเบเบงเบเปเบฎเบปเบฒเบเปเบญเบเบเบฒเบเปเบซเปเปเบเปเปเบเบงเปเบฒเบเปเปเปเบเบเบตเป:
- เบเบปเบงเบขเปเบฒเบเบกเบตเปเบเบฑเบ
Name
. - Instances เบเปเปเบเบงเบเปเบเป inline script
userData
- เบเบงเบเปเบฎเบปเบฒเบเปเบญเบเปเบเป AMI (เบฎเบนเบเบเบฒเบ). - เบเปเปเบเบงเบเบกเบต 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;
เบเบตเปเปเบกเปเบเปเบเบเบเบฒเบ 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, ะพัะบัััะพะณะพ ะฒ ะะฝัะตัะฝะตั.
});
});
เบเบญเบเบเบตเปเปเบซเปเบเบงเบเปเบฎเบปเบฒเบเบฝเบเบเบฒเบเบเบปเบเบชเบญเบเบเบฑเปเบเบเปเบฒเบญเบดเบเบเบญเบเบเบงเบเปเบฎเบปเบฒ: เปเบซเปเปเบเปเปเบเบงเปเบฒ instances เบกเบต tag 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
เปเบเบทเปเบญเบชเบปเบกเบเบปเบเบเบงเบเบกเบฑเบ. - เบชเบธเบเบเปเบฒเบ, เบเบฑเบเบเบฑเปเบเปเบเปเบเปเบฒเปเบซเบผเบปเปเบฒเบเบตเปเบเบทเบเบเบดเบเปเบฅเปเปเบเบ asynchronous, เบเบงเบเปเบฎเบปเบฒเบเปเบฒเปเบเบฑเบเบเปเบญเบเปเบเปเบเบธเบเบชเบปเบกเบเบฑเบเบเบฒเบเปเบเบเบฑเบ async เบเบฒเบเปเบเบเบปเบงเบเบญเบ Mocha.
done
เบซเบผเบทเบเบฑเบเบเบทเบเบเปเบฒเบชเบฑเบเบเบฒ.
เปเบกเบทเปเบญเบเบงเบเปเบฎเบปเบฒเบเบฑเปเบเบเปเบฒเบเบธเบเบขเปเบฒเบเปเบฅเปเบง, เบเบงเบเปเบฎเบปเบฒเบเบฐเบกเบตเบเบฒเบเปเบเบปเปเบฒเปเบเบดเบเบเบฒเบเบเปเบญเบเบเปเปเบกเบนเบเปเบเบฑเบเบเปเบฒ JavaScript เบเบตเปเบเปเบฒเบเบเบฒเบ. เบเบธเบโเบชเบปเบกโเบเบฑเบ 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 เบเบตเปเบเบงเบเปเบญเบปเบฒเปเบเปเบชเป.
เปเบเบเบเบปเบเบเบฐเบเบด, เปเบเบทเปเบญเบเปเบฒเปเบเบตเบเปเบเบเบเบฒเบ Pulumi, pulimi CLI (เบเบฒเบเปเบเปเบเบญเบเบชเบฒเบเบเปเบฒเบชเบฑเปเบ) เบเบทเบเบเปเบฒเปเบเป, เปเบเบดเปเบเบเปเบฒเบเบปเบเปเบงเบฅเบฒเปเบฅเปเบเบเบฒเบชเบฒ, เบเบงเบเบเบธเบกเบเบฒเบเปเบเบตเบเบเบปเบงเบเบญเบเปเบเบทเปเบญเบเบเบฑเบ Pulumi เปเบเบทเปเบญเปเบซเปเบเบฒเบเบเปเบฒเปเบเบตเบเบเบฒเบเบเบฑเบเบเบฑเบเบเบฐเบเบฒเบเบญเบเบชเบฒเบกเบฒเบเบเบทเบเบเบฑเบเบเบถเบเปเบงเปเปเบฅเบฐเบฅเบงเบกเบขเบนเปเปเบเปเบเบเบเบฒเบ, เปเบฅเบฐเบญเบทเปเบเป. เบขเปเบฒเบเปเบเบเปเบเบฒเบก, เบกเบตเบเบฑเบเบซเบฒเบซเบเบถเปเบ. เปเบกเบทเปเบญเบเปเบฒเปเบเบตเบเบเบฒเบเบเบฒเบเปเบเปเบเบฒเบเบเบงเบเบเบธเบกเบเบญเบเบเบญเบเบเบฒเบเบเบปเบเบชเบญเบเบเบญเบเบเปเบฒเบ, เบเบฐเบเปเปเบกเบตเบเบฒเบเบชเบทเปเบชเบฒเบเบฅเบฐเบซเบงเปเบฒเบ CLI เปเบฅเบฐเปเบเบทเปเบญเบเบเบฑเบ Pulumi.
เปเบเบทเปเบญเปเบเปเปเบเบเบฑเบเบซเบฒเบเบตเป, เบเบงเบเปเบฎเบปเบฒเบเบฝเบเปเบเปเบเปเบญเบเบเบฒเบเบฅเบฐเบเบธเบเบฑเปเบเบเปเปเปเบเบเบตเป:
- เบเบทเปเปเบเบเบเบฒเบ, เปเบเบดเปเบเบเบฑเบเบเบธเบขเบนเปเปเบเบเบปเบงเปเบเบชเบฐเบเบฒเบเปเบงเบเบฅเปเบญเบก
PULUMI_NODEJS_PROJECT
(เบซเบผเบท, เปเบเบเบเบปเปเบงเปเบเปเบฅเปเบง,PULUMI__PROJECT ะดะปั ะดััะณะธั ัะทัะบะพะฒ).
เบเบทเปเบเบญเบ stack เบเบตเปเบฅเบฐเบเบธเปเบงเปเปเบเบเบปเบงเปเบเบชเบฐเบเบฒเบเปเบงเบเบฅเปเบญเบกPULUMI_NODEJS_STACK
(เบซเบผเบท, เปเบเบเบเบปเปเบงเปเบเปเบฅเปเบง,PULUMI__ STACK).
เบเบปเบงเปเบเบเบฒเบเบเบฑเปเบเบเปเบฒ stack เบเบญเบเบเปเบฒเบ. เบเบงเบเปเบเบปเบฒเบชเบฒเบกเบฒเบเปเบเปเบฎเบฑเบเปเบเบเปเบเปเบเบปเบงเปเบเบชเบฐเบเบฒเบเปเบงเบเบฅเปเบญเบกPULUMI_CONFIG
เปเบฅเบฐเบฎเบนเบเปเบเบเบเบญเบเบเบงเบเบกเบฑเบเปเบกเปเบเปเบเบเบเบตเป JSON เบเบตเปเบกเบตเบเบนเปเบเบต/เบเปเบฒ.เปเบเบโเบเบฒเบโเบเบฐโเบญเบญเบโเบเปเบฒโเปเบเบทเบญเบโเบเบตเปโเบเบตเปโเบเบญเบโเบงเปเบฒโเบเบฒเบโเปเบเบทเปเบญเบกโเบเปเปโเบเบฑเบ CLI / เปเบเบทเปเบญเบโเบเบฑเบโเปเบกเปเบโเบเปเปโเบกเบตโเปเบโเบฅเบฐโเบซเบงเปเบฒเบโเบเบฒเบโเบเบฐโเบเบดโเบเบฑเบโ. เบเบตเปเปเบกเปเบเบชเบดเปเบเบชเปเบฒเบเบฑเบเปเบเบฒเบฐเบงเปเบฒเปเบเบเบเบฒเบเบเบญเบเปเบเบปเปเบฒเบเบฐเบเปเปเบเบทเบเบเปเบฒเปเบเปเบเปเบซเบเบฑเบเปเบฅเบตเบ เปเบฅเบฐเบกเบฑเบเบญเบฒเบเบเบฐเปเบเบฑเบเปเบฅเบทเปเบญเบเปเบเบเบเบตเปเบเปเบฒเบงเปเบฒเบเบฑเปเบเบเปเปเปเบกเปเบเบชเบดเปเบเบเบตเปเบเปเบฒเบเบเบฑเปเบเปเบเบเบฐเปเบฎเบฑเบ! เปเบเบทเปเบญเบเบญเบ Pulumi เบงเปเบฒเบเบตเปเปเบกเปเบเบชเบดเปเบเบเบตเปเบเปเบฒเบเบเปเบญเบเบเบฒเบ, เบเปเบฒเบเบชเบฒเบกเบฒเบเบเบดเบเบเบฑเปเบเปเบเป
PULUMI_TEST_MODE
ะฒtrue
.เบเบดเบเบเบฐเบเบฒเบเบฒเบเบเบตเปเบเบงเบเปเบฎเบปเบฒเบเปเบฒเปเบเบฑเบเบเปเบญเบเบฅเบฐเบเบธเบเบทเปเปเบเบเบเบฒเบเปเบ
my-ws
, เบเบทเป stackdev
, เปเบฅเบฐ AWS Regionus-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)
เบเบธเบเบขเปเบฒเบเบเปเบฒเบเปเบเบเปเบงเบเบเบต... Hurray! โโ
เบเบฑเปเบเปเบกเปเบเบเบฑเบเบซเบกเบปเบเบชเปเบฒเบฅเบฑเบเบกเบทเปเบเบตเป, เปเบเปเบเบงเบเปเบฎเบปเบฒเบเบฐเปเบงเบปเปเบฒเบเปเบฝเบงเบเบฑเบเบเบฒเบเบเบปเบเบชเบญเบเบเบฒเบเบเปเบฒเปเบเปเปเบเบเบฒเบเบเบตเบชเบญเบเบเบญเบเบเบฒเบเปเบเบเบฒเบชเบฒ ๐
เปเบซเบผเปเบเบเปเปเบกเบนเบ: www.habr.com