เดชเตเดฒเตเดฎเดฟเด•เตเด•เตŠเดชเตเดชเด‚ เด…เดŸเดฟเดธเตเดฅเดพเดจ เดธเต—เด•เดฐเตเดฏเด™เตเด™เตพ เด•เต‹เดกเดพเดฏเดฟ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเต. เดญเดพเด—เด‚ 1

เด—เตเดกเต เด†เดซเตเดฑเตเดฑเตผเดจเต‚เตบ เดธเตเดนเตƒเดคเตเดคเตเด•เตเด•เดณเต†. เดจเดฟเดฐเด•เตเด•เดฟเตฝ เด’เดฐเต เดชเตเดคเดฟเดฏ เด’เดดเตเด•เตเด•เดฟเดจเตเดฑเต† เด†เดฐเด‚เดญเด‚ เดชเตเดฐเดคเต€เด•เตเดทเดฟเดšเตเดšเต "DevOps เดชเตเดฐเดพเด•เตเดŸเต€เดธเตเด•เดณเตเด‚ เดŸเต‚เดณเตเด•เดณเตเด‚" เดžเด™เตเด™เตพ เดจเดฟเด™เตเด™เดณเตเดฎเดพเดฏเดฟ เด’เดฐเต เดชเตเดคเดฟเดฏ เดตเดฟเดตเตผเดคเตเดคเดจเด‚ เดชเด™เตเด•เดฟเดŸเตเดจเตเดจเต. เดชเต‹เด•เต‚.

เดชเตเดฒเตเดฎเดฟเด•เตเด•เตŠเดชเตเดชเด‚ เด…เดŸเดฟเดธเตเดฅเดพเดจ เดธเต—เด•เดฐเตเดฏเด™เตเด™เตพ เด•เต‹เดกเดพเดฏเดฟ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเต. เดญเดพเด—เด‚ 1

เด‡เตปเดซเตเดฐเดพเดธเตเดŸเตเดฐเด•เตเดšเตผ เด•เต‹เดกเดฟเดจเดพเดฏเดฟ เดชเตเดฒเตเดฎเดฟเดฏเตเด‚ เดชเตŠเดคเต-เด‰เดฆเตเดฆเต‡เดถเตเดฏ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเด‚เด—เต เดญเดพเดทเด•เดณเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเต (เด‡เตปเดซเตเดฐเดพเดธเตเดŸเตเดฐเด•เตเดšเตผ เด•เต‹เดกเดพเดฏเดฟ) เดจเดฟเดฐเดตเดงเดฟ เด—เตเดฃเด™เตเด™เตพ เดจเตฝเด•เตเดจเตเดจเต: เด•เดดเดฟเดตเตเด•เดณเตเดŸเต†เดฏเตเด‚ เด…เดฑเดฟเดตเดฟเดจเตเดฑเต†เดฏเตเด‚ เดฒเดญเตเดฏเดค, เด…เดฎเต‚เตผเดคเตเดคเดคเดฏเดฟเดฒเต‚เดŸเต† เด•เต‹เดกเดฟเดฒเต† เดฌเต‹เดฏเดฟเดฒเตผเดชเตเดฒเต‡เดฑเตเดฑเต เด‡เดฒเตเดฒเดพเดคเดพเด•เตเด•เตฝ, เดจเดฟเด™เตเด™เดณเตเดŸเต† เดŸเต€เดฎเดฟเดจเต เดชเดฐเดฟเดšเดฟเดคเดฎเดพเดฏ เด‰เดชเด•เดฐเดฃเด™เตเด™เตพ, เดเดกเดฟเด‡เด•เตพ, เดฒเดฟเดจเตเดฑเดฑเตเด•เตพ เดŽเดจเตเดจเดฟเดต. เดˆ เดธเต‹เดซเตโ€Œเดฑเตเดฑเตโ€Œเดตเต†เดฏเตผ เดŽเดžเตเดšเดฟเดจเต€เดฏเดฑเดฟเด‚เด—เต เด‰เดชเด•เดฐเดฃเด™เตเด™เดณเต†เดฒเตเดฒเดพเด‚ เดžเด™เตเด™เดณเต† เด•เต‚เดŸเตเดคเตฝ เด‰เตฝเดชเตเดชเดพเดฆเดจเด•เตเดทเดฎเดฎเดพเด•เตเด•เตเด• เดฎเดพเดคเตเดฐเดฎเดฒเตเดฒ, เดžเด™เตเด™เดณเตเดŸเต† เด•เต‹เดกเดฟเดจเตเดฑเต† เด—เตเดฃเดจเดฟเดฒเดตเดพเดฐเด‚ เดฎเต†เดšเตเดšเดชเตเดชเต†เดŸเตเดคเตเดคเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เด…เดคเดฟเดจเดพเตฝ, เดชเตŠเดคเต-เด‰เดฆเตเดฆเต‡เดถเตเดฏ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเด‚เด—เต เดญเดพเดทเด•เดณเตเดŸเต† เด‰เดชเดฏเต‹เด—เด‚ เดฎเดฑเตเดฑเตŠเดฐเต เดชเตเดฐเดงเดพเดจ เดธเต‹เดซเตโ€Œเดฑเตเดฑเตโ€Œเดตเต†เดฏเตผ เดกเต†เดตเดฒเดชเตโ€Œเดฎเต†เดจเตเดฑเต เดชเตเดฐเดพเด•เตเดŸเต€เดธเต เด…เดตเดคเดฐเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เดžเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเดคเต เดธเตเดตเดพเดญเดพเดตเดฟเด•เดฎเดพเดฃเต - เดชเดฐเดฟเดถเต‹เดงเดจ.

