ЁЯПж рдзрдбрд╛ 10 тАФ ECR рд╕реЗрдЯрдЕрдк: рдмрдБрдХреЗрдЪрд╛ locker рднрд╛рдбреНрдпрд╛рдиреЗ рдШреЗрдгреЗ
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 10 ┬╖ рдорд╛рдЧреЗ: lesson-09-registries ┬╖ рдкреБрдвреЗ: lesson-11-push-pull-lifecycle
ЁЯФЧ AWS рд╢реА рд╕рдВрдмрдВрдз: IAM тЖТ ECR. ECR authentication рд╣рд╛ IAM рдЪрд╛ рдкреНрд░рд╢реНрди рдЖрд╣реЗ тАФ AWS рд╢рд╛рд│реЗрдЪрд╛ рдзрдбрд╛ 05 (рдорд╢реАрдирдЪреНрдпрд╛ рдУрд│рдЦреА) рд╣рд╛ рдпрд╛ рдзрдбреНрдпрд╛рдЪрд╛ рджреБрд╕рд░рд╛ рдЕрд░реНрдзрд╛ рднрд╛рдЧ рдЖрд╣реЗ.
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ09, рдЖрдгрд┐ рддреНрдпрд╛рд╢рд┐рд╡рд╛рдп: рддреБрдордЪреА рдЦрд╛рдЬрдЧреА ECR repository рдмрдирд╡рдгреЗ рдЖрдгрд┐ рддрд┐рдЪреА рджреЛрди-рдХрд┐рд▓реНрд▓реНрдпрд╛рдВрдЪреА security рд╕рдордЬреВрди рдШреЗрдгреЗ. рдЦрд▒реНрдпрд╛ files:
- ecr/ecr.tf тАФ Terraform code рдЪреНрдпрд╛ рд░реВрдкрд╛рддрд▓рд╛ locker (immutable tags, scan-on-push)
- ecr/lifecycle-policy.json тАФ рд╕рдлрд╛рдИ рдХрд░реНрдордЪрд╛рд▒реНрдпрд╛рдЪреЗ рдирд┐рдпрдо (рдзрдбрд╛ 11 рд╕рдордЬрд╛рд╡рддреЛ)
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
Docker Hub рд╣реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЧреЛрджрд╛рдо рдЖрд╣реЗ тАФ node:20-alpine рд╕рд╛рдареА рдареАрдХ, рдкрдг рддреБрдордЪреНрдпрд╛
рдХрдВрдкрдиреАрдЪреНрдпрд╛ рдЬреЗрд╡рдгрд╛рд╕рд╛рдареА рдЪреБрдХреАрдЪреЗ. рддреБрдореНрд╣рд╛рд▓рд╛ рдмрдБрдХреЗрддрд▓рд╛ locker ЁЯПж рд╣рд╡рд╛: рдЦрд╛рдЬрдЧреА, рдкрд╣рд╛рд▒реНрдпрд╛рддрд▓рд╛,
рддреБрдордЪрд╛. рдЖрдд рдЬрд╛рддрд╛рдирд╛ рджреЛрди рддрдкрд╛рд╕рдгреНрдпрд╛ рд╣реЛрддрд╛рдд, рдЖрдгрд┐ рд▓реЛрдХ рддреНрдпрд╛ рдиреЗрд╣рдореА рдЧреЛрдВрдзрд│рддрд╛рдд:
- рдореБрд│рд╛рдд рддреБрдореНрд╣реА рдмрдБрдХреЗрдЪреЗ рдЧреНрд░рд╛рд╣рдХ рдЖрд╣рд╛рдд рдХрд╛? ЁЯкк рддреЗ рдореНрд╣рдгрдЬреЗ IAM тАФ рддреБрдордЪреА AWS рдУрд│рдЦ
рдЖрдгрд┐ рддрд┐рдЪреНрдпрд╛ рдкрд░рд╡рд╛рдирдЧреНрдпрд╛ (
ecr:*actions). AWS credentials рдирд╛рд╣реАрдд, рддрд░ рдмреЛрд▓рдгреЗрдЪ рдирд╛рд╣реА. рд╣реЗ рджреАрд░реНрдШрдХрд╛рд│ рдЯрд┐рдХрдгрд╛рд░реЗ рдЕрд╕рддреЗ рдЖрдгрд┐ рдПрдХрджрд╛рдЪ рд╕реЗрдЯ рдХреЗрд▓реЗ рдЬрд╛рддреЗ. - рджрд┐рд╡рд╕рд╛рдЪрд╛ рдкрд╛рд╕ ЁЯОл тАФ рдЧреНрд░рд╛рд╣рдХ рдЕрд╕рд▓рд╛рдд рддрд░реА locker room рд▓рд╛ рддрд╛рдЬреЗ
рддрд┐рдХреАрдЯ рд╣рд╡реЗ:
aws ecr get-login-passwordрдПрдХ token рдЫрд╛рдкрддреЗ рдЬреЛ 12 рддрд╛рд╕ рд╡реИрдз рдЕрд╕рддреЛ, рдЖрдгрд┐ рддреЛ рддреБрдореНрд╣реАdocker loginрд▓рд╛ рджреЗрддрд╛. рдЙрджреНрдпрд╛? рдирд╡реЗ рддрд┐рдХреАрдЯ. (рдореНрд╣рдгреВрдирдЪ CI pipelines рдкреНрд░рддреНрдпреЗрдХ run рд╡рд░ login рдХрд░рддрд╛рдд тАФ k8s рдХреЛрд░реНрд╕рдордзрд▓рд╛ CircleCI job рдиреЗрдордХреЗ рд╣реЗрдЪ рдХрд░рдд рд╣реЛрддрд╛ рддреЗ рдЖрдард╡рд╛.)
рдЖрдгрд┐ locker рднрд╛рдбреНрдпрд╛рдиреЗ рдХрд╕рд╛ рдШреНрдпрд╛рдпрдЪрд╛? рд╕рд░реНрд╡реЛрддреНрддрдо рдЙрддреНрддрд░: code рдореНрд╣рдгреВрди тАФ
ecr/ecr.tf рддреЛ рдЬрд╛рд╣реАрд░ рдХрд░рддреЗ (IMMUTABLE tags рд╕рд╣: рдПрдХрджрд╛ рдЪрд┐рдХрдЯрд╡рд▓реЗрд▓реЗ
рд▓реЗрдмрд▓ рд╢рд╛рдВрддрдкрдгреЗ рджреБрд╕рд▒реНрдпрд╛ рдбрдмреНрдпрд╛рд╡рд░ рдкреБрдиреНрд╣рд╛ рдХрдзреАрдЪ рдЪрд┐рдХрдЯрд╡рддрд╛ рдпреЗрдд рдирд╛рд╣реА тАФ hygiene
рдирд┐рдпрдо #1 рдмрдБрдХрдЪ рд╕реНрд╡рддрдГ рд▓рд╛рдЧреВ рдХрд░рддреЗ ЁЯП╖я╕ПЁЯФТ).
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
tf["ЁЯПЧя╕П terraform apply<br/>ecr/ecr.tf - rent once"]
subgraph aws["тШБя╕П AWS"]
repo["ЁЯПж ECR repo: hello-school<br/>private ┬╖ IMMUTABLE tags<br/>ЁЯЫбя╕П scan on push"]
iam["ЁЯкк IAM<br/>who is a customer at all"]
end
you["ЁЯзСтАНЁЯТ╗ you / CI"]
pass["ЁЯОл 12-hour day pass<br/>aws ecr get-login-password"]
tf -->|"1"| repo
you -->|"2 identity checked"| iam
you -->|"3 fresh ticket"| pass -->|"docker login"| repo
тЭУ рдХрд╛рдп
- ECR repository рдордзреНрдпреЗ рдПрдХрд╛ ре▓рдкрдЪреНрдпрд╛ images рдЕрд╕рддрд╛рдд (рдХрдкреНрдкрд╛). рдкрддреНрддрд╛:
ACCOUNT_ID.dkr.ecr.REGION.amazonaws.com/hello-schoolтАФ region рд╣рд╛ рддреБрдордЪреНрдпрд╛ locker рдЪреНрдпрд╛ рд░рд╕реНрддреНрдпрд╛рдЪреНрдпрд╛ рдкрддреНрддреНрдпрд╛рдЪрд╛рдЪ рднрд╛рдЧ рдЖрд╣реЗ. image_tag_mutability = "IMMUTABLE"тАФv1рджреЛрдирджрд╛ push рдХреЗрд▓реНрдпрд╛рд╕ рдЕрдкрдпрд╢ рдпреЗрддреЗ. Tags рд╡рд┐рд╢реНрд╡рд╛рд╕рд╛рд░реНрд╣ рд╣реЛрддрд╛рдд; rollbacks рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рд╣реЛрддрд╛рдд.scan_on_push = trueтАФ рдмрдБрдХ рдпреЗрдгрд╛рд▒реНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдбрдмреНрдпрд╛рдЪрд╛ X-ray рдХрд╛рдврддреЗ (рдзрдбрд╛ 12).- рдЦрд░реНрдЪ: storage ~$0.10/GB-month, рдЦрд╛рдЬрдЧреА repos рд╕реНрд╡рддрдГ рдлреБрдХрдЯ. рдзрдбрд╛ 07 рдЪреНрдпрд╛ рд▓рд╣рд╛рди images + рдзрдбрд╛ 11 рдЪреНрдпрд╛ рд╕рдлрд╛рдИ рдХрд░реНрдордЪрд╛рд▒реНрдпрд╛рд╕рд╣: рдХрд╛рд╣реА рдкреИрд╕реЗ.
ЁЯза Authentication рдЪрд╛ рдкреНрд░рд╡рд╛рд╣, рд╕реНрдкрд╖реНрдЯрдкрдгреЗ
Developer
тЖУ AWS IAM credentials (SSO / CLI profile / role)
ECR authentication (aws ecr get-login-password тЖТ a 12-hour token)
тЖУ
Docker credential / token (docker login)
тЖУ
docker push
тЖУ
ECR repository
ECR authentication рд╣рд╛ IAM рдЪрд╛ рдкреНрд░рд╢реНрди рдЖрд╣реЗ. Docker рдлрдХреНрдд token рд╡рд╛рд╣реВрди рдиреЗрддреЛ; рддреБрдореНрд╣реА push рдХрд┐рдВрд╡рд╛ pull рдХрд░реВ рд╢рдХрддрд╛ рдХреА рдирд╛рд╣реА рд╣реЗ IAM policies рдард░рд╡рддрд╛рдд.
"рдХреЛрдг" рдЪреЗ рддреАрди рдкреНрд░рдХрд╛рд░:
Human developer тЖТ AWS CLI / SSO credentials тЖТ temporary ECR token
CI pipeline тЖТ OIDC тЖТ assumes an IAM role тЖТ temporary ECR token (no stored keys)
EKS nodes тЖТ node/instance role тЖТ pull permission (no login step at all)
рд╣реЗрдЪ AWS тЖТ Docker тЖТ Kubernetes рдирд╛рддреЗ рдПрдХрд╛ рддрдХреНрддреНрдпрд╛рдд: рдУрд│рдЦ AWS рдХрдбреВрди рдпреЗрддреЗ, artifact Docker рдХрдбреВрди, pull Kubernetes рдХрдбреВрди.
ЁЯдФ рдХрд╛
рдЦрд╛рдЬрдЧреА images рдирд╛ рдЦрд╛рдЬрдЧреА, IAM рдЪреНрдпрд╛ рдкрд╣рд╛рд▒реНрдпрд╛рддрд▓реЗ, region-local рдЧреЛрджрд╛рдо рд▓рд╛рдЧрддреЗ тАФ рдЖрдгрд┐ EKS nodes ECR рд╡рд░реВрди рд╕реНрд╡рддрдГрдЪреНрдпрд╛ IAM role рдиреЗ pull рдХрд░рддрд╛рдд, рдХреБрдареЗрд╣реА passwords рдирд╛рд╣реАрдд (рдмрдБрдХ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ рдХрд░реНрдордЪрд╛рд▒реНрдпрд╛рдВрдирд╛ рдУрд│рдЦрддреЗ). рддреЛ code рдореНрд╣рдгреВрди рднрд╛рдбреНрдпрд╛рдиреЗ рдШреЗрддрд▓реНрдпрд╛рдиреЗ рднрд╛рдЧ 2 рд╣реА trilogy рдЬреЗ рд╕рд╛рдВрдЧрддреЗ рддреНрдпрд╛рдЪреНрдпрд╛рд╢реА рд╕реБрд╕рдВрдЧрдд рд░рд╛рд╣рддреЛ: infrastructure рдЬрд╛рд╣реАрд░ рдХреЗрд▓реЗрд▓реЗ, versioned, review рдХрд░рддрд╛ рдпреЗрдгрд╛рд░реЗ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛ (AWS account + configure рдХреЗрд▓реЗрд▓реЗ AWS CLI рд▓рд╛рдЧрддреЗ)
# rent the locker тАФ pick ONE of the two:
cd ecr && terraform init && terraform apply # as code (recommended)
# or the one-liner:
aws ecr create-repository --repository-name hello-school \
--image-tag-mutability IMMUTABLE \
--image-scanning-configuration scanOnPush=true
# your locker's address (save it тАФ lesson 11 uses it constantly):
aws ecr describe-repositories --repository-names hello-school \
--query 'repositories[0].repositoryUri' --output text
# тЖТ 123456789012.dkr.ecr.ap-south-1.amazonaws.com/hello-school
# the day pass ЁЯОл:
aws ecr get-login-password --region ap-south-1 \
| docker login --username AWS --password-stdin \
123456789012.dkr.ecr.ap-south-1.amazonaws.com # "Login Succeeded"
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- ECR authentication тЙа Docker Hub login тАФ username/password рдирд╛рд╣реА, IAM рдиреЗ рджрд┐рд▓реЗрд▓рд╛ 12 рддрд╛рд╕рд╛рдВрдЪрд╛ token
- access IAM permissions (
ecr:*actions) рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛рдд; рдлрдХреНрдд token рдХрд╛рд╣реАрдЪ рдЙрдШрдбрдд рдирд╛рд╣реА - CI settings рдордзреНрдпреЗ рдХрд╛рдпрдорд╕реНрд╡рд░реВрдкреА access keys тАФ OIDC тЖТ role рд╡рд╛рдкрд░рд╛ (AWS рд╢рд╛рд│рд╛, рдзрдбрд╛ 05)
- token рд╕рдВрдкрд▓рд╛ тАФ 12 рддрд╛рд╕рд╛рдВрдирдВрддрд░ "no basic auth credentials" рдпреЗрдгреЗ рд╕рд╛рдорд╛рдиреНрдп рдЖрд╣реЗ, рдкреБрдиреНрд╣рд╛ login рдХрд░рд╛
тПня╕П рдкреБрдвреЗ
Locker рднрд╛рдбреНрдпрд╛рдиреЗ рдШреЗрддрд▓рд╛, рдкрд╛рд╕ рд╣рд╛рддрд╛рдд рдЖрд╣реЗ. рдЖрддрд╛ рдкреНрд░рддреНрдпрдХреНрд╖ рддреНрдпрд╛рдд рдбрдмреЗ рдареЗрд╡рд╛рдпрдЪреА рд╡реЗрд│ тАФ tag, push, pull тАФ рдЖрдгрд┐ рддреЛ рдиреАрдЯрдиреЗрдЯрдХрд╛ рдареЗрд╡рдгрд╛рд▒реНрдпрд╛ рд╕рдлрд╛рдИ рдХрд░реНрдордЪрд╛рд▒реНрдпрд╛рдЪреА рдУрд│рдЦ рдХрд░реВрди рдШреНрдпрд╛.
git checkout lesson-11-push-pull-lifecycle