เจชเฉเจฒเฉเจฎเฉ€ เจฆเฉ‡ เจจเจพเจฒ เจ•เฉ‹เจก เจฆเฉ‡ เจคเฉŒเจฐ 'เจคเฉ‡ เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจขเจพเจ‚เจšเฉ‡ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจจเจพเฅค เจญเจพเจ— 1

เจธเจผเฉเจญ เจฆเฉเจชเจนเจฟเจฐ เจฆเฉ‹เจธเจคเฉ‹เฅค เจฆเจฐ 'เจคเฉ‡ เจ‡เฉฑเจ• เจจเจตเฉ‡เจ‚ เจชเฉเจฐเจตเจพเจน เจฆเฉ€ เจธเจผเฉเจฐเฉ‚เจ†เจค เจฆเฉ€ เจ‰เจฎเฉ€เจฆ เจตเจฟเฉฑเจš "DevOps เจ…เจญเจฟเจ†เจธ เจ…เจคเฉ‡ เจธเจพเจงเจจ" เจ…เจธเฉ€เจ‚ เจคเฉเจนเจพเจกเฉ‡ เจจเจพเจฒ เจจเจตเจพเจ‚ เจ…เจจเฉเจตเจพเจฆ เจธเจพเจ‚เจเจพ เจ•เจฐ เจฐเจนเฉ‡ เจนเจพเจ‚เฅค เจœเจพเจฃเจพ.

เจชเฉเจฒเฉเจฎเฉ€ เจฆเฉ‡ เจจเจพเจฒ เจ•เฉ‹เจก เจฆเฉ‡ เจคเฉŒเจฐ 'เจคเฉ‡ เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจขเจพเจ‚เจšเฉ‡ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจจเจพเฅค เจญเจพเจ— 1

เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจขเจพเจ‚เจšเจพ เจ•เฉ‹เจก (เจ•เฉ‹เจก เจตเจœเฉ‹เจ‚ เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจขเจพเจ‚เจšเจพ) เจฒเจˆ เจชเฉเจฒเฉเจฎเฉ€ เจ…เจคเฉ‡ เจ†เจฎ-เจ‰เจฆเฉ‡เจธเจผ เจฆเฉ€เจ†เจ‚ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฟเฉฐเจ— เจญเจพเจธเจผเจพเจตเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจเจพ เจฌเจนเฉเจค เจธเจพเจฐเฉ‡ เจซเจพเจ‡เจฆเฉ‡ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆ: เจนเฉเจจเจฐ เจ…เจคเฉ‡ เจ—เจฟเจ†เจจ เจฆเฉ€ เจ‰เจชเจฒเจฌเจงเจคเจพ, เจเจฌเจธเจŸเจฐเฉˆเจ•เจธเจผเจจ เจฆเฉเจ†เจฐเจพ เจ•เฉ‹เจก เจตเจฟเฉฑเจš เจฌเจพเจ‡เจฒเจฐเจชเจฒเฉ‡เจŸ เจจเฉ‚เฉฐ เจ–เจคเจฎ เจ•เจฐเจจเจพ, เจคเฉเจนเจพเจกเฉ€ เจŸเฉ€เจฎ เจฒเจˆ เจœเจพเจฃเฉ‚ เจŸเฉ‚เจฒ, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ IDEs เจ…เจคเฉ‡ lintersเฅค เจ‡เจน เจธเจพเจฐเฉ‡ เจธเจพเจซเจŸเจตเฉ‡เจ…เจฐ เจ‡เฉฐเจœเจจเฉ€เจ…เจฐเจฟเฉฐเจ— เจŸเฉ‚เจฒ เจจเจพ เจธเจฟเจฐเจซเจผ เจธเจพเจจเฉ‚เฉฐ เจตเจงเฉ‡เจฐเฉ‡ เจฒเจพเจญเจ•เจพเจฐเฉ€ เจฌเจฃเจพเจ‰เจ‚เจฆเฉ‡ เจนเจจ, เจธเจ—เฉ‹เจ‚ เจธเจพเจกเฉ‡ เจ•เฉ‹เจก เจฆเฉ€ เจ—เฉเจฃเจตเฉฑเจคเจพ เจตเจฟเฉฑเจš เจตเฉ€ เจธเฉเจงเจพเจฐ เจ•เจฐเจฆเฉ‡ เจนเจจเฅค เจ‡เจธ เจฒเจˆ, เจ‡เจน เจธเจฟเจฐเจซ เจ•เฉเจฆเจฐเจคเฉ€ เจนเฉˆ เจ•เจฟ เจ†เจฎ-เจ‰เจฆเฉ‡เจธเจผ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฟเฉฐเจ— เจญเจพเจธเจผเจพเจตเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจธเจพเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจนเฉ‹เจฐ เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจธเฉŒเจซเจŸเจตเฉ‡เจ…เจฐ เจตเจฟเจ•เจพเจธ เจ…เจญเจฟเจ†เจธ เจชเฉ‡เจธเจผ เจ•เจฐเจจ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเฉ€ เจนเฉˆ - เจŸเฉˆเจธเจŸเจฟเฉฐเจ—.