เดˆ เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ, เดžเด™เตเด™เดณเตเดŸเต† เด‡เตปเดซเตเดฐเดพเดธเตเดŸเตเดฐเด•เตเดšเตผ เด•เต‹เดกเต เด†เดฏเดฟ เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เดพเตป เดชเตเดฒเตเดฎเดฟ เดžเด™เตเด™เดณเต† เดŽเด™เตเด™เดจเต† เดธเดนเดพเดฏเดฟเด•เตเด•เตเดจเตเดจเตเดตเต†เดจเตเดจเต เดจเต‹เด•เตเด•เดพเด‚.

เดชเตเดฒเตเดฎเดฟเด•เตเด•เตŠเดชเตเดชเด‚ เด…เดŸเดฟเดธเตเดฅเดพเดจ เดธเต—เด•เดฐเตเดฏเด™เตเด™เตพ เด•เต‹เดกเดพเดฏเดฟ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเต. เดญเดพเด—เด‚ 1

เดŽเดจเตเดคเตเด•เตŠเดฃเตเดŸเดพเดฃเต เด…เดŸเดฟเดธเตเดฅเดพเดจ เดธเต—เด•เดฐเตเดฏเด™เตเด™เตพ เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเดคเต?

เดตเดฟเดถเดฆเดพเด‚เดถเด™เตเด™เดณเดฟเดฒเต‡เด•เตเด•เต เดชเต‹เด•เตเดจเตเดจเดคเดฟเดจเตเดฎเตเดฎเตเดชเต, โ€œเดŽเดจเตเดคเตเด•เตŠเดฃเตเดŸเดพเดฃเต เด…เดŸเดฟเดธเตเดฅเดพเดจ เดธเต—เด•เดฐเตเดฏเด™เตเด™เตพ เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจเดคเต?โ€ เดŽเดจเตเดจ เดšเต‹เดฆเตเดฏเด‚ เดšเต‹เดฆเดฟเด•เตเด•เตเดจเตเดจเดคเต เดฎเต‚เดฒเตเดฏเดตเดคเตเดคเดพเดฃเต. เด‡เดคเดฟเดจเต เดจเดฟเดฐเดตเดงเดฟ เด•เดพเดฐเดฃเด™เตเด™เดณเตเดฃเตเดŸเต, เด…เดตเดฏเดฟเตฝ เดšเดฟเดฒเดคเต เด‡เดคเดพ:

  • เดจเดฟเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดฒเต‹เดœเดฟเด•เตเด•เดฟเดจเตเดฑเต† เดตเตเดฏเด•เตเดคเดฟเด—เดค เดซเด‚เด—เตโ€Œเดทเดจเตเด•เดณเตเดŸเต†เดฏเต‹ เดถเด•เดฒเด™เตเด™เดณเตเดŸเต†เดฏเต‹ เดฏเต‚เดฃเดฟเดฑเตเดฑเต เดชเดฐเดฟเดถเต‹เดงเดจ
  • เดšเดฟเดฒ เดจเดฟเดฏเดจเตเดคเตเดฐเดฃเด™เตเด™เตพเด•เตเด•เต†เดคเดฟเดฐเต† เด…เดŸเดฟเดธเตเดฅเดพเดจ เดธเต—เด•เดฐเตเดฏเดคเตเดคเดฟเดจเตเดฑเต† เด†เดตเดถเตเดฏเดฎเตเดณเตเดณ เด…เดตเดธเตเดฅ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเต.
  • เด’เดฐเต เดธเตเดฑเตเดฑเต‹เดฑเต‡เดœเต เดฌเด•เตเด•เดฑเตเดฑเดฟเดจเตเดฑเต† เดŽเตปเด•เตเดฐเดฟเดชเตเดทเดจเตเดฑเต† เด…เดญเดพเดตเด‚ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดธเตเดฐเด•เตเดทเดฟเดคเดฎเดฒเตเดฒเดพเดคเตเดค, เด‡เดจเตเดฑเตผเดจเต†เดฑเตเดฑเดฟเตฝ เดจเดฟเดจเตเดจเต เดตเต†เตผเดšเตเดตเตฝ เดฎเต†เดทเต€เดจเตเด•เดณเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เดคเตเดฑเดจเตเดจ เด†เด•เตเดธเดธเต เดชเต‹เดฒเตเดณเตเดณ เดธเดพเดงเดพเดฐเดฃ เดชเดฟเดถเด•เตเด•เตพ เด•เดฃเตเดŸเต†เดคเตเดคเตฝ.
  • เด…เดŸเดฟเดธเตเดฅเดพเดจ เดธเต—เด•เดฐเตเดฏเด™เตเด™เตพ เด’เดฐเตเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดฑเต† เดจเดŸเดคเตเดคเดฟเดชเตเดชเต เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเต.
  • เดชเตเดฐเตŠเดตเดฟเดทเดจเดฟเด‚เด—เดฟเดจเต เดถเต‡เดทเดฎเตเดณเตเดณ เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดค เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดพเดฏเดฟ เดจเดฟเด™เตเด™เดณเตเดŸเต† "เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดšเต†เดฏเตเดค" เด‡เตปเดซเตเดฐเดพเดธเตเดŸเตเดฐเด•เตเดšเดฑเดฟเดจเตเดณเตเดณเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดฒเต‹เดœเดฟเด•เตเด•เดฟเดจเตเดฑเต† เดฑเตบเดŸเตˆเด‚ เดŸเต†เดธเตเดฑเตเดฑเดฟเด‚เด—เต เดจเดŸเดคเตเดคเตเดจเตเดจเต.
  • เดจเดฎเตเด•เตเด•เต เด•เดพเดฃเดพเดจเดพเด•เตเดจเตเดจเดคเตเดชเต‹เดฒเต†, เด‡เตปเดซเตเดฐเดพเดธเตเดŸเตเดฐเด•เตเดšเตผ เดŸเต†เดธเตเดฑเตเดฑเดฟเด‚เด—เต เด“เดชเตเดทเดจเตเด•เดณเตเดŸเต† เดตเดฟเดถเดพเดฒเดฎเดพเดฏ เดถเตเดฐเต‡เดฃเดฟ เด‰เดฃเตเดŸเต. เดˆ เดธเตเดชเต†เด•เตโ€ŒเดŸเตเดฐเดคเตเดคเดฟเดฒเต† เด“เดฐเต‹ เดชเต‹เดฏเดฟเดจเตเดฑเดฟเดฒเตเด‚ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเดจเตเดณเตเดณ เดธเด‚เดตเดฟเดงเดพเดจเด™เตเด™เตพ เดชเต‹เดฒเตเดฎเดฟเดฏเดฟเดฒเตเดฃเตเดŸเต. เดจเดฎเตเด•เตเด•เต เด†เดฐเด‚เดญเดฟเดšเตเดšเต เด‡เดคเต เดŽเด™เตเด™เดจเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเตเดตเต†เดจเตเดจเต เดจเต‹เด•เตเด•เดพเด‚.

