ЁЯУЬ рдзрдбрд╛ 01 тАФ Infrastructure as code рдХрд╛: clicks рд╡рд┐рд░реБрджреНрдз рд▓рд┐рдЦрд┐рдд рдЖрд░рд╛рдЦрдбреЗ
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: рдзрдбрд╛ 01 / 12 ┬╖ рдкреБрдвреЗ: lesson-02-resources-providers
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рд╕рдВрдкреВрд░реНрдг рдХреЛрд░реНрд╕ рдЬреНрдпрд╛ рдПрдХрд╛ рдХрд▓реНрдкрдиреЗрдмрджреНрджрд▓ рдЖрд╣реЗ рддреА: рд╢рд╛рд│реЗрдЪреЗ рдмрд╛рдВрдзрдХрд╛рдо рдХрд╛рд░реНрдпрд╛рд▓рдп рдЦреЛрд▓реНрдпрд╛, gates
рдЖрдгрд┐ lockers рдмрд╛рдВрдзрддреЗ. рдЖрддрд╛рдкрд░реНрдпрдВрдд рдПрдХ clerk рддреЗ рд╣рд╛рддрд╛рдиреЗ рдмрд╛рдВрдзрдд рдЕрд╕реЗ, web console рдордзреНрдпреЗ click рдХрд░рдд.
рдЖрдЬрдкрд╛рд╕реВрди рдХрд╛рд░реНрдпрд╛рд▓рдп рд▓рд┐рдЦрд┐рдд рдмрд╛рдВрдзрдХрд╛рдо рдЖрд░рд╛рдЦрдбреЗ рдареЗрд╡рддреЗ, рдЖрдгрд┐ рдПрдХ рдХрдВрддреНрд░рд╛рдЯрджрд╛рд░ рддреНрдпрд╛рд╡рд░реВрди
рдмрд╛рдВрдзрдХрд╛рдо рдХрд░рддреЛ. рдЦрд▒реНрдпрд╛ рдЖрдпреБрд╖реНрдпрд╛рдд рдЖрд░рд╛рдЦрдбрд╛ рдореНрд╣рдгрдЬреЗ Terraform (рдХрд┐рдВрд╡рд╛ OpenTofu) files, рдХрдВрддреНрд░рд╛рдЯрджрд╛рд░ рдореНрд╣рдгрдЬреЗ
terraform program, рдЖрдгрд┐ campus рдореНрд╣рдгрдЬреЗ рддреБрдордЪреЗ cloud account.
рд╕рдВрдкреВрд░реНрдг рдХреЛрд░реНрд╕рднрд░ рддреБрдореНрд╣реА рд╡рд╛рдкрд░рд╛рд▓ рддреНрдпрд╛ рдЦрд▒реНрдпрд╛ files:
- iac/cloud.py тАФ campus: memory рдордзреАрд▓ рдПрдХ рдмрдирд╛рд╡рдЯ cloud, рддреАрди resource types рд╕рд╣ (
school_room,school_gate,school_locker) - iac/engine.py тАФ рдХрдВрддреНрд░рд╛рдЯрджрд╛рд░: plan, apply, state, dependency graph, modules, рдХреБрд▓реВрдк рдЕрд╕рд▓реЗрд▓рд╛ remote backend
- iac/checks.py тАФ рддрдкрд╛рд╕рдиреАрд╕: policy, cost, tests рдЖрдгрд┐ рдПрдХ CI pipeline
- iac/demo.py тАФ рдкреНрд░рддреНрдпреЗрдХ рдзрдбрд╛ рдПрдХ рдЫреЛрдЯрд╛ program рдореНрд╣рдгреВрди (
python3 iac/demo.py <section>; sections:why resources plan variables state graph modules locking drift environments policy pipeline) - iac/test_iac.py тАФ рдХрдВрддреНрд░рд╛рдЯрджрд╛рд░рд╛рдЪреНрдпрд╛ рдирд┐рдпрдорд╛рдВрд╡рд░реАрд▓ 12 checks
- demo-output.txt тАФ рдирд┐рд░реЛрдЧреА run рдХрд╛рдп print рдХрд░рддреЛ рддреЗ
ЁЯОТ рд╕реБрд░реВ рдХрд░рдгреНрдпрд╛рдЖрдзреА: рддреБрдореНрд╣рд╛рд▓рд╛ рдлрдХреНрдд Python 3 рд▓рд╛рдЧреЗрд▓, рдмрд╛рдХреА рдХрд╛рд╣реА рдирд╛рд╣реА тАФ cloud account рдирдХреЛ,
pip installрдирдХреЛ,terraformbinary рдирдХреЛ.iac/folder рд╣реЗ Terraform рдХрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рдпрд╛рдЪреЗ рд╢рд┐рдХрд╡рдгреНрдпрд╛рд╕рд╛рдареАрдЪреЗ model рдЖрд╣реЗ, рд╕реНрд╡рддрдГ Terraform рдирд╛рд╣реА. Randomness seeded рдЖрд╣реЗ, рдореНрд╣рдгреВрди рдкреНрд░рддреНрдпреЗрдХ run рддреАрдЪ рдЧреЛрд╖реНрдЯ print рдХрд░рддреЛ. рдЦрд▒реНрдпрд╛ account рд╡рд░ рдЕрд╕реЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓реНрдпрд╛ commands рд╕рд╛рдареА Terraform (1.5 рдХрд┐рдВрд╡рд╛ рдирд╡реАрди) рдЖрдгрд┐ рдЦрд░реЗ cloud account рд▓рд╛рдЧрддреЗ, рдЖрдгрд┐ рддреНрдпрд╛рдВрдЪрд╛ рдЦрд░реНрдЪ рдпреЗрдК рд╢рдХрддреЛ.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рд╢рд╛рд│реЗрд▓рд╛ рддреАрди рдЧрд╛рд╡рд╛рдВрдд рдПрдХ рдирд╡реАрди science wing рд╣рд╡реА рдЖрд╣реЗ: рдПрдХ chemistry lab, рдПрдХ рдореБрдЦреНрдп gate рдЖрдгрд┐ рддреАрди lockers. рддреАрдЪ wing, рддреАрди рд╡реЗрд│рд╛.
рдХрддрд░рд┐рдирд╛, clerk, рдкреНрд░рддреНрдпреЗрдХ wing рд╣рд╛рддрд╛рдиреЗ рдмрд╛рдВрдзрддреЗ. рддреА рдкреНрд░рддреНрдпреЗрдХ рддрдкрд╢реАрд▓ рдПрдХрд╛ form рдордзреНрдпреЗ рдЯрд╛рдЗрдк рдХрд░рддреЗ: рдЦреЛрд▓реАрдЪреЗ рдирд╛рд╡, floor, seats рдЪреА рд╕рдВрдЦреНрдпрд╛, gate рдЙрдШрдбрдгреНрдпрд╛рдЪреНрдпрд╛ рд╡реЗрд│рд╛. рдкреНрд░рддреНрдпреЗрдХ site рд▓рд╛ рдЖрда fields. рддреА рдХрд╛рд│рдЬреАрдкреВрд░реНрд╡рдХ рдХрд╛рдо рдХрд░рддреЗ. рдкрдг рддрд┐рд╕рд▒реНрдпрд╛ site рд╡рд░ рддреА floor 2 рдРрд╡рдЬреА floor 20 рдЯрд╛рдЗрдк рдХрд░рддреЗ. рдХреЛрдгрд╛рдЪреНрдпрд╛рдЪ рд▓рдХреНрд╖рд╛рдд рдпреЗрдд рдирд╛рд╣реА. рдЖрддрд╛ рддрд┐рдиреНрд╣реА wings рд╕рд╛рд░рдЦреНрдпрд╛ рдирд╛рд╣реАрдд, рдЖрдгрд┐ рдХрд╛ рддреЗ рдХреЛрдгреАрдЪ рд▓рд┐рд╣реВрди рдареЗрд╡рд▓реЗрд▓реЗ рдирд╛рд╣реА.
рдордЧ рджреАрдкрд┐рдХрд╛рд▓рд╛ рдПрдХ рдХрд▓реНрдкрдирд╛ рд╕реБрдЪрддреЗ. "рдЖрдкрдг рдЖрд░рд╛рдЦрдбрд╛ рдПрдХрджрд╛рдЪ рд▓рд┐рд╣реВрди рдареЗрд╡реВ. ЁЯУЬ рдордЧ рдХрдВрддреНрд░рд╛рдЯрджрд╛рд░ рдЖрд░рд╛рдЦрдбреНрдпрд╛рд╡рд░реВрди, рдЬрд╕рд╛ рд▓рд┐рд╣рд┐рд▓рд╛ рдЖрд╣реЗ рддрд╕рд╛рдЪ, рджрд░ рд╡реЗрд│реА рдмрд╛рдВрдзреЗрд▓."
рдЖрддрд╛ рддрд┐рдиреНрд╣реА wings рд╕рд╛рд░рдЦреНрдпрд╛ рдЖрд╣реЗрдд. рдЖрдгрд┐ рдХрдВрддреНрд░рд╛рдЯрджрд╛рд░ рддреНрдпрд╛рдЪ рдЖрд░рд╛рдЦрдбреНрдпрд╛рд╕рд╣ рдкреВрд░реНрдг рдЭрд╛рд▓реЗрд▓реНрдпрд╛ wing рд▓рд╛ рдкреБрдиреНрд╣рд╛ рднреЗрдЯ рджреЗрддреЛ рддреЗрд╡реНрд╣рд╛ рддреЛ рдореНрд╣рдгрддреЛ: "рдХрд╛рд╣реАрдЪ рдХрд░рд╛рдпрдЪреЗ рдирд╛рд╣реА. Wing рдЖрдзреАрдЪ рдЖрд░рд╛рдЦрдбреНрдпрд╛рд╢реА рдЬреБрд│рддреЗ." ЁЯС╖
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
subgraph hand["ЁЯЦ▒я╕П by hand"]
k["Katrina types 8 fields<br/>per site"] --> d1["dev тЬЕ"]
k --> s1["staging тЬЕ"]
k --> p1["prod тЭМ floor 20"]
end
subgraph plans["ЁЯУЬ written plans"]
f["one config file<br/>(in git)"] --> c["ЁЯС╖ the contractor<br/>(terraform apply)"]
c --> d2["dev тЬЕ"]
c --> s2["staging тЬЕ"]
c --> p2["prod тЬЕ"]
c -.->|"run again"| n["No changes."]
end
ЁЯЧ║я╕П рд░реЗрдЦрд╛рдЯрд▓реЗрд▓реА рдЖрд╡реГрддреНрддреА + рдПрдХ lab: https://school-edh.pages.dev/terraform/lesson-diagrams.html#l01
тЭУ рдХрд╛рдп
- Infrastructure тАФ рддреБрдордЪреЗ software рдЬреНрдпрд╛рд╡рд░ рдЪрд╛рд▓рддреЗ рддреНрдпрд╛ рдЧреЛрд╖реНрдЯреА: networks, servers, databases, buckets, DNS records, permissions. рдЗрдереЗ: рдЦреЛрд▓реНрдпрд╛, gates рдЖрдгрд┐ lockers.
- ClickOps тАФ web console рдордзреНрдпреЗ рд╣рд╛рддрд╛рдиреЗ infrastructure рдмрд╛рдВрдзрдгреЗ. рдкрд╣рд┐рд▓реНрдпрд╛ рд╡реЗрд│реА рдЬрд▓рдж. рдкрдг рдкреБрдиреНрд╣рд╛ рдХрд░рд╛рдпрд▓рд╛ рдЕрд╡рдШрдб, review рдХрд░рд╛рдпрд▓рд╛ рдЕрд╡рдШрдб, рдЖрдгрд┐ рдПрдЦрд╛рджреА setting рддрд╢реА рдХрд╛ рдЖрд╣реЗ рдпрд╛рдЪреА рдХреБрдареЗрдЪ рдиреЛрдВрдж рдирд╕рддреЗ.
- Infrastructure as Code (IaC) тАФ рддреБрдореНрд╣реА infrastructure рдЪреЗ рд╡рд░реНрдгрди text files рдордзреНрдпреЗ рдХрд░рддрд╛, рддреНрдпрд╛ version control (git) рдордзреНрдпреЗ рдареЗрд╡рддрд╛, code рдкреНрд░рдорд╛рдгреЗрдЪ рдмрджрд▓рд╛рдВрдЪреЗ review рдХрд░рддрд╛, рдЖрдгрд┐ рдПрдЦрд╛рджреЗ tool рдЦрд▒реНрдпрд╛ рдЧреЛрд╖реНрдЯреА рддрдпрд╛рд░ рдХрд░рддреЗ рд╡ рдмрджрд▓рддреЗ.
- Declarative тАФ files рд╕рд╛рдВрдЧрддрд╛рдд рдХрд╛рдп рдЕрд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ ("30 seats рдЕрд╕рд▓реЗрд▓реА рдПрдХ lab"), рддрд┐рдереЗ рдкреЛрд╣реЛрдЪрдгреНрдпрд╛рдЪреНрдпрд╛
рдкрд╛рдпрд▒реНрдпрд╛ рдирд╛рд╣реА. рдкрд╛рдпрд▒реНрдпрд╛ tool рдард░рд╡рддреЗ. Terraform, OpenTofu, AWS
CloudFormation рдЖрдгрд┐ Pulumi (рддреНрдпрд╛рдЪреНрдпрд╛ рдкрджреНрдзрддреАрдиреЗ) declarative рдЖрд╣реЗрдд.
aws ec2 run-instancescalls рдиреЗ рднрд░рд▓реЗрд▓реА shell script imperative рдЕрд╕рддреЗ: рддреА рдкрд╛рдпрд▒реНрдпрд╛ рд╕рд╛рдВрдЧрддреЗ. - Idempotent тАФ рдХрд╛рд╣реАрд╣реА рди рдмрджрд▓рддрд╛ рдкреБрдиреНрд╣рд╛ рдЪрд╛рд▓рд╡рд▓реЗ рддрд░ рдХрд╛рд╣реАрдЪ рд╣реЛрдд рдирд╛рд╣реА. Demo рддреЛрдЪ рдЖрд░рд╛рдЦрдбрд╛
рджреБрд╕рд▒реНрдпрд╛рдВрджрд╛ apply рдХрд░рддреЛ рдЖрдгрд┐ рддреНрдпрд╛рд▓рд╛
No changes.рдорд┐рд│рддреЗ. - Terraform рдЖрдгрд┐ OpenTofu тАФ Terraform рд╣реЗ HashiCorp рдЪреЗ IaC tool рдЖрд╣реЗ. 2023 рдордзреНрдпреЗ HashiCorp рдиреЗ
рддреЗ Business Source License (BUSL 1.1) рдЦрд╛рд▓реА рдиреЗрд▓реЗ. OpenTofu рд╣рд╛ Linux Foundation рдЦрд╛рд▓реАрд▓
open-source fork (MPL 2.0) рдЖрд╣реЗ. рдпрд╛ рдХреЛрд░реНрд╕рдордзреАрд▓ рднрд╛рд╖рд╛ рдЖрдгрд┐ workflow рджреЛрдиреНрд╣реАрдВрдордзреНрдпреЗ
рд╕рд╛рд░рдЦреЗ рдЖрд╣реЗрдд:
terraform planрдХрд┐рдВрд╡рд╛tofu plan.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг рд╣рд╛рддрд╛рдиреЗ рдмрд╛рдВрдзрд▓реЗрд▓рд╛ campus рдХреЛрдгреАрдЪ рдкреБрдиреНрд╣рд╛ рдмрд╛рдВрдзреВ рд╢рдХрдд рдирд╛рд╣реА. рд░рд╛рддреНрд░реА 2 рд╡рд╛рдЬрддрд╛ prod рдмрд┐рдШрдбрд▓реЗ рдХреА рдкреНрд░рд╢реНрди рдЕрд╕рддреЛ "рдХрд╛рдп рдмрджрд▓рд▓реЗ?" Clicks рдЕрд╕рддреАрд▓ рддрд░ рдЙрддреНрддрд░ рдХреЛрдгрд╛рдЪреНрдпрд╛ рддрд░реА рдЖрдард╡рдгреАрдд рдЕрд╕рддреЗ. Git рдордзреАрд▓ рдЖрд░рд╛рдЦрдбреНрдпрд╛рд╕рд╣ рдЙрддреНрддрд░ рдореНрд╣рдгрдЬреЗ author, рддрд╛рд░реАрдЦ рдЖрдгрд┐ review рдЕрд╕рд▓реЗрд▓рд╛ рдПрдХ commit. рдЖрд░рд╛рдЦрдбреНрдпрд╛рдореБрд│реЗ dev, staging рдЖрдгрд┐ prod рдордзреНрдпреЗ рддреАрдЪ рдЧреЛрд╖реНрдЯ рдмрд╛рдВрдзрддрд╛ рдпреЗрддреЗ, рдореНрд╣рдгреВрди staging рдордзреАрд▓ test рд▓рд╛ рдХрд╛рд╣реАрддрд░реА рдЕрд░реНрде рдЕрд╕рддреЛ. рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ click рдорд╛рдЧрдЪреА рдЫреЛрдЯреАрд╢реА рдЪреВрдХ рдкрдЯрдХрди рд╡рд╛рдврдд рдЬрд╛рддреЗ: рдЦрд╛рд▓рдЪрд╛ рдХрд░реВрди-рдкрд╛рд╣рд╛ рджрд╛рдЦрд╡рддреЛ рдХреА рдкреНрд░рддреНрдпреЗрдХ field рд▓рд╛ рдлрдХреНрдд 2% рдЪреВрдХ рдЕрд╕рд▓реА рддрд░реА рджрд╣рд╛рдкреИрдХреА рдПрдХ site рдмрд┐рдШрдбрддреЗ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
iac/cloud.py рдордзреАрд▓ by_hand(cloud, rng, slip) рдореНрд╣рдгрдЬреЗ console рд╡рд░рдЪреА
рдХрддрд░рд┐рдирд╛: рдкреНрд░рддреНрдпреЗрдХ site рд▓рд╛ 8 fields, рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ field рдордзреНрдпреЗ рдЪреВрдХ рд╣реЛрдгреНрдпрд╛рдЪреА slip рд╢рдХреНрдпрддрд╛ (рдПрдЦрд╛рджрд╛ рдЖрдХрдбрд╛
├Ч10 рдЯрд╛рдЗрдк рд╣реЛрдгреЗ, рджреЛрди рдЕрдХреНрд╖рд░рд╛рдВрдЪреА рдЕрджрд▓рд╛рдмрджрд▓, рдПрдЦрд╛рджрд╛ locker рд╡рд┐рд╕рд░рдгреЗ). fingerprint(cloud) campus рдиреЗ рдирд┐рд╡рдбрд▓реЗрд▓реНрдпрд╛
ids рд╢рд┐рд╡рд╛рдп site рдЪреЗ рд╡рд░реНрдгрди рдХрд░рддреЗ, рдореНрд╣рдгреВрди рд╕рд╛рд░рдЦреНрдпрд╛ рдкрджреНрдзрддреАрдиреЗ рдмрд╛рдВрдзрд▓реЗрд▓реНрдпрд╛ рджреЛрди sites рдЬреБрд│рддрд╛рдд.
iac/demo.py рдордзреАрд▓ why() рддреАрди sites рд╣рд╛рддрд╛рдиреЗ рдмрд╛рдВрдзрддреЗ, рдордЧ рддреАрди рдЖрд░рд╛рдЦрдбреНрдпрд╛рд╡рд░реВрди
(CAMPUS, рдПрдХ config dict) iac/engine.py рдордзреАрд▓ plan() рдЖрдгрд┐ apply()
рд╡рд╛рдкрд░реВрди рдмрд╛рдВрдзрддреЗ, рдЖрдгрд┐ рдордЧ рдкреВрд░реНрдг рдЭрд╛рд▓реЗрд▓реНрдпрд╛ site рд╡рд┐рд░реБрджреНрдз рдЖрдгрдЦреА рдПрдХрджрд╛ plan рдХрд░рддреЗ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 iac/demo.py why
python3 - <<'EOF'
import sys; sys.path.insert(0, "iac")
from cloud import FakeCloud, Rng, by_hand, fingerprint
from engine import plan, apply
from demo import CAMPUS
good = FakeCloud(); apply(plan(CAMPUS, None, good), good); want = fingerprint(good)
for slip in (0.0, 0.02, 0.05, 0.1, 0.2):
rng, ok = Rng(5), 0
for site in range(10):
c = FakeCloud(); by_hand(c, rng, slip); ok += fingerprint(c) == want
print(f"slip {slip:>4.0%} per field тЖТ {ok:>2} of 10 hand-built sites match the plans")
EOF
python3 iac/test_iac.py
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
why рдЕрд╕реЗ print рдХрд░рддреЗ:
тФАтФА the works office builds the same campus 3 times BY HAND (8 fields per site, 10% chance of a slip per field)
dev 8 fields typed ┬╖ 5 objects ┬╖ slips: none
staging 8 fields typed ┬╖ 5 objects ┬╖ slips: none
prod 8 fields typed ┬╖ 5 objects ┬╖ slips: floor typed 20 instead of 2
do the 3 hand-built sites match? False
do the 3 plan-built sites match? True
тФАтФА apply the same plans to the dev site again тЖТ No changes. Your infrastructure matches the configuration.
рддреБрдордЪрд╛ snippet рдЕрд╕реЗ print рдХрд░рддреЛ:
slip 0% per field тЖТ 10 of 10 hand-built sites match the plans
slip 2% per field тЖТ 9 of 10 hand-built sites match the plans
slip 5% per field тЖТ 7 of 10 hand-built sites match the plans
slip 10% per field тЖТ 5 of 10 hand-built sites match the plans
slip 20% per field тЖТ 2 of 10 hand-built sites match the plans
Tests рдЪреНрдпрд╛ рд╢реЗрд╡рдЯреА 12/12 passed рдпреЗрддреЗ.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рдЖрд░рд╛рдЦрдбреНрдпрд╛рдиреЗ рддреАрди рдПрдХрд╕рд╛рд░рдЦреНрдпрд╛ sites рдмрд╛рдВрдзрд▓реНрдпрд╛, рдЖрдгрд┐ рджреБрд╕рд▒реНрдпрд╛ run рдиреЗ рдХрд╛рд╣реАрдЪ рдмрджрд▓рд▓реЗ рдирд╛рд╣реА тАФ рдЖрд░рд╛рдЦрдбрд╛ рдкреБрдиреНрд╣рд╛-рдкреБрдиреНрд╣рд╛ рд╕рд╛рд░рдЦрд╛рдЪ (repeatable) рдЖрдгрд┐ idempotent рдЖрд╣реЗ. рд╣рд╛рддрд╛рдиреЗ рдмрд╛рдВрдзрддрд╛рдирд╛ рдирд┐рдХрд╛рд▓ рдирд╢рд┐рдмрд╛рд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЕрд╕рддреЛ: 10% slip rate рд▓рд╛ 10 рдкреИрдХреА рдлрдХреНрдд 5 sites рдмрд░реЛрдмрд░ рдЖрд▓реНрдпрд╛, рдЖрдгрд┐ 2% рд▓рд╛ рд╕реБрджреНрдзрд╛ рджрд╣рд╛рдкреИрдХреА рдПрдХ site рдЪреБрдХреАрдЪреА рд╣реЛрддреА. (рд╣реЗ slip rates рдХрд╛рд▓реНрдкрдирд┐рдХ рдЖрд╣реЗрдд; рдореБрджреНрджрд╛ рд╣рд╛ рдЖрд╣реЗ рдХреА рдкреНрд░рддреНрдпреЗрдХ click рдордзреАрд▓ рдЫреЛрдЯреНрдпрд╛ рдЪреБрдХрд╛ рдЕрдиреЗрдХ fields рдЖрдгрд┐ рдЕрдиреЗрдХ sites рдордзреНрдпреЗ рдЧреБрдгрд╛рдХрд╛рд░рд╛рдиреЗ рд╡рд╛рдврддрд╛рдд.)
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- рдЖрд░рд╛рдЦрдбрд╛ рд▓рд┐рд╣реВрди рдордЧ console рдордзреНрдпреЗ "рдкрдЯрдХрди" рдХрд╛рд╣реАрддрд░реА рджреБрд░реБрд╕реНрдд рдХрд░рдгреЗ (рдзрдбрд╛ 09 рддреНрдпрд╛рдЪреА рдХрд┐рдВрдордд рджрд╛рдЦрд╡рддреЛ)
- IaC files рдирд╛ рд╡рд░реВрди рдЦрд╛рд▓реА рдЪрд╛рд▓рдгрд╛рд▒реНрдпрд╛ scripts рд╕рдордЬрдгреЗ тАФ рддреНрдпрд╛ рд╢реЗрд╡рдЯрдЪреНрдпрд╛ рд╕реНрдерд┐рддреАрдЪреЗ рд╡рд░реНрдгрди рдХрд░рддрд╛рдд
- рдЖрд░рд╛рдЦрдбрд╛ git рдордзреНрдпреЗ reviews рд╕рд╣ рдареЗрд╡рдгреНрдпрд╛рдРрд╡рдЬреА рдПрдХрд╛рдЪ laptop рд╡рд░ рдареЗрд╡рдгреЗ
- рд╕рдВрдкреВрд░реНрдг company рдЪреНрдпрд╛ infrastructure рдкрд╛рд╕реВрди рд╕реБрд░реБрд╡рд╛рдд рдХрд░рдгреЗ тАФ рдПрдХрд╛ рдЫреЛрдЯреНрдпрд╛, рдирд╡реНрдпрд╛ рддреБрдХрдбреНрдпрд╛рдкрд╛рд╕реВрди рд╕реБрд░реВ рдХрд░рд╛
- IaC рдореБрд│реЗ cloud рд╕рдордЬреВрди рдШреЗрдгреНрдпрд╛рдЪреА рдЧрд░рдЬ рд╕рдВрдкрддреЗ рдЕрд╕реЗ рд╡рд╛рдЯрдгреЗ тАФ рдЖрд░рд╛рдЦрдбрд╛ рддреНрдпрд╛рдЪреНрдпрд╛ рд▓реЗрдЦрдХрд╛рдЗрддрдХрд╛рдЪ рдЪрд╛рдВрдЧрд▓рд╛ рдЕрд╕рддреЛ
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд
рдЦрд▒реНрдпрд╛ account рд╡рд░ тАФ рд╕рд░реНрд╡рд╛рдд рдЫреЛрдЯрд╛ рдЦрд░рд╛ Terraform workflow. Terraform (рдХрд┐рдВрд╡рд╛
OpenTofu) install рдХрд░рд╛, рдПрдХ main.tf рд▓рд┐рд╣рд╛, рдЖрдгрд┐ рдордЧ:
terraform init # download the providers named in the config (lesson 02)
terraform plan # show what would change тАФ nothing is built yet (lesson 03)
terraform apply # show the plan again, ask "yes", then build it
terraform apply # run it again: "No changes. Your infrastructure matches the configuration."
OpenTofu рдордзреНрдпреЗ commands рддрд╢рд╛рдЪ рдЖрд╣реЗрдд, рдлрдХреНрдд terraform рдРрд╡рдЬреА tofu. рддреБрдореНрд╣рд╛рд▓рд╛ рднреЗрдЯрдгрд╛рд░реА рдЗрддрд░ IaC
tools:
- AWS CloudFormation рдЖрдгрд┐ AWS CDK тАФ рдлрдХреНрдд AWS; CloudFormation state рддреБрдордЪреНрдпрд╛рд╕рд╛рдареА рд╕рд╛рдВрднрд╛рд│рддреЗ.
- Pulumi тАФ рдЖрд░рд╛рдЦрдбрд╛ TypeScript, Python, Go рдХрд┐рдВрд╡рд╛ C# рдордзреНрдпреЗ рд▓рд┐рд╣рд┐рд▓рд╛ рдЬрд╛рддреЛ, plan/apply рд╕рд╛рд░рдЦреНрдпрд╛рдЪ рдХрд▓реНрдкрдиреЗрд╕рд╣.
- Ansible, Chef, Puppet тАФ рдореБрдЦреНрдпрддрдГ configuration management: server рдЪреНрдпрд╛ рдЖрдд рдХрд╛рдп рдЪрд╛рд▓рддреЗ. Terraform рдореБрдЦреНрдпрддрдГ servers, networks рдЖрдгрд┐ services рд╕реНрд╡рддрдГрдЪ рддрдпрд╛рд░ рдХрд░рддреЗ.
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: рдЖрдЬ рд╣рд╛рддрд╛рдиреЗ рдмрд╛рдВрдзрд▓реЗрд▓рд╛ infrastructure рдЪрд╛ рдПрдХ рддреБрдХрдбрд╛ рдирд┐рд╡рдбрд╛ (рдПрдХ bucket, рдПрдХ DNS zone, рдПрдХ рдЫреЛрдЯреА service). рддреЛ code рдореНрд╣рдгреВрди рд▓рд┐рд╣рд╛, рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдЕрд╕рд▓реЗрд▓реЗ objects import рдХрд░рд╛ (рдзрдбрд╛ 09), рдЖрдгрд┐ рддреНрдпрд╛ рддреБрдХрдбреНрдпрд╛рд╕рд╛рдареА "console рдордзреНрдпреЗ рдмрджрд▓ рдирд╛рд╣реАрдд" рд╣рд╛ рдирд┐рдпрдо рдХрд░рд╛.
тПня╕П рдкреБрдвреЗ
рдЖрд░рд╛рдЦрдбреНрдпрд╛рд▓рд╛ рдПрдХ рд╢рдмреНрджрд╕рдВрдЧреНрд░рд╣ рд▓рд╛рдЧрддреЛ: resource рдореНрд╣рдгрдЬреЗ рдХрд╛рдп, provider рдХреЛрдг, рдЖрдгрд┐ рдЖрд░рд╛рдЦрдбреНрдпрд╛рдд рдХреЛрдгрддреА fields рдард░рд╡рддрд╛ рдпреЗрддрд╛рдд?
git checkout lesson-02-resources-providers