เจ‡เจธ เจฒเฉ‡เจ– เจตเจฟเฉฑเจš, เจ…เจธเฉ€เจ‚ เจฆเฉ‡เจ–เจพเจ‚เจ—เฉ‡ เจ•เจฟ เจชเฉเจฒเฉเจฎเฉ€ เจธเจพเจกเฉ‡ เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจขเจพเจ‚เจšเฉ‡ เจฆเฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจ•เฉ‹เจก เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจจ เจตเจฟเฉฑเจš เจธเจพเจกเฉ€ เจ•เจฟเจตเฉ‡เจ‚ เจฎเจฆเจฆ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจชเฉเจฒเฉเจฎเฉ€ เจฆเฉ‡ เจจเจพเจฒ เจ•เฉ‹เจก เจฆเฉ‡ เจคเฉŒเจฐ 'เจคเฉ‡ เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจขเจพเจ‚เจšเฉ‡ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจจเจพเฅค เจญเจพเจ— 1

เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจขเจพเจ‚เจšเฉ‡ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฟเจ‰เจ‚?

เจตเจฟเจธเจฅเจพเจฐ เจตเจฟเฉฑเจš เจœเจพเจฃ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚, เจ‡เจน เจธเจตเจพเจฒ เจชเฉเฉฑเจ›เจฃเจพ เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจฃ เจนเฉˆ: "เจ•เจฟเจ‰เจ‚ เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจขเจพเจ‚เจšเฉ‡ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ?" เจ‡เจธ เจฆเฉ‡ เจฌเจนเฉเจค เจธเจพเจฐเฉ‡ เจ•เจพเจฐเจจ เจนเจจ เจ…เจคเฉ‡ เจ‡เฉฑเจฅเฉ‡ เจ‰เจนเจจเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ•เฉเจ เจนเจจ:

  • เจตเจฟเจ…เจ•เจคเฉ€เจ—เจค เจซเฉฐเจ•เจธเจผเจจเจพเจ‚ เจœเจพเจ‚ เจคเฉเจนเจพเจกเฉ‡ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจคเจฐเจ• เจฆเฉ‡ เจŸเฉเจ•เฉœเจฟเจ†เจ‚ เจฆเฉ€ เจฏเฉ‚เจจเจฟเจŸ เจŸเฉˆเจธเจŸเจฟเฉฐเจ—
  • เจ•เฉเจ เจฐเฉเจ•เจพเจตเจŸเจพเจ‚ เจฆเฉ‡ เจตเจฟเจฐเฉเฉฑเจง เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจขเจพเจ‚เจšเฉ‡ เจฆเฉ€ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ€ เจธเจฅเจฟเจคเฉ€ เจฆเฉ€ เจชเฉเจธเจผเจŸเฉ€ เจ•เจฐเจฆเจพ เจนเฉˆเฅค
  • เจ†เจฎ เจคเจฐเฉเจŸเฉ€เจ†เจ‚ เจฆเจพ เจชเจคเจพ เจฒเจ—เจพเจ‰เจฃเจพ, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจธเจŸเฉ‹เจฐเฉ‡เจœ เจฌเจพเจฒเจŸเฉ€ เจฆเฉ€ เจเจจเจ•เฉเจฐเจฟเจชเจธเจผเจจ เจฆเฉ€ เจ˜เจพเจŸ เจœเจพเจ‚ เจ…เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค, เจ‡เฉฐเจŸเจฐเจจเฉˆเจŸ เจคเฉ‹เจ‚ เจตเจฐเจšเฉเจ…เจฒ เจฎเจธเจผเฉ€เจจเจพเจ‚ เจคเฉฑเจ• เจ–เฉเฉฑเจฒเฉเจนเฉ€ เจชเจนเฉเฉฐเจšเฅค
  • เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจขเจพเจ‚เจšเฉ‡ เจฆเฉ‡ เจชเฉเจฐเจฌเฉฐเจง เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐ เจฐเจฟเจนเจพ เจนเฉˆเฅค
  • เจชเฉเจฐเฉ‹เจตเจฟเจœเจผเจจเจฟเฉฐเจ— เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจ•เจพเจฐเจœเจ•เฉเจธเจผเจฒเจคเจพ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจจ เจฒเจˆ เจคเฉเจนเจพเจกเฉ‡ "เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจ•เฉ€เจคเฉ‡" เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจขเจพเจ‚เจšเฉ‡ เจฆเฉ‡ เจ…เฉฐเจฆเจฐ เจšเฉฑเจฒ เจฐเจนเฉ‡ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจคเจฐเจ• เจฆเฉ€ เจฐเจจเจŸเจพเจˆเจฎ เจŸเฉˆเจธเจŸเจฟเฉฐเจ— เจ•เจฐเจจเจพเฅค
  • เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจ…เจธเฉ€เจ‚ เจฆเฉ‡เจ– เจธเจ•เจฆเฉ‡ เจนเจพเจ‚, เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจขเจพเจ‚เจšเฉ‡ เจฆเฉ‡ เจŸเฉˆเจธเจŸเจฟเฉฐเจ— เจตเจฟเจ•เจฒเจชเจพเจ‚ เจฆเฉ€ เจ‡เฉฑเจ• เจตเจฟเจธเจผเจพเจฒ เจธเจผเฉเจฐเฉ‡เจฃเฉ€ เจนเฉˆ. เจชเฉ‹เจฒเฉ‚เจฎเฉ€ เจ•เฉ‹เจฒ เจ‡เจธ เจธเจชเฉˆเจ•เจŸเฉเจฐเจฎ เจฆเฉ‡ เจนเจฐ เจฌเจฟเฉฐเจฆเฉ‚ 'เจคเฉ‡ เจŸเฉˆเจธเจŸ เจ•เจฐเจจ เจฒเจˆ เจตเจฟเจงเฉ€ เจนเฉˆเฅค เจ†เจ“ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเฉ€เจ เจ…เจคเฉ‡ เจฆเฉ‡เจ–เจฆเฉ‡ เจนเจพเจ‚ เจ•เจฟ เจ‡เจน เจ•เจฟเจตเฉ‡เจ‚ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจฏเฉ‚เจจเจฟเจŸ เจŸเฉˆเจธเจŸเจฟเฉฐเจ—