เดฏเต‚เดฃเดฟเดฑเตเดฑเต เดชเดฐเดฟเดถเต‹เดงเดจ

เดœเดพเดตเดพเดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต, เดชเตˆเดคเตเดคเตบ, เดŸเตˆเดชเตเดชเตเดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด—เต‹ เดชเต‹เดฒเตเดณเตเดณ เดชเตŠเดคเต-เด‰เดฆเตเดฆเต‡เดถเตเดฏ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเด‚เด—เต เดญเดพเดทเด•เดณเดฟเดฒเดพเดฃเต เดชเตเดฒเตเดฎเดฟ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเตเด•เตพ เดŽเดดเตเดคเดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต. เด…เดคเดฟเดจเดพเตฝ, เดชเดฐเต€เด•เตเดทเดฃ เดšเดŸเตเดŸเด•เตเด•เต‚เดŸเตเด•เตพ เด‰เตพเดชเตเดชเต†เดŸเต†เดฏเตเดณเตเดณ เด‰เดชเด•เดฐเดฃเด™เตเด™เดณเตเด‚ เดฒเตˆเดฌเตเดฐเดฑเดฟเด•เดณเตเด‚ เด‰เตพเดชเตเดชเต†เดŸเต† เดˆ เดญเดพเดทเด•เดณเตเดŸเต† เดฎเตเดดเตเดตเตป เดถเด•เตเดคเดฟเดฏเตเด‚ เด…เดตเตผเด•เตเด•เต เดฒเดญเตเดฏเดฎเดพเดฃเต. เดชเตเดฒเตเดฎเดฟ เด’เดฐเต เดฎเตพเดŸเตเดŸเดฟ-เด•เตเดฒเต—เดกเดพเดฃเต, เด…เดคเดพเดฏเดคเต เดเดคเต เด•เตเดฒเต—เดกเต เดฆเดพเดคเดพเดตเดฟเตฝ เดจเดฟเดจเตเดจเตเด‚ เด‡เดคเต เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเตป เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเด‚.

