ืืื ื ืึธืืืืืึธื ืคืจืืื ื. ืืื ืึทื ืืืกืึทืคึผืืืฉืึทื ืคืื ืื ืึธื ืืืื ืคืื ืึท ื ืืึท ืืืืคื ืืื ืืขื ืงืืจืก
ื ืืฆื Pulumi ืืื ืืขื ืขืจืึทื-ืฆืืืขืง ืคึผืจืึธืืจืึทืืืื ื ืฉืคึผืจืึทืื ืคึฟืึทืจ ืื ืคืจืึทืกืืจืึทืงืืฉืขืจ ืงืึธื (ืื ืคืจืึทืกืืืจืึทืงืืฉืขืจ ืืื ืงืึธื) ืืื ืคืืืข ืึทืืืืึทื ืืืืืฉืื: ืื ืึทืืืืืืึทืืืืึทืื ืคืื ืกืงืืื ืืื ืืืืกื, ืืืืืึทื ืืืฉืึทื ืคืื ืงืขืกื ืคึผืืึทืืข ืืื ืื ืงืึธื ืืืจื ืึทืืกืืจืึทืงืฆืืข, ืืืฉืืจืื ืืึทืงืึทื ื ืฆื ืืืื ืืึทื ืฉืึทืคึฟื, ืึทืืึท ืืื IDE ืืื ืืืืขืจื. ืึทืืข ืื ืืืืืืืืืจื ืื ืืฉืขื ืืขืจืืข ืืืฉืืจืื ืืึทืื ืืื ืื ื ืื ืืืืื ืืขืจ ืคึผืจืึธืืืงืืืื, ืึธืืขืจ ืืืื ืคึฟืึทืจืืขืกืขืจื ืื ืงืืืึทืืืืขื ืคืื ืืื ืืืขืจ ืงืึธื. ืืขืจืืืขืจ, ืขืก ืืื ื ืึธืจ ื ืึทืืืจืืขื ืึทื ืื ื ืืฆื ืคืื ืืขื ืขืจืึทื-ืฆืื ืคึผืจืึธืืจืึทืืืื ื ืฉืคึผืจืึทืื ืึทืืึทืื ืืื ืื ืฆื ืืึทืงืขื ืขื ืื ืื ืืขืจ ืืืืืืืง ืืืืืืืืืจื ืึทื ืืืืืงืืื ื ืคืืจ - ืืขืกืืื ื.
ืืื ืืขื ืึทืจืืืงื, ืืืจ ืืืขืื ืงืืงื ืืื Pulumi ืืขืืคึผืก ืืื ืื ืคึผืจืืืืจื ืืื ืืืขืจ ืื ืคืจืึทืกืืจืึทืงืืฉืขืจ-ืืื-ืงืึธื.
ืคืืจืืืืก ืคึผืจืืืืจื ืื ืคืจืึทืกืืจืึทืงืืฉืขืจ?
ืืืืืขืจ ืืืจ ืืืื ืืื ืืขืืึทื, ืขืก ืืื ืืืขืจื ืฆื ืคืจืขืื ืื ืงืฉืื: "ืคืืจืืืืก ืคึผืจืืืืจื ืื ืคืจืึทืกืืจืึทืงืืฉืขืจ ืืื ืึทืืข?" ืขืก ืืขื ืขื ืคืืืข ืกืืืืช ืคึฟืึทืจ ืืขื ืืื ืืึธ ืืขื ืขื ืขืืืขืืข ืคืื โโืืื:
- ืึทืคึผืึทืจืึทื ืืขืกืืื ื ืคืื ืืืื ืคืึทื ืืงืฉืึทื ื ืึธืืขืจ ืคืจืึทืืืึทื ืฅ ืคืื ืืืื ืคึผืจืึธืืจืึทื ืืึธืืืง
- ืืืขืจืึทืคืืื ืื ืืขืืืืื ืฉืืึทื ืคืื ืื ืื ืคืจืึทืกืืจืึทืงืืฉืขืจ ืงืขืื ืืืืขืจ ืงืึทื ืกืืจืืื ืฅ.
- ืืืืขืงืฉืึทื ืคืื ืคึผืจืึธืกื ืขืจืจืึธืจืก, ืึทืืึท ืืื ืึท ืคืขืื ืคืื ืขื ืงืจืืคึผืฉืึทื ืคืื ืึท ืกืืึธืจืืืืฉ ืขืืขืจ ืึธืืขืจ ืึทื ืคึผืจืึทืืขืงืืื, ืขืคืขื ืขื ืึทืงืกืขืก ืคืื ืื ืืื ืืขืจื ืขื ืฆื ืืืืจืืืึทื ืืืฉืื ืขื.
- ืงืึธื ืืจืึธืืืจืื ื ืื ืืืคึผืืึทืืขื ืืืืฉืึทื ืคืื ืื ืคืจืึทืกืืจืึทืงืืฉืขืจ ืคึผืจืึทืืืืืฉืึทื ื.
- ืคึผืขืจืคืึธืจืืื ื ืจืื ืืืืข ืืขืกืืื ื ืคืื ืึทืคึผืืึทืงืืืฉืึทื ืืึธืืืง ืคืืืกื ืืืง ืืื ืืืื "ืคึผืจืึธืืืจืึทืื" ืื ืคืจืึทืกืืจืึทืงืืฉืขืจ ืฆื ืงืึธื ืืจืึธืืืจื ืื ืคืึทื ืืงืฉืึทื ืึทืืืื ื ืึธื ืคึผืจืึทืืืืืฉืึทื ื.
- ืืื ืืืจ ืงืขื ืขื ืืขื, ืขืก ืืื ืึท ืืจืืื ืงืืื ืคืื ืื ืคืจืึทืกืืจืึทืงืืฉืขืจ ืืขืกืืื ื ืึธืคึผืฆืืขืก. Polumi ืืื ืืขืงืึทื ืืืึทืื ืคึฟืึทืจ ืืขืกืืื ื ืืื ืืขืืขืจ ืคืื ื ืืืืฃ ืืขื ืกืคึผืขืงืืจืื. ืืื ืก ืึธื ืืืืื ืืื ืืขื ืืื ืขืก ืึทืจืืขื.
ืึทืคึผืึทืจืึทื ืืขืกืืื ื
ืคึผืืืืื ืืืืื ืืขื ืขื ืืขืฉืจืืื ืืื ืึทืืืขืืืื-ืฆืืืขืง ืคึผืจืึธืืจืึทืืืื ื ืฉืคึผืจืึทืื ืึทืืึท ืืื ืืืฉืึทืืืึทืกืงืจืืคึผื, ืคึผืืืืึธื, ืืืคึผืกืงืจืืคึผื ืึธืืขืจ ืืืื. ืืขืจืืืขืจ, ืื ืคืื ืืึทืื ืคืื ืื ืฉืคึผืจืึทืื, ืึทืจืืึทื ืืขืจืขืื ื ืืืืขืจ ืืืฉืืจืื ืืื ืืืืืจืขืจืื, ืึทืจืืึทื ืืขืจืขืื ื ืคึผืจืึธืืข ืคืจืึทืืขืืืึธืจืงืก, ืืื ืืืจืขืืืืื ืคึฟืึทืจ ืืื. Pulumi ืืื ืืึทืืื-ืืืึธืืงื, ืืืึธืก ืืืื ืขืก ืงืขื ืขื ืืืื ืืขืืืืื ื ืคึฟืึทืจ ืืขืกืืื ื ืคืื ืงืืื ืืืึธืืงื ืฉืคึผืืึทืืขืจ.
(ืืื ืืขื ืึทืจืืืงื, ืืจืึธืฅ ืืืื ืืึทืืืืืืื ืืืืึทื ืืื ืืืืืืงืืึธืื, ืืืจ ื ืืฆื ืืืฉืึทืืืึทืกืงืจืืคึผื ืืื ืืึธืืฉืึท ืืื ืคืึธืงืืก ืืืืฃ AWS. ืืืจ ืงืขื ืขื ื ืืฆื ืคึผืืืืึธื unittest
, ืืืื ืคึผืจืืืืจื ืคืจืืืืืืขืจืง ืึธืืขืจ ืงืืื ืื ืืขืจืข ืคึผืจืืืืจื ืคืจืืืืืืขืจืง ืืืจ ืืื. ืืื, ืคืื ืงืืจืก, Pulumi ืึทืจืืขื ืืจืืืก ืืื Azure, Google Cloud, Kubernetes.)
ืืื ืืืจ ืืึธืื ืืขืืขื, ืขืก ืืขื ืขื ืขืืืขืืข ืกืืืืช ืืืึธืก ืืืจ ืืื ืืืขืื ืฆื ืคึผืจืืืืจื ืืืื ืื ืคืจืึทืกืืจืึทืงืืฉืขืจ ืงืึธื. ืืืื ืขืจ ืคืื ืืื ืืื ืงืึทื ืืืขื ืฉืึทื ืึทื ืึทืคึผืึทืจืึทื ืืขืกืืื ื. ืืืืึทื ืืืื ืงืึธื ืงืขื ืืึธืื ืคืึทื ืืงืฉืึทื ื - ืคึฟืึทืจ ืืืึทืฉืคึผืื, ืฆื ืจืขืืขื ืขื CIDR, ืืื ืึทืืืงืึทืืื ืจืขืืขื ืขื ื ืขืืขื, ืืึทืืก, ืขืืง. - ืืืจ ืืืขื ืืืกืืึธืืข ืืืืื ืฆื ืคึผืจืืืืจื ืืื. ืืึธืก ืืื ืื ืืขืืืข ืืื ืฉืจืืืื ืจืขืืืืขืจ ืึทืคึผืึทืจืึทื ืืขืกืฅ ืคึฟืึทืจ ืึทืคึผืืึทืงืืืฉืึทื ื ืืื ืืืื ืืึทืืืืกืืข ืคึผืจืึธืืจืึทืืืื ื ืฉืคึผืจืึทื.
ืฆื ืืึทืงืืืขื ืึท ืืืกื ืืขืจ ืงืึธืืคึผืืืฆืืจื, ืืืจ ืงืขื ืขื ืงืึธื ืืจืึธืืืจื ืืื ืืืื ืคึผืจืึธืืจืึทื ืึทืืึทืงืืืฅ ืจืขืกืืจืกื. ืฆื ืืืืืกืืจืืจื, ืืึธืืืจ ืืืึทืืืฉืึทื ืึทื ืืืจ ืืึทืจืคึฟื ืฆื ืฉืึทืคึฟื ืึท ืคึผืฉืื 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;
ืืึธืก ืืื ืื ืืงืขืจืืืง Pulumi ืคึผืจืึธืืจืึทื: ืขืก ืคืฉืื ืึทืืึทืงืืืฅ ืึทื 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();
}
});
});
ืขืก ืงืืงื ืืื ืึท ืจืขืืืืขืจ ืคึผืจืึธืืข, ืึธืืขืจ ืืื ืขืืืขืืข ืคึฟืขืึดืงืืืื ืืืึธืก ืืขื ืขื ืืืื ืฆื ืืืืขืจืงื:
- ืืืืึทื ืืืจ ืึธื ืคืจืขื ืื ืฉืืึทื ืคืื ืึท ืืืื ืืืืืขืจ ืืืคึผืืืืืึทื ื, ืืื ืืืขืจ ืืขืกืฅ ืืขื ืขื ืฉืืขื ืืืง ืืืืคื ืืื "ืคึผืืึทื" (ืึธืืขืจ "ืคึผืจืืืืื") ืืึธืืข. ืืืื, ืขืก ืืขื ืขื ืคืืืข ืคึผืจืึธืคึผืขืจืืืขืก ืืืขืืขื ืก ืืืึทืืืขืก ืืืขื ืคืฉืื ื ืืฉื ืืืื ืจืืืจืืืื ืึธืืขืจ ืืืขื ื ืืฉื ืืืื ืืืคืืื ื. ืืึธืก ืืืื ืึทืืข ืคึผืจืึธืืืงืฆืืข ืคึผืจืึธืคึผืขืจืืืขืก ืงืึทืืงืืึทืืืืืื ืืืจื ืืืื ืืืึธืืงื ืฉืคึผืืึทืืขืจ. ืืึธืก ืืื ื ืึธืจืืึทื ืคึฟืึทืจ ืืื ืืืขืจ ืืขืกืฅ - ืืืจ ื ืึธืจ ืงืึธื ืืจืึธืืืจื ืื ืึทืจืืึทื ืฉืจืืึทื ืืึทืื. ืืืจ ืืืขืื ืฆืืจืืงืงืืืขื ืฆื ืืขื ืึทืจืืืกืืขืื ืฉืคึผืขืืขืจ, ืืืขื ืขืก ืงืืื ืฆื ืื ืืึทืืจืืืฉืึทื ืืขืกืฅ.
- ืืื ื ืึทืืข 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 ืืืึธืก ืืื ืืืขืจื ืฆื ืืึทืฆืึธืื ืืคืืขืจืงืืึทืืงืืื ืฆื.
ืืืคึผืืงืึทืืื, ืฆื ืืืืคื Pulumi ืืืืื, ืื pulimi CLI (Command Line ืฆืืืื ื) ืืื ืืขื ืืฆื, ืืืึธืก ืงืึทื ืคืืืืขืจ ืื ืฉืคึผืจืึทื ืจืื ืืืืข, ืงืึธื ืืจืึธืืก ืื ืงืึทืืขืจ ืคืื ืื Pulumi ืืึธืืึธืจ ืึทืืื ืึทื ืึทืคึผืขืจืืืฉืึทื ื ืืื ืจืขืกืืจืกื ืงืขื ืขื ืืืื ืจืขืงืึธืจืืขื ืืื ืึทืจืืึทื ืืขืจืขืื ื ืืื ืืขื ืคึผืืึทื, ืืื"ื ื. ืึธืืขืจ, ืขืก ืืื ืืืื ืคึผืจืึธืืืขื. ืืืขื ืืืจ ืืืืคื ืืื ืืขืจ ืื ืงืึธื ืืจืึธื ืคืื ืืืื ืคึผืจืึธืืข ืคืจืืืืืืขืจืง, ืขืก ืืืขื ืืืื ืงืืื ืงืึธืืื ืืงืึทืฆืืข ืฆืืืืฉื ืื CLI ืืื ืื Pulumi ืืึธืืึธืจ.
ืฆื ืืึทืงืืืขื ืึทืจืื ืืขื ืึทืจืืืกืืขืื, ืืืจ ื ืึธืจ ืืึทืจืคึฟื ืฆื ืกืคึผืขืฆืืคืืฆืืจื ืื ืคืืืืขื ืืข:
- ืคึผืจืึธืืขืงื ื ืึธืืขื, ืืืึธืก ืืื ืงืึทื ืืืื ื ืืื ืื ืกืืืืืืข ืืืึทืืขืืืืืง
PULUMI_NODEJS_PROJECT
(ืึธืืขืจ, ืืขืจ ืืืื,PULUMI__PROJECT ะดะปั ะดััะณะธั ัะทัะบะพะฒ).
ืืขืจ ื ืึธืืขื ืคืื ืืขื ืึธื ืืืืื ืืืึธืก ืืื ืกืคึผืขืกืืคืืขื ืืื ืื ืกืืืืืืข ืืืึทืืขืืืืืงPULUMI_NODEJS_STACK
(ืึธืืขืจ, ืืขืจ ืืืื,PULUMI__ STACK).
ืืืื ืึธื ืืืืื ืงืึทื ืคืืืืขืจืืืฉืึทื ืืืขืจืืึทืืึทืื. ืืื ืงืขื ืขื ืืืื ืืืงืืืขื ืืื ืึท ืกืืืืืืข ืืืขืจืืึทืืึทืPULUMI_CONFIG
ืืื ืืืืขืจ ืคึฟืึธืจืืึทื ืืื JSON ืืึทืคึผืข ืืื ืฉืืืกื / ืืืขืจื ืคึผืขืจื.ืืขืจ ืคึผืจืึธืืจืึทื ืืืขื ืึทืจืืืกืืขืื ืืืึธืจื ืื ืื ืืืึธืก ืื ืืืงืืืฅ ืึทื ืื ืงืฉืจ ืฆื ืื CLI / ืืึธืืึธืจ ืืื ื ืืฉื ืื ืืืฆื ืืขืฉืึทืก ืืืจืืคืืจืื ื. ืืึธืก ืืื ืืืืืืืง ืืืืึทื ืืืื ืคึผืจืึธืืจืึทื ืืืขื ื ืืฉื ืึทืงืฉืื ืืืื ืืืคึผืืืื ืขืคึผืขืก ืืื ืขืก ืงืขื ืงืืืขื ืืื ืึท ืืืขืจืจืึทืฉื ืืืื ืืึธืก ืืื ื ืืฉื ืืืึธืก ืืืจ ืืืขื ืฆื ืืึธื! ืฆื ืืึธืื Pulumi ืึทื ืืึธืก ืืื ืคึผืื ืงื ืืืึธืก ืืืจ ืืึทืจืคึฟื, ืืืจ ืงืขื ืขื ืื ืกืืึทืืืจื
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