เจชเฉเจฒเฉเจฎเฉ€ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎ เจ†เจฎ-เจ‰เจฆเฉ‡เจธเจผ เจตเจพเจฒเฉ€เจ†เจ‚ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฟเฉฐเจ— เจญเจพเจธเจผเจพเจตเจพเจ‚ เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ JavaScript, Python, TypeScript เจœเจพเจ‚ Go เจตเจฟเฉฑเจš เจฒเจฟเจ–เฉ‡ เจœเจพเจ‚เจฆเฉ‡ เจนเจจเฅค เจ‡เจธ เจฒเจˆ, เจ‡เจนเจจเจพเจ‚ เจญเจพเจธเจผเจพเจตเจพเจ‚ เจฆเฉ€ เจชเฉ‚เจฐเฉ€ เจธเจผเจ•เจคเฉ€, เจ‰เจนเจจเจพเจ‚ เจฆเฉ‡ เจธเฉฐเจฆเจพเจ‚ เจ…เจคเฉ‡ เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€เจ†เจ‚ เจธเจฎเฉ‡เจค, เจŸเฉˆเจธเจŸ เจซเจฐเฉ‡เจฎเจตเจฐเจ• เจธเจฎเฉ‡เจค, เจ‰เจนเจจเจพเจ‚ เจฒเจˆ เจ‰เจชเจฒเจฌเจง เจนเฉˆเฅค เจชเฉเจฒเฉเจฎเฉ€ เจฎเจฒเจŸเฉ€-เจ•เจฒเจพเจŠเจก เจนเฉˆ, เจœเจฟเจธเจฆเจพ เจฎเจคเจฒเจฌ เจนเฉˆ เจ•เจฟ เจ‡เจธเจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจ•เจฒเจพเจ‰เจก เจชเฉเจฐเจฆเจพเจคเจพ เจคเฉ‹เจ‚ เจœเจพเจ‚เจš เจฒเจˆ เจ•เฉ€เจคเฉ€ เจœเจพ เจธเจ•เจฆเฉ€ เจนเฉˆเฅค

