เจธเจผเฉเจญ เจฆเฉเจชเจนเจฟเจฐ เจฆเฉเจธเจคเฉเฅค เจฆเจฐ 'เจคเฉ เจเฉฑเจ เจจเจตเฉเจ เจชเฉเจฐเจตเจพเจน เจฆเฉ เจธเจผเฉเจฐเฉเจเจค เจฆเฉ เจเจฎเฉเจฆ เจตเจฟเฉฑเจ
เจฌเฉเจจเจฟเจเจฆเฉ เจขเจพเจเจเจพ เจเฉเจก (เจเฉเจก เจตเจเฉเจ เจฌเฉเจจเจฟเจเจฆเฉ เจขเจพเจเจเจพ) เจฒเจ เจชเฉเจฒเฉเจฎเฉ เจ
เจคเฉ เจเจฎ-เจเจฆเฉเจธเจผ เจฆเฉเจเจ เจชเฉเจฐเฉเจเจฐเจพเจฎเจฟเฉฐเจ เจญเจพเจธเจผเจพเจตเจพเจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจจเจพ เจฌเจนเฉเจค เจธเจพเจฐเฉ เจซเจพเจเจฆเฉ เจชเฉเจฐเจฆเจพเจจ เจเจฐเจฆเจพ เจนเฉ: เจนเฉเจจเจฐ เจ
เจคเฉ เจเจฟเจเจจ เจฆเฉ เจเจชเจฒเจฌเจงเจคเจพ, เจเจฌเจธเจเจฐเฉเจเจธเจผเจจ เจฆเฉเจเจฐเจพ เจเฉเจก เจตเจฟเฉฑเจ เจฌเจพเจเจฒเจฐเจชเจฒเฉเจ เจจเฉเฉฐ เจเจคเจฎ เจเจฐเจจเจพ, เจคเฉเจนเจพเจกเฉ เจเฉเจฎ เจฒเจ เจเจพเจฃเฉ เจเฉเจฒ, เจเจฟเจตเฉเจ เจเจฟ IDEs เจ
เจคเฉ lintersเฅค เจเจน เจธเจพเจฐเฉ เจธเจพเจซเจเจตเฉเจ
เจฐ เจเฉฐเจเจจเฉเจ
เจฐเจฟเฉฐเจ เจเฉเจฒ เจจเจพ เจธเจฟเจฐเจซเจผ เจธเจพเจจเฉเฉฐ เจตเจงเฉเจฐเฉ เจฒเจพเจญเจเจพเจฐเฉ เจฌเจฃเจพเจเจเจฆเฉ เจนเจจ, เจธเจเฉเจ เจธเจพเจกเฉ เจเฉเจก เจฆเฉ เจเฉเจฃเจตเฉฑเจคเจพ เจตเจฟเฉฑเจ เจตเฉ เจธเฉเจงเจพเจฐ เจเจฐเจฆเฉ เจนเจจเฅค เจเจธ เจฒเจ, เจเจน เจธเจฟเจฐเจซ เจเฉเจฆเจฐเจคเฉ เจนเฉ เจเจฟ เจเจฎ-เจเจฆเฉเจธเจผ เจชเฉเจฐเฉเจเจฐเจพเจฎเจฟเฉฐเจ เจญเจพเจธเจผเจพเจตเจพเจ เจฆเฉ เจตเจฐเจคเฉเจ เจธเจพเจจเฉเฉฐ เจเฉฑเจ เจนเฉเจฐ เจฎเจนเฉฑเจคเจตเจชเฉเจฐเจจ เจธเฉเจซเจเจตเฉเจ
เจฐ เจตเจฟเจเจพเจธ เจ
เจญเจฟเจเจธ เจชเฉเจธเจผ เจเจฐเจจ เจฆเฉ เจเจเจพเจเจผเจค เจฆเจฟเฉฐเจฆเฉ เจนเฉ - เจเฉเจธเจเจฟเฉฐเจ.
เจเจธ เจฒเฉเจ เจตเจฟเฉฑเจ, เจ เจธเฉเจ เจฆเฉเจเจพเจเจเฉ เจเจฟ เจชเฉเจฒเฉเจฎเฉ เจธเจพเจกเฉ เจฌเฉเจจเจฟเจเจฆเฉ เจขเจพเจเจเฉ เจฆเฉ เจฐเฉเจช เจตเจฟเฉฑเจ เจเฉเจก เจฆเฉ เจเจพเจเจ เจเจฐเจจ เจตเจฟเฉฑเจ เจธเจพเจกเฉ เจเจฟเจตเฉเจ เจฎเจฆเจฆ เจเจฐเจฆเจพ เจนเฉเฅค
เจฌเฉเจจเจฟเจเจฆเฉ เจขเจพเจเจเฉ เจฆเฉ เจเจพเจเจ เจเจฟเจเจ?
เจตเจฟเจธเจฅเจพเจฐ เจตเจฟเฉฑเจ เจเจพเจฃ เจคเฉเจ เจชเจนเจฟเจฒเจพเจ, เจเจน เจธเจตเจพเจฒ เจชเฉเฉฑเจเจฃเจพ เจฎเจนเฉฑเจคเจตเจชเฉเจฐเจฃ เจนเฉ: "เจเจฟเจเจ เจฌเฉเจจเจฟเจเจฆเฉ เจขเจพเจเจเฉ เจฆเฉ เจเจพเจเจ เจเฉเจคเฉ เจเจพเจเจฆเฉ เจนเฉ?" เจเจธ เจฆเฉ เจฌเจนเฉเจค เจธเจพเจฐเฉ เจเจพเจฐเจจ เจนเจจ เจ เจคเฉ เจเฉฑเจฅเฉ เจเจนเจจเจพเจ เจตเจฟเฉฑเจเฉเจ เจเฉเจ เจนเจจ:
- เจตเจฟเจ เจเจคเฉเจเจค เจซเฉฐเจเจธเจผเจจเจพเจ เจเจพเจ เจคเฉเจนเจพเจกเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจคเจฐเจ เจฆเฉ เจเฉเจเฉเจฟเจเจ เจฆเฉ เจฏเฉเจจเจฟเจ เจเฉเจธเจเจฟเฉฐเจ
- เจเฉเจ เจฐเฉเจเจพเจตเจเจพเจ เจฆเฉ เจตเจฟเจฐเฉเฉฑเจง เจฌเฉเจจเจฟเจเจฆเฉ เจขเจพเจเจเฉ เจฆเฉ เจฒเฉเฉเฉเจเจฆเฉ เจธเจฅเจฟเจคเฉ เจฆเฉ เจชเฉเจธเจผเจเฉ เจเจฐเจฆเจพ เจนเฉเฅค
- เจเจฎ เจคเจฐเฉเจเฉเจเจ เจฆเจพ เจชเจคเจพ เจฒเจเจพเจเจฃเจพ, เจเจฟเจตเฉเจ เจเจฟ เจธเจเฉเจฐเฉเจ เจฌเจพเจฒเจเฉ เจฆเฉ เจเจจเจเฉเจฐเจฟเจชเจธเจผเจจ เจฆเฉ เจเจพเจ เจเจพเจ เจ เจธเฉเจฐเฉฑเจเจฟเจ เจค, เจเฉฐเจเจฐเจจเฉเจ เจคเฉเจ เจตเจฐเจเฉเจ เจฒ เจฎเจธเจผเฉเจจเจพเจ เจคเฉฑเจ เจเฉเฉฑเจฒเฉเจนเฉ เจชเจนเฉเฉฐเจเฅค
- เจฌเฉเจจเจฟเจเจฆเฉ เจขเจพเจเจเฉ เจฆเฉ เจชเฉเจฐเจฌเฉฐเจง เจจเฉเฉฐ เจฒเจพเจเฉ เจเจฐเจจ เจฆเฉ เจเจพเจเจ เจเจฐ เจฐเจฟเจนเจพ เจนเฉเฅค
- เจชเฉเจฐเฉเจตเจฟเจเจผเจจเจฟเฉฐเจ เจคเฉเจ เจฌเจพเจ เจฆ เจเจพเจฐเจเจเฉเจธเจผเจฒเจคเจพ เจฆเฉ เจเจพเจเจ เจเจฐเจจ เจฒเจ เจคเฉเจนเจพเจกเฉ "เจชเฉเจฐเฉเจเจฐเจพเจฎ เจเฉเจคเฉ" เจฌเฉเจจเจฟเจเจฆเฉ เจขเจพเจเจเฉ เจฆเฉ เจ เฉฐเจฆเจฐ เจเฉฑเจฒ เจฐเจนเฉ เจเจชเจฒเฉเจเฉเจธเจผเจจ เจคเจฐเจ เจฆเฉ เจฐเจจเจเจพเจเจฎ เจเฉเจธเจเจฟเฉฐเจ เจเจฐเจจเจพเฅค
- เจเจฟเจตเฉเจ เจเจฟ เจ เจธเฉเจ เจฆเฉเจ เจธเจเจฆเฉ เจนเจพเจ, เจฌเฉเจจเจฟเจเจฆเฉ เจขเจพเจเจเฉ เจฆเฉ เจเฉเจธเจเจฟเฉฐเจ เจตเจฟเจเจฒเจชเจพเจ เจฆเฉ เจเฉฑเจ เจตเจฟเจธเจผเจพเจฒ เจธเจผเฉเจฐเฉเจฃเฉ เจนเฉ. เจชเฉเจฒเฉเจฎเฉ เจเฉเจฒ เจเจธ เจธเจชเฉเจเจเฉเจฐเจฎ เจฆเฉ เจนเจฐ เจฌเจฟเฉฐเจฆเฉ 'เจคเฉ เจเฉเจธเจ เจเจฐเจจ เจฒเจ เจตเจฟเจงเฉ เจนเฉเฅค เจเจ เจธเจผเฉเจฐเฉ เจเจฐเฉเจ เจ เจคเฉ เจฆเฉเจเจฆเฉ เจนเจพเจ เจเจฟ เจเจน เจเจฟเจตเฉเจ เจเฉฐเจฎ เจเจฐเจฆเจพ เจนเฉเฅค
เจฏเฉเจจเจฟเจ เจเฉเจธเจเจฟเฉฐเจ
เจชเฉเจฒเฉเจฎเฉ เจชเฉเจฐเฉเจเจฐเจพเจฎ เจเจฎ-เจเจฆเฉเจธเจผ เจตเจพเจฒเฉเจเจ เจชเฉเจฐเฉเจเจฐเจพเจฎเจฟเฉฐเจ เจญเจพเจธเจผเจพเจตเจพเจ เจเจฟเจตเฉเจ เจเจฟ JavaScript, Python, TypeScript เจเจพเจ Go เจตเจฟเฉฑเจ เจฒเจฟเจเฉ เจเจพเจเจฆเฉ เจนเจจเฅค เจเจธ เจฒเจ, เจเจนเจจเจพเจ เจญเจพเจธเจผเจพเจตเจพเจ เจฆเฉ เจชเฉเจฐเฉ เจธเจผเจเจคเฉ, เจเจนเจจเจพเจ เจฆเฉ เจธเฉฐเจฆเจพเจ เจ เจคเฉ เจฒเจพเจเจฌเฉเจฐเฉเจฐเฉเจเจ เจธเจฎเฉเจค, เจเฉเจธเจ เจซเจฐเฉเจฎเจตเจฐเจ เจธเจฎเฉเจค, เจเจนเจจเจพเจ เจฒเจ เจเจชเจฒเจฌเจง เจนเฉเฅค เจชเฉเจฒเฉเจฎเฉ เจฎเจฒเจเฉ-เจเจฒเจพเจเจก เจนเฉ, เจเจฟเจธเจฆเจพ เจฎเจคเจฒเจฌ เจนเฉ เจเจฟ เจเจธเจฆเฉ เจตเจฐเจคเฉเจ เจเจฟเจธเฉ เจตเฉ เจเจฒเจพเจเจก เจชเฉเจฐเจฆเจพเจคเจพ เจคเฉเจ เจเจพเจเจ เจฒเจ เจเฉเจคเฉ เจเจพ เจธเจเจฆเฉ เจนเฉเฅค
(เจเจธ เจฒเฉเจ เจตเจฟเฉฑเจ, เจฌเจนเฉเจญเจพเจธเจผเจพเจ เจ
เจคเฉ เจฎเจฒเจเฉเจเจฒเจพเจเจก เจนเฉเจฃ เจฆเฉ เจฌเจพเจตเจเฉเจฆ, เจ
เจธเฉเจ JavaScript เจ
เจคเฉ Mocha เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐเจฆเฉ เจนเจพเจ เจ
เจคเฉ AWS 'เจคเฉ เจงเจฟเจเจจ เจเฉเจเจฆเจฐเจฟเจค เจเจฐเจฆเฉ เจนเจพเจเฅค เจคเฉเจธเฉเจ เจชเจพเจเจฅเจจ เจฆเฉ เจตเจฐเจคเฉเจ เจเจฐ เจธเจเจฆเฉ เจนเฉเฅค 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();
}
});
});
เจ เจคเฉ เจ เฉฐเจค เจตเจฟเฉฑเจ, เจเจ เจคเฉเจเจพ เจเฉเจธเจ เจฒเจฟเจเฉเจเฅค เจเจน เจฅเฉเฉเจพ เจนเฉเจฐ เจเฉเฉฐเจเจฒเจฆเจพเจฐ เจนเฉเจตเฉเจเจพ เจเจฟเจเจเจเจฟ เจ เจธเฉเจ เจธเฉเจฐเฉฑเจเจฟเจ เจธเจฎเฉเจน เจจเจพเจฒ เจเฉเฉเฉ เจฒเฉเจเจเจจ เจจเจฟเจฏเจฎเจพเจ เจฆเฉ เจเฉเจ เจเจฐ เจฐเจนเฉ เจนเจพเจ, เจเจฟเจจเฉเจนเจพเจ เจตเจฟเฉฑเจเฉเจ เจฌเจนเฉเจค เจธเจพเจฐเฉ เจนเฉ เจธเจเจฆเฉ เจนเจจ, เจ เจคเฉ เจเจนเจจเจพเจ เจจเจฟเจฏเจฎเจพเจ เจตเจฟเฉฑเจ เจธเฉเจเจเจกเฉเจเจฐ เจฐเฉเจเจ เจนเจจ, เจเจฟเจจเฉเจนเจพเจ เจตเจฟเฉฑเจเฉเจ เจฌเจนเฉเจค เจธเจพเจฐเฉ เจนเฉ เจธเจเจฆเฉ เจนเจจเฅค เจชเจฐ เจ เจธเฉเจ เจชเฉเจฐเจฌเฉฐเจงเจฟเจค เจเฉเจคเจพ:
// 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 (เจเจฎเจพเจเจก เจฒเจพเจเจจ เจเฉฐเจเจฐเจซเฉเจธ) เจฆเฉ เจตเจฐเจคเฉเจ เจเฉเจคเฉ เจเจพเจเจฆเฉ เจนเฉ, เจเฉ เจญเจพเจธเจผเจพ เจฆเฉ เจฐเจจเจเจพเจเจฎ เจจเฉเฉฐ เจธเฉฐเจฐเจเจฟเจค เจเจฐเจฆเจพ เจนเฉ, เจชเฉเจฒเฉเจฎเฉ เจเฉฐเจเจฃ เจฆเฉ เจฒเจพเจเจ เจจเฉเฉฐ เจจเจฟเจฏเฉฐเจคเจฐเจฟเจค เจเจฐเจฆเจพ เจนเฉ เจคเจพเจ เจเฉ เจธเจฐเฉเจคเจพเจ เจฆเฉ เจจเจพเจฒ เจเจชเจฐเฉเจธเจผเจจเจพเจ เจจเฉเฉฐ เจฐเจฟเจเจพเจฐเจก เจเฉเจคเจพ เจเจพ เจธเจเฉ เจ
เจคเฉ เจฏเฉเจเจจเจพ เจตเจฟเฉฑเจ เจธเจผเจพเจฎเจฒ เจเฉเจคเจพ เจเจพ เจธเจเฉ, เจเจฆเจฟเฅค เจนเจพเจฒเจพเจเจเจฟ, เจเฉฑเจ เจธเจฎเฉฑเจธเจฟเจ เจนเฉ. เจเจฆเฉเจ เจคเฉเจนเจพเจกเฉ เจเฉเจธเจ เจซเจฐเฉเจฎเจตเจฐเจ เจฆเฉ เจจเจฟเจฏเฉฐเจคเจฐเจฃ เจตเจฟเฉฑเจ เจเฉฑเจฒ เจฐเจฟเจนเจพ เจนเฉเจตเฉ, เจคเจพเจ 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