рдкреБрд╕реНрддрдХ "рдЯреЗрд░рд╛рдлреЙрд░реНрдо: рдХреЛрдб рд╕реНрддрд░ рдкрд░ рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдБрдЪрд╛"

рдЫрд╡рд┐рд╣реИрд▓реЛ, рд╣рдмреНрд░реЛрдЬрд╝рд┐рдЯреЗрд▓реА! рдкреБрд╕реНрддрдХ рдЙрди рд╕рднреА рдХреЗ рд▓рд┐рдП рдЕрднрд┐рдкреНрд░реЗрдд рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд▓рд┐рдЦреЗ рдЧрдП рдХреЛрдб рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВред рдпрд╣ рд╕рд┐рд╕реНрдЯрдо рдПрдбрдорд┐рдирд┐рд╕реНрдЯреНрд░реЗрдЯрд░, рдСрдкрд░реЗрд╢рдВрд╕ рд╕реНрдкреЗрд╢рд▓рд┐рд╕реНрдЯ, рд░рд┐рд▓реАрдЬ, SR, DevOps рдЗрдВрдЬреАрдирд┐рдпрд░, рдЗрдВрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдбреЗрд╡рд▓рдкрд░реНрд╕, рдлреБрд▓-рд╕рд╛рдЗрдХрд┐рд▓ рдбреЗрд╡рд▓рдкрд░реНрд╕, рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдЯреАрдо рд▓реАрдбрд░реНрд╕ рдФрд░ рдЯреЗрдХреНрдирд┐рдХрд▓ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реНрд╕ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рдЬреЛ рднреА рдЖрдкрдХреА рд╕реНрдерд┐рддрд┐ рд╣реИ, рдпрджрд┐ рдЖрдк рдмреБрдирд┐рдпрд╛рджреА рдврд╛рдВрдЪреЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рддреЛ рдХреЛрдб рддреИрдирд╛рдд рдХрд░реЗрдВ, рд╕рд░реНрд╡рд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ, рд╕реНрдХреЗрд▓ рдХреНрд▓рд╕реНрдЯрд░, рдбреЗрдЯрд╛ рдХрд╛ рдмреИрдХрдЕрдк рд▓реЗрдВ, рд╕реБрдмрд╣ рддреАрди рдмрдЬреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рдЙрддреНрддрд░ рдХреЙрд▓ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░реЗрдВ, рдпрд╣ рдкреБрд╕реНрддрдХ рдЖрдкрдХреЗ рд▓рд┐рдП рд╣реИред

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

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

  • IaC рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░реЗрдВ?
  • , , ?
  • Terraform, Chef, Ansible, Puppet, Salt, CloudFormation, Docker, Packer Kubernetes?
  • Terraform ?
  • Terraform, ?
  • Terraform, ?
  • Terraform?
  • Terraform ?
  • Terraform ?

2017 . 2019- , ! . , .

, , , Terraform, .

  • Terraform. , Terraform 0.8. Terraform 0.12. , . , !
  • . Terraform. , , , , , , , .
  • . Terraform . , , тАФ , .
  • . 8 , Terraform . , , , : , .
  • HCL2. Terraform 0.12 HCL HCL2. ( ${тАж}!), , , null, for_each for, . HCL2, 5 6.
  • . Terraform 0.9 . Terraform . Terraform 0.9 , ; 0.10 . 3.
  • Terraform. Terraform 0.10 ( AWS, GCP, Azure . .). , . terraform init , . 2 7.
  • . 2016 Terraform (AWS, GCP Azure). 100, , , 1. (, Alicloud, Oracle Cloud Infrastructure, VMware vSphere .), , (GitHub, GitLab BitBucket), (MySQL, PostreSQL InfluxDB), ( DataDog, New Relic Grafana), Kubernetes, Helm, Heroku, Rundeck Rightscale . , : , AWS , , CloudFormation!
  • Terraform. 2017 HashiCorp Terraform (registry.terraform.io) тАФ , Terraform, . 2018 . Terraform 0.11 . ┬л ┬╗ . 153.
  • . Terraform 0.9 : , , errored.tfstate. Terraform 0.12 . , , .
  • . , (. ┬л ┬╗ . 144), ┬л ┬╗ (, ┬л Terraform┬╗ . 242), plan apply (. ┬л ┬╗ . 64), create_before_destroy, count, (. ┬л┬╗ . 160), , provider .

. Terraform


(рдмрд╛рдж рдореЗрдВ рдкреБрд╕реНрддрдХ рдореЗрдВ рд╕реНрд╡рдд: рдкрд░реАрдХреНрд╖рдг рдХреЗ рдореБрджреНрджреЛрдВ рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)

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

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

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