(เจ‡เจธ เจฒเฉ‡เจ– เจตเจฟเฉฑเจš, เจฌเจนเฉเจญเจพเจธเจผเจพเจˆ เจ…เจคเฉ‡ เจฎเจฒเจŸเฉ€เจ•เจฒเจพเจ‰เจก เจนเฉ‹เจฃ เจฆเฉ‡ เจฌเจพเจตเจœเฉ‚เจฆ, เจ…เจธเฉ€เจ‚ JavaScript เจ…เจคเฉ‡ Mocha เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚ เจ…เจคเฉ‡ AWS 'เจคเฉ‡ เจงเจฟเจ†เจจ เจ•เฉ‡เจ‚เจฆเจฐเจฟเจค เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚เฅค เจคเฉเจธเฉ€เจ‚ เจชเจพเจˆเจฅเจจ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค 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();
                }
            });
        });

เจ…เจคเฉ‡ เจ…เฉฐเจค เจตเจฟเฉฑเจš, เจ†เจ“ เจคเฉ€เจœเจพ เจŸเฉˆเจธเจŸ เจฒเจฟเจ–เฉ€เจเฅค เจ‡เจน เจฅเฉ‹เฉœเจพ เจนเฉ‹เจฐ เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจนเฉ‹เจตเฉ‡เจ—เจพ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ…เจธเฉ€เจ‚ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจธเจฎเฉ‚เจน เจจเจพเจฒ เจœเฉเฉœเฉ‡ เจฒเฉŒเจ—เจ‡เจจ เจจเจฟเจฏเจฎเจพเจ‚ เจฆเฉ€ เจ–เฉ‹เจœ เจ•เจฐ เจฐเจนเฉ‡ เจนเจพเจ‚, เจœเจฟเจจเฉเจนเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจฌเจนเฉเจค เจธเจพเจฐเฉ‡ เจนเฉ‹ เจธเจ•เจฆเฉ‡ เจนเจจ, เจ…เจคเฉ‡ เจ‰เจนเจจเจพเจ‚ เจจเจฟเจฏเจฎเจพเจ‚ เจตเจฟเฉฑเจš เจธเฉ€เจ†เจˆเจกเฉ€เจ†เจฐ เจฐเฉ‡เจ‚เจœ เจนเจจ, เจœเจฟเจจเฉเจนเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจฌเจนเฉเจค เจธเจพเจฐเฉ‡ เจนเฉ‹ เจธเจ•เจฆเฉ‡ เจนเจจเฅค เจชเจฐ เจ…เจธเฉ€เจ‚ เจชเฉเจฐเจฌเฉฐเจงเจฟเจค เจ•เฉ€เจคเจพ:

    // 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

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