рдкреБрд▓реБрдореА рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХрд╛ рдкрд░реАрдХреНрд╖рдгред рднрд╛рдЧ ---- рдкрд╣рд▓рд╛

рдЕрдЪреНрдЫрд╛ рджреЛрдкрд╣рд░ рджреЛрд╕реНрддреЛрдВред рджрд░ рдкрд░ рдПрдХ рдирдП рдкреНрд░рд╡рд╛рд╣ рдХреА рд╢реБрд░реБрдЖрдд рдХреА рдкреНрд░рддреНрдпрд╛рд╢рд╛ рдореЗрдВ "DevOps рдЕрднреНрдпрд╛рд╕ рдФрд░ рдЙрдкрдХрд░рдг" рд╣рдо рдЖрдкрдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдЕрдиреБрд╡рд╛рдж рд╕рд╛рдЭрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ. рдЬрд╛рдирд╛ред

рдкреБрд▓реБрдореА рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХрд╛ рдкрд░реАрдХреНрд╖рдгред рднрд╛рдЧ ---- рдкрд╣рд▓рд╛

рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЛрдб (рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░) рдХреЗ рд▓рд┐рдП рдкреБрд▓реБрдореА рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдпреЛрдЬрди рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдХрдИ рдлрд╛рдпрджреЗ рдорд┐рд▓рддреЗ рд╣реИрдВ: рдХреМрд╢рд▓ рдФрд░ рдЬреНрдЮрд╛рди рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛, рдЕрдореВрд░реНрддрддрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЛрдб рдореЗрдВ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХрд╛ рдЙрдиреНрдореВрд▓рди, рдЖрдкрдХреА рдЯреАрдо рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдЙрдкрдХрд░рдг, рдЬреИрд╕реЗ рдЖрдИрдбреАрдИ рдФрд░ рд▓рд┐рдВрдЯрд░ред рдпреЗ рд╕рднреА рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдЙрдкрдХрд░рдг рди рдХреЗрд╡рд▓ рд╣рдореЗрдВ рдЕрдзрд┐рдХ рдЙрддреНрдкрд╛рджрдХ рдмрдирд╛рддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдореЗрдВ рднреА рд╕реБрдзрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдпреЛрдЬрди рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдореЗрдВ рдПрдХ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╡рд┐рдХрд╛рд╕ рдЕрднреНрдпрд╛рд╕ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ - рдкрд░реАрдХреНрд╖рдг.

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдХреИрд╕реЗ рдкреБрд▓реБрдореА рд╣рдорд╛рд░реЗ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ-рдП-рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдореЗрдВ рд╣рдорд╛рд░реА рдорджрдж рдХрд░рддрд╛ рд╣реИред

рдкреБрд▓реБрдореА рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХрд╛ рдкрд░реАрдХреНрд╖рдгред рднрд╛рдЧ ---- рдкрд╣рд▓рд╛

рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХреНрдпреЛрдВ рдХрд░реЗрдВ?

рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рд╕рд╡рд╛рд▓ рдкреВрдЫрдирд╛ рдЙрдЪрд┐рдд рд╣реИ: "рдЖрдЦрд┐рд░ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХреНрдпреЛрдВ рдХрд░реЗрдВ?" рдЗрд╕рдХреЗ рдХрдИ рдХрд╛рд░рдг рд╣реИрдВ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:

  • рдЖрдкрдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рддрд░реНрдХ рдХреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдХрд╛рд░реНрдпреЛрдВ рдпрд╛ рдЕрдВрд╢реЛрдВ рдХрд╛ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг
  • рдХреБрдЫ рдмрд╛рдзрд╛рдУрдВ рдХреЗ рд╡рд┐рд░реБрджреНрдз рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреА рд╡рд╛рдВрдЫрд┐рдд рд╕реНрдерд┐рддрд┐ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИред
  • рд╕рд╛рдорд╛рдиреНрдп рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛, рдЬреИрд╕реЗ рд╕реНрдЯреЛрд░реЗрдЬ рдмрдХреЗрдЯ рдХреЗ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХреА рдХрдореА рдпрд╛ рдЗрдВрдЯрд░рдиреЗрдЯ рд╕реЗ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрдиреЛрдВ рддрдХ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд, рдЦреБрд▓реА рдкрд╣реБрдВрдЪред
  • рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреЗ рдкреНрд░рд╛рд╡рдзрд╛рди рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЬрд╛рдБрдЪ рдХрд░рдирд╛ред
  • рдкреНрд░рд╛рд╡рдзрд╛рди рдХреЗ рдмрд╛рдж рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЗ "рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд┐рдП рдЧрдП" рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреЗ рдЕрдВрджрд░ рдЪрд▓ рд░рд╣реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдЬрд┐рдХ рдХрд╛ рд░рдирдЯрд╛рдЗрдо рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ред
  • рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдХреЗ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реИред рдкреЛрд▓реБрдореА рдХреЗ рдкрд╛рд╕ рдЗрд╕ рд╕реНрдкреЗрдХреНрдЯреНрд░рдо рдкрд░ рд╣рд░ рдмрд┐рдВрджреБ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рд╣реИрдВред рдЖрдЗрдП рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЗрдХрд╛рдИ рдХрд╛ рдкрд░реАрдХреНрд╖рдг