(เดˆ เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ, เดฌเดนเตเดญเดพเดทเดฏเตเด‚ เดฎเตพเดŸเตเดŸเดฟเด•เตเดฒเต—เดกเตเด‚ เด†เดฃเต†เด™เตเด•เดฟเดฒเตเด‚, เดžเด™เตเด™เตพ เดœเดพเดตเดพเดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตเด‚ เดฎเต‹เดšเตเดšเดฏเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต เด•เต‚เดŸเดพเดคเต† AWS-เตฝ เดถเตเดฐเดฆเตเดง เด•เต‡เดจเตเดฆเตเดฐเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเต. เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดชเตˆเดคเตเดคเตบ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเด‚. unittest, เดŸเต†เดธเตเดฑเตเดฑเต เดšเดŸเตเดŸเด•เตเด•เต‚เดŸเต, เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดจเดฟเด™เตเด™เตพ เด‡เดทเตเดŸเดชเตเดชเต†เดŸเตเดจเตเดจ เดฎเดฑเตเดฑเต‡เดคเต†เด™เตเด•เดฟเดฒเตเด‚ เดŸเต†เดธเตเดฑเตเดฑเต เดซเตเดฐเต†เดฏเดฟเด‚เดตเตผเด•เตเด•เต เดชเต‹เด•เตเด•. เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚, เดชเตเดฒเตเดฎเดฟ เด…เดธเต‚เตผ, เด—เต‚เด—เดฟเตพ เด•เตเดฒเต—เดกเต, เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเต เดŽเดจเตเดจเดฟเดตเดฏเดฟเตฝ เดฎเดฟเด•เดšเตเดš เดฐเต€เดคเดฟเดฏเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต.)

