เชชเซเชฒเซเชฎเซ€ เชธเชพเชฅเซ‡ เช•เซ‹เชก เชคเชฐเซ€เช•เซ‡ เชˆเชจเซเชซเซเชฐเชพเชธเซเชŸเซเชฐเช•เซเชšเชฐเชจเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ. เชญเชพเช— 1

เชถเซเชญ เชฌเชชเซ‹เชฐ เชฎเชฟเชคเซเชฐเซ‹. เชฆเชฐเซ‡ เชจเชตเชพ เชชเซเชฐเชตเชพเชนเชจเซ€ เชถเชฐเซ‚เช†เชคเชจเซ€ เช…เชชเซ‡เช•เซเชทเชพเช "DevOps เชชเซเชฐเซ‡เช•เซเชŸเชฟเชธ เช…เชจเซ‡ เชŸเซ‚เชฒเซเชธ" เช…เชฎเซ‡ เชคเชฎเชพเชฐเซ€ เชธเชพเชฅเซ‡ เชเช• เชจเชตเซ‹ เช…เชจเซเชตเชพเชฆ เชถเซ‡เชฐ เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช. เชœเชพเช“.

เชชเซเชฒเซเชฎเซ€ เชธเชพเชฅเซ‡ เช•เซ‹เชก เชคเชฐเซ€เช•เซ‡ เชˆเชจเซเชซเซเชฐเชพเชธเซเชŸเซเชฐเช•เซเชšเชฐเชจเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ. เชญเชพเช— 1

เชˆเชจเซเชซเซเชฐเชพเชธเซเชŸเซเชฐเช•เซเชšเชฐ เช•เซ‹เชก (เช•เซ‹เชก เชคเชฐเซ€เช•เซ‡ เชˆเชจเซเชซเซเชฐเชพเชธเซเชŸเซเชฐเช•เซเชšเชฐ) เชฎเชพเชŸเซ‡ เชชเซเชฒเซเชฎเซ€ เช…เชจเซ‡ เชธเชพเชฎเชพเชจเซเชฏ เชนเซ‡เชคเซเชตเชพเชณเซ€ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เชญเชพเชทเชพเช“เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช˜เชฃเชพ เชซเชพเชฏเชฆเชพเช“ เชชเซ‚เชฐเชพ เชชเชพเชกเซ‡ เช›เซ‡: เช•เซเชถเชณเชคเชพ เช…เชจเซ‡ เชœเซเชžเชพเชจเชจเซ€ เช‰เชชเชฒเชฌเซเชงเชคเชพ, เชเชฌเซเชธเซเชŸเซเชฐเซ‡เช•เซเชถเชจ เชฆเซเชตเชพเชฐเชพ เช•เซ‹เชกเชฎเชพเช‚ เชฌเซ‹เชˆเชฒเชฐเชชเซเชฒเซ‡เชŸเชจเซ‡ เชฆเซ‚เชฐ เช•เชฐเชตเชพ, เชคเชฎเชพเชฐเซ€ เชŸเซ€เชฎเชจเซ‡ เชชเชฐเชฟเชšเชฟเชค เชธเชพเชงเชจเซ‹, เชœเซ‡เชฎ เช•เซ‡ IDEs เช…เชจเซ‡ linters. เช† เชคเชฎเชพเชฎ เชธเซ‰เชซเซเชŸเชตเซ‡เชฐ เชเชจเซเชœเชฟเชจเชฟเชฏเชฐเชฟเช‚เช— เชธเชพเชงเชจเซ‹ เชฎเชพเชคเซเชฐ เช…เชฎเชจเซ‡ เชตเชงเซ เช‰เชคเซเชชเชพเชฆเช• เชฌเชจเชพเชตเซ‡ เช›เซ‡, เชชเชฐเช‚เชคเซ เช…เชฎเชพเชฐเชพ เช•เซ‹เชกเชจเซ€ เช—เซเชฃเชตเชคเซเชคเชพเชฎเชพเช‚ เชชเชฃ เชธเซเชงเชพเชฐเซ‹ เช•เชฐเซ‡ เช›เซ‡. เชคเซ‡เชฅเซ€, เชคเซ‡ เชธเซเชตเชพเชญเชพเชตเชฟเช• เช›เซ‡ เช•เซ‡ เชธเชพเชฎเชพเชจเซเชฏ เชนเซ‡เชคเซเชตเชพเชณเซ€ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เชญเชพเชทเชพเช“เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช…เชฎเชจเซ‡ เช…เชจเซเชฏ เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เชธเซ‹เชซเซเชŸเชตเซ‡เชฐ เชกเซ‡เชตเชฒเชชเชฎเซ‡เชจเซเชŸ เชชเซเชฐเซ‡เช•เซเชŸเชฟเชธ เชฐเชœเซ‚ เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡ - เชชเชฐเซ€เช•เซเชทเชฃ.