рдкреБрд▓реБрдореА рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдпреЛрдЬрди рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдЬреИрд╕реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ, рдкрд╛рдпрдерди, рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдпрд╛ рдЧреЛ рдореЗрдВ рд▓рд┐рдЦреЗ рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЗрди рднрд╛рд╖рд╛рдУрдВ рдХреА рдкреВрд░реА рд╢рдХреНрддрд┐, рдЙрдирдХреЗ рдЙрдкрдХрд░рдг рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рд╕рд╣рд┐рдд, рдкрд░реАрдХреНрд╖рдг рдврд╛рдВрдЪреЗ рд╕рд╣рд┐рдд, рдЙрдирдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИред рдкреБрд▓реБрдореА рдорд▓реНрдЯреА-рдХреНрд▓рд╛рдЙрдб рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рднреА рдХреНрд▓рд╛рдЙрдб рдкреНрд░рджрд╛рддрд╛ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

(рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдмрд╣реБрднрд╛рд╖реА рдФрд░ рдорд▓реНрдЯреАрдХреНрд▓рд╛рдЙрдб рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рд╣рдо рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ рдореЛрдЪрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдбрдмреНрд▓реНрдпреВрдПрд╕ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЖрдк рдкрд╛рдпрдерди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ unittest, рдкрд░реАрдХреНрд╖рдг рдврд╛рдБрдЪрд╛, рдпрд╛ рдХреЛрдИ рдЕрдиреНрдп рдкрд░реАрдХреНрд╖рдг рдврд╛рдБрдЪрд╛ рдЬреЛ рдЖрдкрдХреЛ рдкрд╕рдВрдж рд╣реЛ, рдкрд░ рдЬрд╛рдПрдБред рдФрд░, рдирд┐рдГрд╕рдВрджреЗрд╣, рдкреБрд▓реБрдореА Azure, Google Cloud, Kubernetes рдХреЗ рд╕рд╛рде рдмрдврд╝рд┐рдпрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред)

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рджреЗрдЦрд╛ рд╣реИ, рдРрд╕реЗ рдХрдИ рдХрд╛рд░рдг рд╣реИрдВ рдЬрд┐рдирдХреА рд╡рдЬрд╣ рд╕реЗ рдЖрдк рдЕрдкрдиреЗ рдЗрдВрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЗ рдХреЛрдб рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реАрдЖрдИрдбреАрдЖрд░ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛, рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдирд╛рдо, рдЯреИрдЧ рдЖрджрд┐ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ред - рдЖрдк рд╢рд╛рдпрдж рдЙрдирдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рдпрд╣ рдЖрдкрдХреА рдкрд╕рдВрджреАрджрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдирд┐рдпрдорд┐рдд рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдЬреИрд╕рд╛ рд╣реА рд╣реИред
рдереЛрдбрд╝рд╛ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдХреИрд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдореЗрдВ рдПрдХ рд╕рд░рд▓ EC2 рд╕рд░реНрд╡рд░ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:

  • рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдПрдХ рдЯреИрдЧ рд╣реЛрддрд╛ рд╣реИ Name.
  • рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдЗрдирд▓рд╛рдЗрди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП userData - рд╣рдореЗрдВ рдПрдПрдордЖрдИ (рдЫрд╡рд┐) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
  • рдХреЛрдИ SSH рдЗрдВрдЯрд░рдиреЗрдЯ рдХреЗ рд╕рдВрдкрд░реНрдХ рдореЗрдВ рдирд╣реАрдВ рдЖрдирд╛ рдЪрд╛рд╣рд┐рдП.

рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдореЗрд░рд╛ рдЙрджрд╛рд╣рд░рдг aws-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 .
  • рдЪреВрдБрдХрд┐ рд╣рдо рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдореЗрдВ рд╕рдВрд╕рд╛рдзрди рдпреВрдЖрд░рдПрди рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдЧреБрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╣рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ pulumi.allрдЙрдиреНрд╣реЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП.
  • рдЕрдВрдд рдореЗрдВ, рдЪреВрдВрдХрд┐ рдЗрди рдорд╛рдиреЛрдВ рдХреА рдЧрдгрдирд╛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдореЛрдЪрд╛ рдХреА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдПрд╕рд┐рдВрдХ рдХреЙрд▓рдмреИрдХ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ done рдпрд╛ рдХреЛрдИ рд╡рд╛рджрд╛ рд╡рд╛рдкрд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ.

рдПрдХ рдмрд╛рд░ рдЬрдм рд╣рдо рд╕рдм рдХреБрдЫ рд╕реЗрдЯ рдХрд░ рд▓реЗрдВрдЧреЗ, рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рд░рд▓ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдорд╛рдиреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдирдкреБрдЯ рддрдХ рдкрд╣реБрдВрдЪ рд╣реЛрдЧреАред рд╕рдВрдкрддреНрддрд┐ 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();
                }
            });
        });

рдмрд╕ рдЗрддрдирд╛ рд╣реАред рдЕрдм рдЪрд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддреЗ рд╣реИрдВ!

рдЪрд▓ рд░рд╣реЗ рдкрд░реАрдХреНрд╖рдг

рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЖрдк рдЕрдкрдиреА рдкрд╕рдВрдж рдХреЗ рдкрд░реАрдХреНрд╖рдг рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдкреБрд▓реБрдореА рдХреА рдПрдХ рдЦрд╛рд╕рд┐рдпрдд рд╣реИ рдЬрд┐рд╕ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЬрд░реВрд░реА рд╣реИред
рдЖрдорддреМрд░ рдкрд░, рдкреБрд▓реБрдореА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреБрд▓рд┐рдореА рд╕реАрдПрд▓рдЖрдИ (рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЗрдВрдЯрд░рдлрд╝реЗрд╕) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рднрд╛рд╖рд╛ рд░рдирдЯрд╛рдЗрдо рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ, рдкреБрд▓реБрдореА рдЗрдВрдЬрди рдХреЗ рд▓реЙрдиреНрдЪ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд▓рди рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдФрд░ рдпреЛрдЬрдирд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ, рдЖрджрд┐ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ. рдЖрдкрдХреЗ рдкрд░реАрдХреНрд╖рдг рдврд╛рдВрдЪреЗ рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рдЪрд▓рдиреЗ рдкрд░, рд╕реАрдПрд▓рдЖрдИ рдФрд░ рдкреБрд▓реБрдореА рдЗрдВрдЬрди рдХреЗ рдмреАрдЪ рдХреЛрдИ рд╕рдВрдЪрд╛рд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдмрд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

  • рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдирд╛рдо, рдЬреЛ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИ PULUMI_NODEJS_PROJECT (рдпрд╛, рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдпрддрдГ, PULUMI__PROJECT ╨┤╨╗╤П ╨┤╤А╤Г╨│╨╕╤Е ╤П╨╖╤Л╨║╨╛╨▓).
    рд╕реНрдЯреИрдХ рдХрд╛ рдирд╛рдо рдЬреЛ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИ PULUMI_NODEJS_STACK (рдпрд╛, рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдпрддрдГ, PULUMI__ STACK).
    рдЖрдкрдХрд╛ рд╕реНрдЯреИрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡реИрд░рд┐рдПрдмрд▓. рдЗрдиреНрд╣реЗрдВ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ PULUMI_CONFIG рдФрд░ рдЙрдирдХрд╛ рдкреНрд░рд╛рд░реВрдк рдХреБрдВрдЬреА/рдореВрд▓реНрдп рдЬреЛрдбрд╝реЗ рдХреЗ рд╕рд╛рде JSON рдорд╛рдирдЪрд┐рддреНрд░ рд╣реИред

    рдкреНрд░реЛрдЧреНрд░рд╛рдо рдпрд╣ рд╕рдВрдХреЗрдд рджреЗрддреЗ рд╣реБрдП рдЪреЗрддрд╛рд╡рдиреА рдЬрд╛рд░реА рдХрд░реЗрдЧрд╛ рдХрд┐ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рд╕реАрдПрд▓рдЖрдИ/рдЗрдВрдЬрди рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИред рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рднреА рддреИрдирд╛рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдФрд░ рдпрджрд┐ рдЖрдк рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рд╣реЛ рд╕рдХрддреА рд╣реИ! рдкреБрд▓реБрдореА рдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЪрд╛рд╣рд┐рдП, рдЖрдк рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ 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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