рдореИрдиреБрдЕрд▓ рдкрд░реАрдХреНрд╖рдг:

  • рдореИрдиреБрдЕрд▓ рдкрд░реАрдХреНрд╖рдг рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ;
  • рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдмрд╛рдж рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рд╕рдлрд╛рдИред

рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд░реАрдХреНрд╖рдг:

  • рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг;
  • рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг;
  • рдЕрдВрдд-рд╕реЗ-рдЕрдВрдд рдкрд░реАрдХреНрд╖рдг;
  • рдЕрдиреНрдп рдкрд░реАрдХреНрд╖рдг рджреГрд╖реНрдЯрд┐рдХреЛрдгред

рдореИрдиреБрдЕрд▓ рдкрд░реАрдХреНрд╖рдг


рдЯреЗрд░рд╛рдлрд╝реЙрд░реНрдо рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рдХрд░реЗрдВ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╕рдордп, рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдЬреИрд╕реЗ рдХрд┐ рд░реВрдмреА рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╕рдорд╛рдирддрд╛рдПрдВ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдк web-server.rb рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд░реВрдмреА рд╡реЗрдм рд╕рд░реНрд╡рд░ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ:

class WebServer < WEBrick::HTTPServlet::AbstractServlet
  def do_GET(request, response)
     case request.path
     when "/"
         response.status = 200
         response['Content-Type'] = 'text/plain'
         response.body = 'Hello, World'
     else
         response.status = 404
         response['Content-Type'] = 'text/plain'
         response.body = 'Not Found'
     end
  end
end

рдпрд╣ рдХреЛрдб рдмреЙрдбреА рдХреЗ рд╕рд╛рде 200 рдУрдХреЗ рд░рд┐рд╕реНрдкрд╛рдВрд╕ рд▓реМрдЯрд╛рдПрдЧрд╛ рд╣реИрд▓реЛ, рд╡рд░реНрд▓реНрдб рдлреЙрд░ рдж рдпреВрдЖрд░рдПрд▓ /; рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдкрддреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрддрд░ 404 рд╣реЛрдЧрд╛ред рдЖрдк рдЗрд╕ рдХреЛрдб рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рдкрд░рдЦреЗрдВрдЧреЗ? рдЖрдорддреМрд░ рдкрд░, рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЛ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдФрд░ рдХреЛрдб рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ:

#   ,      
#  ,       
if __FILE__ == $0
  #      8000
  server = WEBrick::HTTPServer.new :Port => 8000
  server.mount '/', WebServer

  #    Ctrl+C
  trap 'INT' do server.shutdown end

  #  
  server.start
end

рдпрджрд┐ рдЖрдк рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЛ рдкреЛрд░реНрдЯ 8000 рдкрд░ рд▓реЛрдб рдХрд░реЗрдЧрд╛:

$ ruby web-server.rb
[2019-05-25 14:11:52] INFO WEBrick 1.3.1
[2019-05-25 14:11:52] INFO ruby 2.3.7 (2018-03-28) [universal.x86_64-darwin17]
[2019-05-25 14:11:52] INFO WEBrick::HTTPServer#start: pid=19767 port=8000

рдЗрд╕ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдпрд╛ рдХрд░реНрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

$ curl localhost:8000/
Hello, World

$ curl localhost:8000/invalid-path
Not Found

рдЕрдм рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдордиреЗ рдЗрд╕ рдХреЛрдб рдХреЛ / api рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдВрджреБ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ рдЬреЛ 201 рдХреНрд░рд┐рдПрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ JSON рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдПрдХ рдирд┐рдХрд╛рдп рд╣реИ:

class WebServer < WEBrick::HTTPServlet::AbstractServlet
  def do_GET(request, response)
     case request.path
     when "/"
         response.status = 200
         response['Content-Type'] = 'text/plain'
         response.body = 'Hello, World'
     when "/api"
         response.status = 201
         response['Content-Type'] = 'application/json'
         response.body = '{"foo":"bar"}'
     else
         response.status = 404
         response['Content-Type'] = 'text/plain'
         response.body = 'Not Found'
     end
  end
end

рдЗрд╕ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЧрдП рдХреЛрдб рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, Ctrl + C рджрдмрд╛рдПрдВ рдФрд░ рдлрд┐рд░ рд╕реЗ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдХрд░ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░реЗрдВ:

$ ruby web-server.rb
[2019-05-25 14:11:52] INFO WEBrick 1.3.1
[2019-05-25 14:11:52] INFO ruby 2.3.7 (2018-03-28) [universal.x86_64-darwin17]
[2019-05-25 14:11:52] INFO WEBrick::HTTPServer#start: pid=19767 port=8000
^C
[2019-05-25 14:15:54] INFO going to shutdown ...
[2019-05-25 14:15:54] INFO WEBrick::HTTPServer#start done.

$ ruby web-server.rb
[2019-05-25 14:11:52] INFO WEBrick 1.3.1
[2019-05-25 14:11:52] INFO ruby 2.3.7 (2018-03-28) [universal.x86_64-darwin17]
[2019-05-25 14:11:52] INFO WEBrick::HTTPServer#start: pid=19767 port=8000

рдирдП рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдлрд┐рд░ рд╕реЗ рдХрд░реНрд▓ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

$ curl localhost:8000/api
{"foo":"bar"}

рдореИрдиреБрдЕрд▓ рдкрд░реАрдХреНрд╖рдг рдореВрд▓ рдмрд╛рддреЗрдВ


рдЯреЗрд░рд╛рдлреЙрд░реНрдо рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдореИрдиреБрдЕрд▓ рдкрд░реАрдХреНрд╖рдг рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд┐рдЫрд▓реЗ рдЕрдзреНрдпрд╛рдпреЛрдВ рд╕реЗ, рдЖрдкрдХреЗ рдкрд╛рд╕ ALB рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреА рднреА рдХреЛрдб рд╣реИред рдпрд╣рд╛рдБ рдореЙрдбреНрдпреВрд▓ / рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ / alb / main.tf рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдПрдХ рд╕реНрдирд┐рдкреЗрдЯ рд╣реИ:

resource "aws_lb" "example" {
   name                     = var.alb_name
   load_balancer_type = "application"
   subnets                  = var.subnet_ids
   security_groups      = [aws_security_group.alb.id]
}

resource "aws_lb_listener" "http" {
   load_balancer_arn = aws_lb.example.arn
   port                      = local.http_port
   protocol                = "HTTP"

   #      404
   default_action {
      type = "fixed-response"

      fixed_response {
        content_type = "text/plain"
        message_body = "404: page not found"
        status_code = 404
      }
    }
}

resource "aws_security_group" "alb" {
   name = var.alb_name
}

# (...)

рдпрджрд┐ рдЖрдк рдЗрд╕ рд╕реВрдЪреА рдХреА рддреБрд▓рдирд╛ рд░реВрдмреА рдХреЛрдб рд╕реЗ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдПрдХ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рдЕрдВрддрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ: AWS ALB, рд▓рдХреНрд╖реНрдп рд╕рдореВрд╣, рд╢реНрд░реЛрддрд╛, рд╕реБрд░рдХреНрд╖рд╛ рд╕рдореВрд╣, рдФрд░ рдХреЛрдИ рдЕрдиреНрдп рд╕рдВрд╕рд╛рдзрди рдЖрдкрдХреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рддреИрдирд╛рдд рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗред

рдкрд░реАрдХреНрд╖рдг рдирдВрдмрд░ 1 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рдореБрдЦ рдирд┐рд╖реНрдХрд░реНрд╖ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ: рд╕реНрдерд╛рдиреАрдп рд╕реНрддрд░ рдкрд░ рдЯреЗрд░рд╛рдлреЙрд░реНрдо рдХреЛрдб рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

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

рдпрд╣ рдПрдХ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЖрд╕рд╛рди-рд╕реЗ-рдкрд░рд┐рдирд┐рдпреЛрдЬрд┐рдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд░рдЦрдирд╛ рдЗрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ (рдЕрдзреНрдпрд╛рдп 6 рджреЗрдЦреЗрдВ)ред рдЕрд▓реНрдм рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдбреЗрдореЛ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдкрдиреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ / рдПрд▓реНрдм рдореЗрдВ рдмрдирд╛рдпрд╛ рд╣реИ:

provider "aws" {
   region = "us-east-2"

   #     AWS  2.x
   version = "~> 2.0"
}

module "alb" {
    source = "../../modules/networking/alb"

    alb_name = "terraform-up-and-running"
    subnet_ids = data.aws_subnet_ids.default.ids
}

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

$ terraform apply

(...)

Apply complete! Resources: 5 added, 0 changed, 0 destroyed.

Outputs:

alb_dns_name = hello-world-stage-477699288.us-east-2.elb.amazonaws.com

рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдХреЗ рдЕрдВрдд рдореЗрдВ, рдЖрдк рдХрд░реНрд▓ рдЬреИрд╕реЗ рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ ALB 404% рд░рд┐рдЯрд░реНрди рджреЗрддрд╛ рд╣реИ:

$ curl \
   -s \
   -o /dev/null \
   -w "%{http_code}" \
hello-world-stage-477699288.us-east-2.elb.amazonaws.com

404

рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдХреА рдЬрд╛рдБрдЪ

, HTTP, , , curl HTTP-. . , MySQL, MySQL. VPN-, VPN. , , SSH - . . , , . , .

рдореБрдЭреЗ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рдиреЗ рджреЗрдВ: рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдЕрдиреНрдп рд╢реНрд░реЛрддрд╛ рдирд┐рдпрдореЛрдВ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рдХрд╛рд░рдг ALB 404 рджреЗрддрд╛ рд╣реИ, рдФрд░ рдПрд▓реНрдм рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдЙрддреНрддрд░ 404 рд╣реИ:

resource "aws_lb_listener" "http" {
   load_balancer_arn = aws_lb.example.arn
   port                      = local.http_port
   protocol                = "HTTP"

   #      404
   default_action {
      type = "fixed-response"

      fixed_response {
       content_type = "text/plain"
       message_body = "404: page not found"
       status_code = 404
      }
   }
}

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

$ terraform apply

(...)

Apply complete! Resources: 0 added, 1 changed, 0 destroyed.

Outputs:

alb_dns_name = hello-world-stage-477699288.us-east-2.elb.amazonaws.com

рдирдП рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдХрд░реНрд▓ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

$ curl \
   -s \
   -o /dev/null \
   -w "%{http_code}" \
   hello-world-stage-477699288.us-east-2.elb.amazonaws.com
401

рдЬрдм рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЯреЗрд░рд╛рд░рдлреЙрд░реНрдо рдирд╖реНрдЯ рдХрдорд╛рдВрдб рдХреЛ рдЪрд▓рд╛рдПрдВ:

$ terraform destroy

(...)

Apply complete! Resources: 0 added, 0 changed, 5 destroyed.

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

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

рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдмрд╛рдж рд╕рдВрд╕рд╛рдзрди рдХреА рд╕рдлрд╛рдИ


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

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

  • cloud-nuke (http://bit.ly/2OIgM9r). , . AWS ( Amazon EC2 Instances, ASG, ELB . .). (Google Cloud, Azure) . тАФ , . , cloud-nuke cron, . , , , :

    $ cloud-nuke aws --older-than 48h
  • Janitor Monkey (http://bit.ly/2M4GoLB). , AWS , ( тАФ ). , , , . Netflix Simian Army, Chaos Monkey . , Simian Army , : , Janitor Monkey Swabbie (http://bit.ly/2OLrOLb).
  • aws-nuke (http://bit.ly/2ZBSTOe)ред рдпрд╣ рдПрдХ рдУрдкрди рд╕реЛрд░реНрд╕ рдЯреВрд▓ рд╣реИ рдЬреЛ AWS рдЕрдХрд╛рдЙрдВрдЯ рдХреА рд╕рднреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдбрд┐рд▓реАрдЯ рдХрд░рддрд╛ рд╣реИред рд╣рдЯрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЦрд╛рддреЛрдВ рдФрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ YAML рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

    #   
    regions:
    - us-east-2
    
    #    
    accounts:
       "111111111111": {}
    
    #    
    resource-types:
       targets:
       - S3Object
       - S3Bucket
       - IAMRole

    Aws-nuke рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ:

    $ aws-nuke -5c config.yml

рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд░реАрдХреНрд╖рдг


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

рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкрд░реАрдХреНрд╖рдг рддреАрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВред

  • . тАФ . , . (, , - ) mock-. (, mock- , ) , .
  • . . , . mock-: , , , , , , , mock-.
  • . (, , , ) . : , Selenium . - mock-, ( , ).

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

┬╗рдХрд┐рддрд╛рдм рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдкреНрд░рдХрд╛рд╢рдХ рдХреА рд╡реЗрдмрд╕рд╛рдЗрдЯ
┬╗ рд╕рд╛рдордЧреНрд░реА
┬╗ рдЕрдВрд╢

рдХреЗ рд▓рд┐рдП Khabrozhiteley рдХреВрдкрди рдкрд░ 25% рдЫреВрдЯ - terraform

рдкреБрд╕реНрддрдХ рдХреЗ рдХрд╛рдЧрдЬ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рднреБрдЧрддрд╛рди рдХрд░рдиреЗ рдкрд░, рдПрдХ рдЗрд▓реЗрдХреНрдЯреНрд░реЙрдирд┐рдХ рдкреБрд╕реНрддрдХ рдИ-рдореЗрд▓ рджреНрд╡рд╛рд░рд╛ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред

All Articles