เชถเซเชญ เชฌเชชเซเชฐ เชฎเชฟเชคเซเชฐเซ. เชฆเชฐเซ เชจเชตเชพ เชชเซเชฐเชตเชพเชนเชจเซ เชถเชฐเซเชเชคเชจเซ เช
เชชเซเชเซเชทเชพเช
เชเชจเซเชซเซเชฐเชพเชธเซเชเซเชฐเชเซเชเชฐ เชเซเชก (เชเซเชก เชคเชฐเซเชเซ เชเชจเซเชซเซเชฐเชพเชธเซเชเซเชฐเชเซเชเชฐ) เชฎเชพเชเซ เชชเซเชฒเซเชฎเซ เช
เชจเซ เชธเชพเชฎเชพเชจเซเชฏ เชนเซเชคเซเชตเชพเชณเซ เชชเซเชฐเซเชเซเชฐเชพเชฎเชฟเชเช เชญเชพเชทเชพเชเชจเซ เชเชชเชฏเซเช เชเชฃเชพ เชซเชพเชฏเชฆเชพเช เชชเซเชฐเชพ เชชเชพเชกเซ เชเซ: เชเซเชถเชณเชคเชพ เช
เชจเซ เชเซเชเชพเชจเชจเซ เชเชชเชฒเชฌเซเชงเชคเชพ, เชเชฌเซเชธเซเชเซเชฐเซเชเซเชถเชจ เชฆเซเชตเชพเชฐเชพ เชเซเชกเชฎเชพเช เชฌเซเชเชฒเชฐเชชเซเชฒเซเชเชจเซ เชฆเซเชฐ เชเชฐเชตเชพ, เชคเชฎเชพเชฐเซ เชเซเชฎเชจเซ เชชเชฐเชฟเชเชฟเชค เชธเชพเชงเชจเซ, เชเซเชฎ เชเซ IDEs เช
เชจเซ linters. เช เชคเชฎเชพเชฎ เชธเซเชซเซเชเชตเซเชฐ เชเชจเซเชเชฟเชจเชฟเชฏเชฐเชฟเชเช เชธเชพเชงเชจเซ เชฎเชพเชคเซเชฐ เช
เชฎเชจเซ เชตเชงเซ เชเชคเซเชชเชพเชฆเช เชฌเชจเชพเชตเซ เชเซ, เชชเชฐเชเชคเซ เช
เชฎเชพเชฐเชพ เชเซเชกเชจเซ เชเซเชฃเชตเชคเซเชคเชพเชฎเชพเช เชชเชฃ เชธเซเชงเชพเชฐเซ เชเชฐเซ เชเซ. เชคเซเชฅเซ, เชคเซ เชธเซเชตเชพเชญเชพเชตเชฟเช เชเซ เชเซ เชธเชพเชฎเชพเชจเซเชฏ เชนเซเชคเซเชตเชพเชณเซ เชชเซเชฐเซเชเซเชฐเชพเชฎเชฟเชเช เชญเชพเชทเชพเชเชจเซ เชเชชเชฏเซเช เช
เชฎเชจเซ เช
เชจเซเชฏ เชฎเชนเชคเซเชตเชชเซเชฐเซเชฃ เชธเซเชซเซเชเชตเซเชฐ เชกเซเชตเชฒเชชเชฎเซเชจเซเช เชชเซเชฐเซเชเซเชเชฟเชธ เชฐเชเซ เชเชฐเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเซ เชเซ - เชชเชฐเซเชเซเชทเชฃ.
เช เชฒเซเชเชฎเชพเช, เช เชฎเซ เชเซเชเชถเซเช เชเซ เชชเซเชฒเซเชฎเซ เช เชฎเชพเชฐเชพ เชเชจเซเชซเซเชฐเชพเชธเซเชเซเชฐเชเซเชเชฐ-เชเช-เชเซเชกเชจเซ เชเชเชพเชธเชตเชพเชฎเชพเช เชเซเชตเซ เชฐเซเชคเซ เชฎเชฆเชฆ เชเชฐเซ เชเซ.
เชเชจเซเชซเซเชฐเชพเชธเซเชเซเชฐเชเซเชเชฐเชจเซเช เชชเชฐเซเชเซเชทเชฃ เชถเชพ เชฎเชพเชเซ?
เชตเชฟเชเชคเชตเชพเชฐ เชเชคเชพเช เชชเชนเซเชฒเชพเช, เชคเซ เชชเซเชฐเชถเซเชจ เชชเซเชเชตเชพ เชฏเซเชเซเชฏ เชเซ: "เชถเชพ เชฎเชพเชเซ เชเชจเซเชซเซเชฐเชพเชธเซเชเซเชฐเชเซเชเชฐเชจเซเช เชชเชฐเซเชเซเชทเชฃ เชฌเชฟเชฒเชเซเชฒ?" เชเชจเชพ เชฎเชพเชเซ เชเชฃเชพ เชเชพเชฐเชฃเซ เชเซ เช เชจเซ เชคเซเชฎเชพเชเชฅเซ เชเซเชเชฒเชพเช เช เชนเซเช เชเซ:
- เชตเซเชฏเชเซเชคเชฟเชเชค เชเชพเชฐเซเชฏเซ เช เชฅเชตเชพ เชคเชฎเชพเชฐเชพ เชชเซเชฐเซเชเซเชฐเชพเชฎ เชฒเซเชเชฟเชเชจเชพ เชเซเชเชกเชพเชเชจเซเช เชเชเชฎ เชชเชฐเซเชเซเชทเชฃ
- เชเซเชเซเชเชธ เช เชตเชฐเซเชงเซ เชธเชพเชฎเซ เชเชจเซเชซเซเชฐเชพเชธเซเชเซเชฐเชเซเชเชฐเชจเซ เชเชเซเชเชฟเชค เชธเซเชฅเชฟเชคเชฟเชจเซ เชเชเชพเชธเซ เชเซ.
- เชธเชพเชฎเชพเชจเซเชฏ เชญเซเชฒเซเชจเซ เชถเซเชง, เชเซเชฎ เชเซ เชธเซเชเซเชฐเซเช เชฌเชเซเชเชจเชพ เชเชจเซเชเซเชฐเชฟเชชเซเชถเชจเชจเซ เช เชญเชพเชต เช เชฅเชตเชพ เช เชธเซเชฐเชเซเชทเชฟเชค, เชเชจเซเชเชฐเชจเซเชเชฅเซ เชตเชฐเซเชเซเชฏเซเช เชฒ เชฎเชถเซเชจเซ เชธเซเชงเซเชจเซ เชเซเชฒเซเชฒเซ เชเชเซเชธเซเชธ.
- เชเชจเซเชซเซเชฐเชพเชธเซเชเซเชฐเชเซเชเชฐ เชเซเชเชตเชพเชเชจเชพ เช เชฎเชฒเซเชเชฐเชฃเชจเซ เชคเชชเชพเชธ เชเชฐเซ เชฐเชนเซเชฏเชพ เชเซเช.
- เชเซเชเชตเชพเช เชเชฐเซเชฏเชพ เชชเชเซ เชเชพเชฐเซเชฏเชเซเชทเชฎเชคเชพ เชเชเชพเชธเชตเชพ เชฎเชพเชเซ เชคเชฎเชพเชฐเชพ "เชชเซเชฐเซเชเซเชฐเชพเชฎ เชเชฐเซเชฒ" เชเชจเซเชซเซเชฐเชพเชธเซเชเซเชฐเชเซเชเชฐเชจเซ เช เชเชฆเชฐ เชเชพเชฒเชคเชพ เชเชชเซเชฒเชฟเชเซเชถเชจ เชคเชฐเซเชเชจเซเช เชฐเชจเชเชพเชเชฎ เชชเชฐเซเชเซเชทเชฃ เชเชฐเชตเซเช.
- เชเซเชฎ เชเชชเชฃเซ เชเซเช เชถเชเซเช เชเซเช, เชคเซเชฏเชพเช เชเชจเซเชซเซเชฐเชพเชธเซเชเซเชฐเชเซเชเชฐ เชชเชฐเซเชเซเชทเชฃ เชตเชฟเชเชฒเซเชชเซเชจเซ เชตเชฟเชถเชพเชณ เชถเซเชฐเซเชฃเซ เชเซ. เชชเซเชฒเซเชฎเซ เชชเชพเชธเซ เช เชธเซเชชเซเชเซเชเซเชฐเชฎ เชชเชฐเชจเชพ เชฆเชฐเซเช เชฌเชฟเชเชฆเซเช เชชเชฐ เชชเชฐเซเชเซเชทเชฃ เชฎเชพเชเซ เชฎเชฟเชเซเชจเชฟเชเชฎเซเชธ เชเซ. เชเชพเชฒเซ เชชเซเชฐเชพเชฐเชเชญ เชเชฐเซเช เช เชจเซ เชเซเชเช เชเซ เชคเซ เชเซเชตเซ เชฐเซเชคเซ เชเชพเชฐเซเชฏ เชเชฐเซ เชเซ.
เชเชเชฎ เชชเชฐเซเชเซเชทเชฃ
เชชเซเชฒเซเชฎเซ เชชเซเชฐเซเชเซเชฐเชพเชฎเซเชธ เชเชพเชตเชพเชธเซเชเซเชฐเชฟเชชเซเช, เชชเชพเชฏเชฅเซเชจ, เชเชพเชเชชเชธเซเชเซเชฐเซเชชเซเช เช เชฅเชตเชพ เชเซ เชเซเชตเซ เชธเชพเชฎเชพเชจเซเชฏ เชนเซเชคเซเชตเชพเชณเซ เชชเซเชฐเซเชเซเชฐเชพเชฎเชฟเชเช เชญเชพเชทเชพเชเชฎเชพเช เชฒเชเชตเชพเชฎเชพเช เชเชตเซ เชเซ. เชคเซเชฅเซ, เช เชญเชพเชทเชพเชเชจเซ เชธเชเชชเซเชฐเซเชฃ เชถเชเซเชคเชฟ, เชคเซเชฎเชจเชพ เชธเชพเชงเชจเซ เช เชจเซ เชชเซเชธเซเชคเชเชพเชฒเชฏเซ เชธเชนเชฟเชค, เชชเชฐเซเชเซเชทเชฃ เชซเซเชฐเซเชฎเชตเชฐเซเช เชธเชนเชฟเชค, เชคเซเชฎเชจเซ เชเชชเชฒเชฌเซเชง เชเซ. เชชเซเชฒเซเชฎเซ เชฎเชฒเซเชเชฟ-เชเซเชฒเชพเชเชก เชเซ, เชเซเชจเซ เช เชฐเซเชฅ เชเซ เชเซ เชคเซเชจเซ เชเชชเชฏเซเช เชเซเชเชชเชฃ เชเซเชฒเชพเชเชก เชชเซเชฐเชฆเชพเชคเชพ เชชเชพเชธเซเชฅเซ เชชเชฐเซเชเซเชทเชฃ เชฎเชพเชเซ เชฅเช เชถเชเซ เชเซ.
(เช เชฒเซเชเชฎเชพเช, เชฌเชนเซเชญเชพเชทเซ เช
เชจเซ เชฎเชฒเซเชเซเชเซเชฒเชพเชเชก เชนเซเชตเชพ เชเชคเชพเช, เช
เชฎเซ JavaScript เช
เชจเซ Mocha เชจเซ เชเชชเชฏเซเช เชเชฐเซเช เชเซเช เช
เชจเซ AWS เชชเชฐ เชงเซเชฏเชพเชจ เชเซเชจเซเชฆเซเชฐเชฟเชค เชเชฐเซเช เชเซเช. เชคเชฎเซ Python เชจเซ เชเชชเชฏเซเช เชเชฐเซ เชถเชเซ เชเซ. unittest
, เชเซเชธเซเช เชซเซเชฐเซเชฎเชตเชฐเซเช เชชเชฐ เชเชพเช, เช
เชฅเชตเชพ เชคเชฎเชจเซ เชเชฎเซ เชคเซ เชเซเชเชชเชฃ เช
เชจเซเชฏ เชเซเชธเซเช เชซเซเชฐเซเชฎเชตเชฐเซเช. เช
เชจเซ, เช
เชฒเชฌเชคเซเชค, เชชเซเชฒเซเชฎเซ เชเชเซเชฏเซเชฐ, เชเซเชเชฒ เชเซเชฒเชพเชเชก, เชเซเชฌเชฐเชจเซเชเซเชธ เชธเชพเชฅเซ เชธเชฐเชธ เชเชพเชฎ เชเชฐเซ เชเซ.)
เชเซเชฎ เชเชชเชฃเซ เชเซเชฏเซเช เชคเซเชฎ, เชคเชฎเซ เชคเชฎเชพเชฐเชพ เชเชจเซเชซเซเชฐเชพเชธเซเชเซเชฐเชเซเชเชฐ เชเซเชกเชจเซ เชเชเชพเชธเชตเชพ เชฎเชพเชเชคเชพ เชนเซเช เชถเชเซ เชคเซเชจเชพ เชเชฃเชพ เชเชพเชฐเชฃเซ เชเซ. เชคเซเชฎเชพเชเชฅเซ เชเช เชชเชฐเชเชชเชฐเชพเชเชค เชเชเชฎ เชชเชฐเซเชเซเชทเชฃ เชเซ. เชเชพเชฐเชฃ เชเซ เชคเชฎเชพเชฐเชพ เชเซเชกเชฎเชพเช เชเชพเชฐเซเชฏเซ เชนเซเช เชถเชเซ เชเซ - เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, CIDR เชจเซ เชเชฃเชคเชฐเซ เชเชฐเชตเชพ เชฎเชพเชเซ, เชเชคเชฟเชถเซเชฒ เชฐเซเชคเซ เชจเชพเชฎเซ, เชเซ
เชเซเชธ เชตเชเซเชฐเซเชจเซ เชเชฃเชคเชฐเซ เชเชฐเซ. - เชคเชฎเซ เชเชฆเชพเช เชคเซเชฎเชจเซ เชเชเชพเชธเชตเชพ เชฎเชพเชเชเซ เชเซ. เช เชคเชฎเชพเชฐเซ เชฎเชจเชชเชธเชเชฆ เชชเซเชฐเซเชเซเชฐเชพเชฎเชฟเชเช เชญเชพเชทเชพเชฎเชพเช เชเชชเซเชฒเชฟเชเซเชถเชจเซเชธ เชฎเชพเชเซ เชจเชฟเชฏเชฎเชฟเชค เชเชเชฎ เชชเชฐเซเชเซเชทเชฃเซ เชฒเชเชตเชพ เชเซเชตเซเช เช เชเซ.
เชฅเซเชกเซ เชตเชงเซ เชเชเชฟเชฒ เชฌเชจเชตเชพ เชฎเชพเชเซ, เชคเชฎเซ เชเชเชพเชธเซ เชถเชเซ เชเซ เชเซ เชคเชฎเชพเชฐเซ เชชเซเชฐเซเชเซเชฐเชพเชฎ เชธเชเชธเชพเชงเชจเซเชจเซ เชซเชพเชณเชตเชฃเซ เชเซเชตเซ เชฐเซเชคเซ เชเชฐเซ เชเซ. เชธเชฎเชเชพเชตเชตเชพ เชฎเชพเชเซ, เชเชพเชฒเซ เชเชฒเซเชชเชจเชพ เชเชฐเซเช เชเซ เชเชชเชฃเซ เชเช เชธเชฐเชณ EC2 เชธเชฐเซเชตเชฐ เชฌเชจเชพเชตเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ เช
เชจเซ เช
เชฎเซ เชจเซเชเซเชจเชพเชจเซ เชเชพเชคเชฐเซ เชเชฐเชตเชพ เชฎเชพเชเชเซเช เชเซเช:
- เชฆเชพเชเชฒเชพเชเชฎเชพเช เชเซเช เชนเซเชฏ เชเซ
Name
. - เชเชจเซเชธเซเชเชจเซเชธเซ เชเชจเชฒเชพเชเชจ เชธเซเชเซเชฐเชฟเชชเซเชเชจเซ เชเชชเชฏเซเช เชจ เชเชฐเชตเซ เชเซเชเช
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;
เช เชฎเซเชณเชญเซเชค เชชเซเชฒเซเชฎเซ เชชเซเชฐเซเชเซเชฐเชพเชฎ เชเซ: เชคเซ เชซเชเซเชค 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
เชคเซเชฎเชจเซ เชญเซเชเชพ เชเชฐเชตเชพ เชฎเชพเชเซ. - เชเซเชฒเซเชฒเซ, เช เชฎเซเชฒเซเชฏเซเชจเซ เชเชฃเชคเชฐเซ เช
เชธเซเชฎเซเชณ เชฐเซเชคเซ เชเชฐเชตเชพเชฎเชพเช เชเชตเชคเซ เชนเซเชตเชพเชฅเซ, เช
เชฎเชพเชฐเซ เชฎเซเชเชพเชจเซ เชฌเชฟเชฒเซเช-เชเชจ เชเชธเชฟเชเช เชเซเชฒเชฌเซเช เชธเซเชตเชฟเชงเชพเชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชจเซ เชเชฐเซเชฐ เชเซ.
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();
}
});
});
เชฌเชธ เชเชเชฒเซเช เช. เชนเชตเซ เชเชพเชฒเซ เชชเชฐเซเชเซเชทเชฃเซ เชเชฒเชพเชตเซเช!
เชเชพเชฒเซ เชฐเชนเซเชฒ เชชเชฐเซเชเซเชทเชฃเซ
เชฎเซเชเชพเชญเชพเชเชจเชพ เชเชฟเชธเซเชธเชพเชเชฎเชพเช, เชคเชฎเซ เชคเชฎเชพเชฐเซ เชชเชธเชเชฆเชเซเชจเชพ เชเซเชธเซเช เชซเซเชฐเซเชฎเชตเชฐเซเชเชจเซ เชเชชเชฏเซเช เชเชฐเซเชจเซ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชคเซ เชชเชฐเซเชเซเชทเชฃเซ เชเชฒเชพเชตเซ เชถเชเซ เชเซ. เชชเชฐเชเชคเซ เชชเซเชฒเซเชฎเซเชจเซ เชเช เชตเชฟเชถเซเชทเชคเชพ เชเซ เชเซเชจเชพ เชชเชฐ เชงเซเชฏเชพเชจ เชเชชเชตเซเช เชฏเซเชเซเชฏ เชเซ.
เชธเชพเชฎเชพเชจเซเชฏ เชฐเซเชคเซ, เชชเซเชฒเซเชฎเซ เชชเซเชฐเซเชเซเชฐเชพเชฎเซเชธ เชเชฒเชพเชตเชตเชพ เชฎเชพเชเซ, เชชเซเชฒเชฟเชฎเซ เชธเซเชเชฒเชเช (เชเชฎเชพเชจเซเชก เชฒเชพเชเชจ เชเชจเซเชเชฐเชซเซเชธ) เชจเซ เชเชชเชฏเซเช เชเชฐเชตเชพเชฎเชพเช เชเชตเซ เชเซ, เชเซ เชญเชพเชทเชพเชจเชพ เชฐเชจเชเชพเชเชฎเชจเซ เชเซเช เชตเซ เชเซ, เชชเซเชฒเซเชฎเซ เชเชจเซเชเชฟเชจเชจเชพ เชฒเซเชจเซเชเชจเซ เชจเชฟเชฏเชเชคเซเชฐเชฟเชค เชเชฐเซ เชเซ เชเซเชฅเซ เชธเชเชธเชพเชงเชจเซ เชธเชพเชฅเซเชจเซ เชเชพเชฎเชเซเชฐเซ เชฐเซเชเซเชฐเซเชก เชเชฐเซ เชถเชเชพเชฏ เช
เชจเซ เชชเซเชฒเชพเชจเชฎเชพเช เชธเชพเชฎเซเชฒ เชเชฐเซ เชถเชเชพเชฏ เชตเชเซเชฐเซ. เชเซ เชเซ, เชเช เชธเชฎเชธเซเชฏเชพ เชเซ. เชคเชฎเชพเชฐเชพ เชเซเชธเซเช เชซเซเชฐเซเชฎเชตเชฐเซเชเชจเชพ เชจเชฟเชฏเชเชคเซเชฐเชฃ เชนเซเช เชณ เชเชพเชฒเชคเซ เชตเชเชคเซ, 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)
เชฌเชงเซเช เชฌเชฐเชพเชฌเชฐ เชเชพเชฒเซเชฏเซเช... เชนเซเชฐเซ! โโโ
เชเช เชฎเชพเชเซ เชเชเชฒเซเช เช เชเซ, เชชเชฐเชเชคเซ เช เชฎเซ เช เชจเซเชตเชพเชฆเชจเชพ เชฌเซเชเชพ เชญเชพเชเชฎเชพเช เชเชฎเชพเชตเช เชชเชฐเซเชเซเชทเชฃ เชตเชฟเชถเซ เชตเชพเชค เชเชฐเซเชถเซเช ๐
เชธเซเชฐเซเชธ: www.habr.com