เช† เชฒเซ‡เช–เชฎเชพเช‚, เช…เชฎเซ‡ เชœเซ‹เชˆเชถเซเช‚ เช•เซ‡ เชชเซเชฒเซเชฎเซ€ เช…เชฎเชพเชฐเชพ เชˆเชจเซเชซเซเชฐเชพเชธเซเชŸเซเชฐเช•เซเชšเชฐ-เชเช-เช•เซ‹เชกเชจเซ‡ เชšเช•เชพเชธเชตเชพเชฎเชพเช‚ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฎเชฆเชฆ เช•เชฐเซ‡ เช›เซ‡.

เชชเซเชฒเซเชฎเซ€ เชธเชพเชฅเซ‡ เช•เซ‹เชก เชคเชฐเซ€เช•เซ‡ เชˆเชจเซเชซเซเชฐเชพเชธเซเชŸเซเชฐเช•เซเชšเชฐเชจเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ. เชญเชพเช— 1

เช‡เชจเซเชซเซเชฐเชพเชธเซเชŸเซเชฐเช•เซเชšเชฐเชจเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ เชถเชพ เชฎเชพเชŸเซ‡?

เชตเชฟเช—เชคเชตเชพเชฐ เชœเชคเชพเช‚ เชชเชนเซ‡เชฒเชพเช‚, เชคเซ‡ เชชเซเชฐเชถเซเชจ เชชเซ‚เช›เชตเชพ เชฏเซ‹เช—เซเชฏ เช›เซ‡: "เชถเชพ เชฎเชพเชŸเซ‡ เช‡เชจเซเชซเซเชฐเชพเชธเซเชŸเซเชฐเช•เซเชšเชฐเชจเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ เชฌเชฟเชฒเช•เซเชฒ?" เช†เชจเชพ เชฎเชพเชŸเซ‡ เช˜เชฃเชพ เช•เชพเชฐเชฃเซ‹ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชฎเชพเช‚เชฅเซ€ เช•เซ‡เชŸเชฒเชพเช• เช…เชนเซ€เช‚ เช›เซ‡:

  • เชตเซเชฏเช•เซเชคเชฟเช—เชค เช•เชพเชฐเซเชฏเซ‹ เช…เชฅเชตเชพ เชคเชฎเชพเชฐเชพ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชฒเซ‹เชœเชฟเช•เชจเชพ เชŸเซเช•เชกเชพเช“เชจเซเช‚ เชเช•เชฎ เชชเชฐเซ€เช•เซเชทเชฃ
  • เชšเซ‹เช•เซเช•เชธ เช…เชตเชฐเซ‹เชงเซ‹ เชธเชพเชฎเซ‡ เช‡เชจเซเชซเซเชฐเชพเชธเซเชŸเซเชฐเช•เซเชšเชฐเชจเซ€ เช‡เชšเซเช›เชฟเชค เชธเซเชฅเชฟเชคเชฟเชจเซ‡ เชšเช•เชพเชธเซ‡ เช›เซ‡.
  • เชธเชพเชฎเชพเชจเซเชฏ เชญเซ‚เชฒเซ‹เชจเซ€ เชถเซ‹เชง, เชœเซ‡เชฎ เช•เซ‡ เชธเซเชŸเซ‹เชฐเซ‡เชœ เชฌเช•เซ‡เชŸเชจเชพ เชเชจเซเช•เซเชฐเชฟเชชเซเชถเชจเชจเซ‹ เช…เชญเชพเชต เช…เชฅเชตเชพ เช…เชธเซเชฐเช•เซเชทเชฟเชค, เช‡เชจเซเชŸเชฐเชจเซ‡เชŸเชฅเซ€ เชตเชฐเซเชšเซเชฏเซเช…เชฒ เชฎเชถเซ€เชจเซ‹ เชธเซเชงเซ€เชจเซ€ เช–เซเชฒเซเชฒเซ€ เชเช•เซเชธเซ‡เชธ.
  • เชˆเชจเซเชซเซเชฐเชพเชธเซเชŸเซเชฐเช•เซเชšเชฐ เชœเซ‹เช—เชตเชพเชˆเชจเชพ เช…เชฎเชฒเซ€เช•เชฐเชฃเชจเซ€ เชคเชชเชพเชธ เช•เชฐเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช.
  • เชœเซ‹เช—เชตเชพเชˆ เช•เชฐเซเชฏเชพ เชชเช›เซ€ เช•เชพเชฐเซเชฏเช•เซเชทเชฎเชคเชพ เชšเช•เชพเชธเชตเชพ เชฎเชพเชŸเซ‡ เชคเชฎเชพเชฐเชพ "เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เช•เชฐเซ‡เชฒ" เชˆเชจเซเชซเซเชฐเชพเชธเซเชŸเซเชฐเช•เซเชšเชฐเชจเซ€ เช…เช‚เชฆเชฐ เชšเชพเชฒเชคเชพ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชคเชฐเซเช•เชจเซเช‚ เชฐเชจเชŸเชพเช‡เชฎ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเชตเซเช‚.
  • เชœเซ‡เชฎ เช†เชชเชฃเซ‡ เชœเซ‹เชˆ เชถเช•เซ€เช เช›เซ€เช, เชคเซเชฏเชพเช‚ เชˆเชจเซเชซเซเชฐเชพเชธเซเชŸเซเชฐเช•เซเชšเชฐ เชชเชฐเซ€เช•เซเชทเชฃ เชตเชฟเช•เชฒเซเชชเซ‹เชจเซ€ เชตเชฟเชถเชพเชณ เชถเซเชฐเซ‡เชฃเซ€ เช›เซ‡. เชชเซ‹เชฒเซเชฎเซ€ เชชเชพเชธเซ‡ เช† เชธเซเชชเซ‡เช•เซเชŸเซเชฐเชฎ เชชเชฐเชจเชพ เชฆเชฐเซ‡เช• เชฌเชฟเช‚เชฆเซเช“ เชชเชฐ เชชเชฐเซ€เช•เซเชทเชฃ เชฎเชพเชŸเซ‡ เชฎเชฟเช•เซ‡เชจเชฟเชเชฎเซเชธ เช›เซ‡. เชšเชพเชฒเซ‹ เชชเซเชฐเชพเชฐเช‚เชญ เช•เชฐเซ€เช เช…เชจเซ‡ เชœเซ‹เชˆเช เช•เซ‡ เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡.