เดžเด™เตเด™เตพ เด•เดฃเตเดŸเดคเตเดชเต‹เดฒเต†, เดจเดฟเด™เตเด™เดณเตเดŸเต† เด‡เตปเดซเตเดฐเดพเดธเตเดŸเตเดฐเด•เตเดšเตผ เด•เต‹เดกเต เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เตพ เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดจเดฟเดฐเดตเดงเดฟ เด•เดพเดฐเดฃเด™เตเด™เดณเตเดฃเตเดŸเต. เด…เดคเดฟเดฒเตŠเดจเตเดจเดพเดฃเต เดชเดฐเดฎเตเดชเดฐเดพเด—เดค เดฏเต‚เดฃเดฟเดฑเตเดฑเต เดŸเต†เดธเตเดฑเตเดฑเดฟเด‚เด—เต. เด•เดพเดฐเดฃเด‚ เดจเดฟเด™เตเด™เดณเตเดŸเต† เด•เต‹เดกเดฟเดจเต เดซเด‚เด—เตโ€Œเดทเดจเตเด•เตพ เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเดฟเด•เตเด•เดพเด‚ - เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, CIDR เด•เดฃเด•เตเด•เดพเด•เตเด•เดพเตป, เดชเต‡เดฐเตเด•เตพ, เดŸเดพเด—เตเด•เตพ เดฎเตเดคเดฒเดพเดฏเดต เดšเดฒเดจเดพเดคเตเดฎเด•เดฎเดพเดฏเดฟ เด•เดฃเด•เตเด•เดพเด•เตเด•เตเด•. - เดจเดฟเด™เตเด™เตพ เด’เดฐเตเดชเด•เตเดทเต‡ เด…เดตเดฐเต† เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เดพเตป เด†เด—เตเดฐเดนเดฟเดšเตเดšเต‡เด•เตเด•เดพเด‚. เดจเดฟเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเดฟเดฏเดชเตเดชเต†เดŸเตเดŸ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเด‚เด—เต เดญเดพเดทเดฏเดฟเตฝ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเตเด•เตพเด•เตเด•เดพเดฏเดฟ เดธเดพเดงเดพเดฐเดฃ เดฏเต‚เดฃเดฟเดฑเตเดฑเต เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพ เดŽเดดเตเดคเตเดจเตเดจเดคเดฟเดจเต เดธเดฎเดพเดจเดฎเดพเดฃเดฟเดคเต.
เด•เตเดฑเดšเตเดšเตเด•เต‚เดŸเดฟ เดธเด™เตเด•เต€เตผเดฃเตเดฃเดฎเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต, เดจเดฟเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เด—เตเดฐเดพเด‚ เดตเดฟเดญเดตเด™เตเด™เตพ เดŽเด™เตเด™เดจเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเตเดตเต†เดจเตเดจเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเด‚. เดฆเตƒเดทเตเดŸเดพเดจเตเดคเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต, เดจเดฎเตเด•เตเด•เต เด’เดฐเต เดฒเดณเดฟเดคเดฎเดพเดฏ EC2 เดธเต†เตผเดตเตผ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต†เดจเตเดจเต เดธเด™เตเด•เตฝเดชเตเดชเดฟเด•เตเด•เตเด•, เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจเดตเดฏเดฟเตฝ เดžเด™เตเด™เตพเด•เตเด•เต เด‰เดฑเดชเตเดชเตเดฃเตเดŸเดพเดฏเดฟเดฐเดฟเด•เตเด•เดฃเด‚:

  • เดธเด‚เดญเดตเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต เดŸเดพเด—เต เด‰เดฃเตเดŸเต Name.
  • เดธเดจเตเดฆเตผเดญเด™เตเด™เตพ เด‡เตปเดฒเตˆเตป เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดฐเตเดคเต userData - เดจเดฎเตเดฎเตพ เด’เดฐเต AMI (เดšเดฟเดคเตเดฐเด‚) เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดฃเด‚.
  • เด‡เตปเดฑเตผเดจเต†เดฑเตเดฑเดฟเตฝ เด’เดฐเต เดŽเดธเตเดŽเดธเตเดŽเดšเตเดšเต เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเดฟเด•เตเด•เดฐเตเดคเต.

เดˆ เด‰เดฆเดพเดนเดฐเดฃเด‚ เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟเดฏเตเดณเตเดณเดคเดพเดฃเต เดŽเดจเตเดฑเต† เด‰เดฆเดพเดนเดฐเดฃเด‚ 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

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•