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

рд╢реБрдн рджреЛрдкрд╣рд░, рджреЛрд╕реНрддреЛрдВред "DevOps Practices and Tools" рдкрд╛рдареНрдпрдХреНрд░рдо рдкрд░ рдПрдХ рдирдИ рд╕реНрдЯреНрд░реАрдо рдХреА рд╢реБрд░реБрдЖрдд рдХреА рдкреНрд░рддреНрдпрд╛рд╢рд╛ рдореЗрдВ рд╣рдо рдЖрдкрдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдЕрдиреБрд╡рд╛рдж рд╕рд╛рдЭрд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ ред рдЪрд▓реЛ рдЪрд▓рддреЗ рд╣реИрдВред



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

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



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


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

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

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


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

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

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

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

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

рдЬрдм рд╣рдо рд╕рдм рдХреБрдЫ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рддрдХ рд╕рд░рд▓ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣реБрдВрдЪ рд╣реЛрдЧреАред 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__ STACK).
    рдЖрдкрдХрд╛ рд╕реНрдЯреИрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдЪрд░ред рдЙрдиреНрд╣реЗрдВ PULUMI_CONFIG рдкрд░реНрдпрд╛рд╡рд░рдг PULUMI_CONFIG рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрдирдХрд╛ рдкреНрд░рд╛рд░реВрдк рдХреБрдВрдЬреА / рдорд╛рди рдЬреЛрдбрд╝реЗ рдХреЗ рд╕рд╛рде JSON рдореИрдк рд╣реИред

    рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪреЗрддрд╛рд╡рдиреА рдЬрд╛рд░реА рдХрд░рддреЗ рд╣реБрдП рд╕рдВрдХреЗрдд рджреЗрдЧрд╛ рдХрд┐ рд░рди рдЯрд╛рдЗрдо рдореЗрдВ рд╕реАрдПрд▓рдЖрдИ / рдЗрдВрдЬрди рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдиреЗрдХреНрд╢рди рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИред рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдкрдХрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреБрдЫ рднреА рддреИрдирд╛рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдФрд░ рдпрд╣ рдПрдХ рдЖрд╢реНрдЪрд░реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЖ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдпрд╣ рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЖрдк рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ! рдкреБрд▓реБрдореА рдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП, рдЖрдк PULUMI_TEST_MODE рдХреЛ true рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

    рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ my-ws рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рдирд╛рдо, dev рд╕реНрдЯреИрдХ рдХрд╛ рдирд╛рдо рдФрд░ AWS us-west-2 рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ 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) 

    рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛ рдЧрдпрд╛ ... рд╣реБрд░реНрд░реЗ! тЬУ тЬУ тЬУ

    рдЖрдЬ рдХреЗ рд▓рд┐рдП рдмрд╕ рдЗрддрдирд╛ рд╣реА, рд▓реЗрдХрд┐рди рд╣рдо рдЕрдиреБрд╡рд╛рдж рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ ;-)

Source: https://habr.com/ru/post/hi463001/


All Articles