เชเช•เชฎ เชชเชฐเซ€เช•เซเชทเชฃ

เชชเซเชฒเซเชฎเซ€ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเซเชธ เชœเชพเชตเชพเชธเซเช•เซเชฐเชฟเชชเซเชŸ, เชชเชพเชฏเชฅเซ‹เชจ, เชŸเชพเชˆเชชเชธเซเช•เซเชฐเซ€เชชเซเชŸ เช…เชฅเชตเชพ เช—เซ‹ เชœเซ‡เชตเซ€ เชธเชพเชฎเชพเชจเซเชฏ เชนเซ‡เชคเซเชตเชพเชณเซ€ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เชญเชพเชทเชพเช“เชฎเชพเช‚ เชฒเช–เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชคเซ‡เชฅเซ€, เช† เชญเชพเชทเชพเช“เชจเซ€ เชธเช‚เชชเซ‚เชฐเซเชฃ เชถเช•เซเชคเชฟ, เชคเซ‡เชฎเชจเชพ เชธเชพเชงเชจเซ‹ เช…เชจเซ‡ เชชเซเชธเซเชคเช•เชพเชฒเชฏเซ‹ เชธเชนเชฟเชค, เชชเชฐเซ€เช•เซเชทเชฃ เชซเซเชฐเซ‡เชฎเชตเชฐเซเช• เชธเชนเชฟเชค, เชคเซ‡เชฎเชจเซ‡ เช‰เชชเชฒเชฌเซเชง เช›เซ‡. เชชเซเชฒเซเชฎเซ€ เชฎเชฒเซเชŸเชฟ-เช•เซเชฒเชพเช‰เชก เช›เซ‡, เชœเซ‡เชจเซ‹ เช…เชฐเซเชฅ เช›เซ‡ เช•เซ‡ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เซ‹เชˆเชชเชฃ เช•เซเชฒเชพเช‰เชก เชชเซเชฐเชฆเชพเชคเชพ เชชเชพเชธเซ‡เชฅเซ€ เชชเชฐเซ€เช•เซเชทเชฃ เชฎเชพเชŸเซ‡ เชฅเชˆ เชถเช•เซ‡ เช›เซ‡.

(เช† เชฒเซ‡เช–เชฎเชพเช‚, เชฌเชนเซเชญเชพเชทเซ€ เช…เชจเซ‡ เชฎเชฒเซเชŸเซ€เช•เซเชฒเชพเช‰เชก เชนเซ‹เชตเชพ เช›เชคเชพเช‚, เช…เชฎเซ‡ JavaScript เช…เชจเซ‡ Mocha เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เช เช›เซ€เช เช…เชจเซ‡ AWS เชชเชฐ เชงเซเชฏเชพเชจ เช•เซ‡เชจเซเชฆเซเชฐเชฟเชค เช•เชฐเซ€เช เช›เซ€เช. เชคเชฎเซ‡ Python เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹. unittest, เชŸเซ‡เชธเซเชŸ เชซเซเชฐเซ‡เชฎเชตเชฐเซเช• เชชเชฐ เชœเชพเช“, เช…เชฅเชตเชพ เชคเชฎเชจเซ‡ เช—เชฎเซ‡ เชคเซ‡ เช•เซ‹เชˆเชชเชฃ เช…เชจเซเชฏ เชŸเซ‡เชธเซเชŸ เชซเซเชฐเซ‡เชฎเชตเชฐเซเช•. เช…เชจเซ‡, เช…เชฒเชฌเชคเซเชค, เชชเซเชฒเซเชฎเซ€ เชเชเซเชฏเซเชฐ, เช—เซ‚เช—เชฒ เช•เซเชฒเชพเช‰เชก, เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชธเชพเชฅเซ‡ เชธเชฐเชธ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡.)

เชœเซ‡เชฎ เช†เชชเชฃเซ‡ เชœเซ‹เชฏเซเช‚ เชคเซ‡เชฎ, เชคเชฎเซ‡ เชคเชฎเชพเชฐเชพ เช‡เชจเซเชซเซเชฐเชพเชธเซเชŸเซเชฐเช•เซเชšเชฐ เช•เซ‹เชกเชจเซ‡ เชšเช•เชพเชธเชตเชพ เชฎเชพเช—เชคเชพ เชนเซ‹เชˆ เชถเช•เซ‹ เชคเซ‡เชจเชพ เช˜เชฃเชพ เช•เชพเชฐเชฃเซ‹ เช›เซ‡. เชคเซ‡เชฎเชพเช‚เชฅเซ€ เชเช• เชชเชฐเช‚เชชเชฐเชพเช—เชค เชเช•เชฎ เชชเชฐเซ€เช•เซเชทเชฃ เช›เซ‡. เช•เชพเชฐเชฃ เช•เซ‡ เชคเชฎเชพเชฐเชพ เช•เซ‹เชกเชฎเชพเช‚ เช•เชพเชฐเซเชฏเซ‹ เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡ - เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, CIDR เชจเซ€ เช—เชฃเชคเชฐเซ€ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เช—เชคเชฟเชถเซ€เชฒ เชฐเซ€เชคเซ‡ เชจเชพเชฎเซ‹, เชŸเซ…เช—เซเชธ เชตเช—เซ‡เชฐเซ‡เชจเซ€ เช—เชฃเชคเชฐเซ€ เช•เชฐเซ‹. - เชคเชฎเซ‡ เช•เชฆเชพเชš เชคเซ‡เชฎเชจเซ‡ เชšเช•เชพเชธเชตเชพ เชฎเชพเช‚เช—เซ‹ เช›เซ‹. เช† เชคเชฎเชพเชฐเซ€ เชฎเชจเชชเชธเช‚เชฆ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เชญเชพเชทเชพเชฎเชพเช‚ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซเชธ เชฎเชพเชŸเซ‡ เชจเชฟเชฏเชฎเชฟเชค เชเช•เชฎ เชชเชฐเซ€เช•เซเชทเชฃเซ‹ เชฒเช–เชตเชพ เชœเซ‡เชตเซเช‚ เชœ เช›เซ‡.
เชฅเซ‹เชกเซ€ เชตเชงเซ เชœเชŸเชฟเชฒ เชฌเชจเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเซ‡ เชšเช•เชพเชธเซ€ เชถเช•เซ‹ เช›เซ‹ เช•เซ‡ เชคเชฎเชพเชฐเซ‹ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎ เชธเช‚เชธเชพเชงเชจเซ‹เชจเซ€ เชซเชพเชณเชตเชฃเซ€ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชฐเซ‡ เช›เซ‡. เชธเชฎเชœเชพเชตเชตเชพ เชฎเชพเชŸเซ‡, เชšเชพเชฒเซ‹ เช•เชฒเซเชชเชจเชพ เช•เชฐเซ€เช เช•เซ‡ เช†เชชเชฃเซ‡ เชเช• เชธเชฐเชณ EC2 เชธเชฐเซเชตเชฐ เชฌเชจเชพเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เช…เชจเซ‡ เช…เชฎเซ‡ เชจเซ€เชšเซ‡เชจเชพเชจเซ€ เช–เชพเชคเชฐเซ€ เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ€เช เช›เซ€เช:

  • เชฆเชพเช–เชฒเชพเช“เชฎเชพเช‚ เชŸเซ‡เช— เชนเซ‹เชฏ เช›เซ‡ Name.
  • เช‡เชจเซเชธเซเชŸเชจเซเชธเซ‡ เช‡เชจเชฒเชพเช‡เชจ เชธเซเช•เซเชฐเชฟเชชเซเชŸเชจเซ‹ เช‰เชชเชฏเซ‹เช— เชจ เช•เชฐเชตเซ‹ เชœเซ‹เช‡เช userData - เช†เชชเชฃเซ‡ AMI (เช‡เชฎเซ‡เชœ) เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹ เชœเซ‹เชˆเช.
  • เช‡เชจเซเชŸเชฐเชจเซ‡เชŸ เชชเชฐ เช•เซ‹เชˆ SSH เช–เซเชฒเซเชฒเซเช‚ เชนเซ‹เชตเซเช‚ เชœเซ‹เชˆเช เชจเชนเซ€เช‚.

เช† เช‰เชฆเชพเชนเชฐเชฃ เชชเชฐ เช†เชงเชพเชฐเชฟเชค เช›เซ‡ เชฎเชพเชฐเซเช‚ เช‰เชฆเชพเชนเชฐเชฃ aws-js-webserver:

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

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