ЁЯПл The SchoolтА║ЁЯН▒ DockerтА║ЁЯПж рдзрдбрд╛ 10 тАФ ECR рд╕реЗрдЯрдЕрдк: рдмрдБрдХреЗрдЪрд╛ locker рднрд╛рдбреНрдпрд╛рдиреЗ рдШреЗрдгреЗ
ЁЯЦ╝я╕П See the drawing + lab ЁЯПа Course home ЁЯМ┐ Branch on GitHub тЬПя╕П View source
ЁЯЦ╝я╕П рдЖрдХреГрддреА рдЖрдгрд┐ labThe drawing + lab рдкреВрд░реНрдг рдкрд╛рдирд╛рд╡рд░ рдЙрдШрдбрд╛ тЖЧOpen full page тЖЧ

ЁЯПж рдзрдбрд╛ 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:

ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ

Docker Hub рд╣реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЧреЛрджрд╛рдо рдЖрд╣реЗ тАФ node:20-alpine рд╕рд╛рдареА рдареАрдХ, рдкрдг рддреБрдордЪреНрдпрд╛ рдХрдВрдкрдиреАрдЪреНрдпрд╛ рдЬреЗрд╡рдгрд╛рд╕рд╛рдареА рдЪреБрдХреАрдЪреЗ. рддреБрдореНрд╣рд╛рд▓рд╛ рдмрдБрдХреЗрддрд▓рд╛ locker ЁЯПж рд╣рд╡рд╛: рдЦрд╛рдЬрдЧреА, рдкрд╣рд╛рд▒реНрдпрд╛рддрд▓рд╛, рддреБрдордЪрд╛. рдЖрдд рдЬрд╛рддрд╛рдирд╛ рджреЛрди рддрдкрд╛рд╕рдгреНрдпрд╛ рд╣реЛрддрд╛рдд, рдЖрдгрд┐ рд▓реЛрдХ рддреНрдпрд╛ рдиреЗрд╣рдореА рдЧреЛрдВрдзрд│рддрд╛рдд:

  1. рдореБрд│рд╛рдд рддреБрдореНрд╣реА рдмрдБрдХреЗрдЪреЗ рдЧреНрд░рд╛рд╣рдХ рдЖрд╣рд╛рдд рдХрд╛? ЁЯкк рддреЗ рдореНрд╣рдгрдЬреЗ IAM тАФ рддреБрдордЪреА AWS рдУрд│рдЦ рдЖрдгрд┐ рддрд┐рдЪреНрдпрд╛ рдкрд░рд╡рд╛рдирдЧреНрдпрд╛ (ecr:* actions). AWS credentials рдирд╛рд╣реАрдд, рддрд░ рдмреЛрд▓рдгреЗрдЪ рдирд╛рд╣реА. рд╣реЗ рджреАрд░реНрдШрдХрд╛рд│ рдЯрд┐рдХрдгрд╛рд░реЗ рдЕрд╕рддреЗ рдЖрдгрд┐ рдПрдХрджрд╛рдЪ рд╕реЗрдЯ рдХреЗрд▓реЗ рдЬрд╛рддреЗ.
  2. рджрд┐рд╡рд╕рд╛рдЪрд╛ рдкрд╛рд╕ ЁЯОл тАФ рдЧреНрд░рд╛рд╣рдХ рдЕрд╕рд▓рд╛рдд рддрд░реА 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

тЭУ рдХрд╛рдп

ЁЯза 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"

тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛

тПня╕П рдкреБрдвреЗ

Locker рднрд╛рдбреНрдпрд╛рдиреЗ рдШреЗрддрд▓рд╛, рдкрд╛рд╕ рд╣рд╛рддрд╛рдд рдЖрд╣реЗ. рдЖрддрд╛ рдкреНрд░рддреНрдпрдХреНрд╖ рддреНрдпрд╛рдд рдбрдмреЗ рдареЗрд╡рд╛рдпрдЪреА рд╡реЗрд│ тАФ tag, push, pull тАФ рдЖрдгрд┐ рддреЛ рдиреАрдЯрдиреЗрдЯрдХрд╛ рдареЗрд╡рдгрд╛рд▒реНрдпрд╛ рд╕рдлрд╛рдИ рдХрд░реНрдордЪрд╛рд▒реНрдпрд╛рдЪреА рдУрд│рдЦ рдХрд░реВрди рдШреНрдпрд╛.

git checkout lesson-11-push-pull-lifecycle

ЁЯПж Lesson 10 тАФ ECR setup: renting the bank locker

ЁЯУН You are here: Lesson 10 of 12 ┬╖ Previous: lesson-09-registries ┬╖ Next: lesson-11-push-pull-lifecycle

ЁЯФЧ AWS connection: IAM тЖТ ECR. ECR authentication is an IAM problem тАФ the AWS school's lesson 05 (machine identities) is the other half of this lesson.


ЁЯУж What's in this branch

Lessons 01тАУ09, plus: creating your private ECR repository and understanding its two-key security. Real files:

ЁЯзТ Explain like I'm 5

Docker Hub is a public warehouse тАФ fine for node:20-alpine, wrong for your company's lunches. You want a locker at the bank ЁЯПж: private, guarded, yours. Getting in involves TWO checks, and people always confuse them:

  1. Are you a bank customer at all? ЁЯкк That's IAM тАФ your AWS identity and its permissions (ecr:* actions). No AWS credentials, no conversation. This is long-lived and set up once.
  2. The day pass ЁЯОл тАФ even as a customer, the locker room wants a fresh ticket: aws ecr get-login-password prints a token that's valid for 12 hours, and you feed it to docker login. Tomorrow? New ticket. (This is why CI pipelines log in every run тАФ remember the k8s course's CircleCI job doing exactly this.)

And how do you rent the locker? Best answer: as code тАФ ecr/ecr.tf declares it (with IMMUTABLE tags: a label, once glued, can never be silently re-glued onto a different box тАФ hygiene rule #1 enforced by the bank itself ЁЯП╖я╕ПЁЯФТ).

ЁЯЧ║я╕П Diagram

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

тЭУ What

ЁЯза The authentication flow, made explicit

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 is an IAM problem. Docker only carries the token; whether you may push or pull at all is decided by IAM policies.

Three kinds of "who":

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)

That is the AWS тЖТ Docker тЖТ Kubernetes relationship in one table: identity comes from AWS, the artifact from Docker, the pull from Kubernetes.

ЁЯдФ Why

Private images need a private, IAM-guarded, region-local warehouse тАФ and EKS nodes pull from ECR with their own IAM role, no passwords anywhere (the bank recognizes its own staff). Renting it as code keeps Part 2 consistent with everything this trilogy preaches: infrastructure declared, versioned, reviewable.

ЁЯзк Try it (needs an AWS account + AWS CLI configured)

# 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"

тЪая╕П Common mistakes

тПня╕П Next

Locker rented, pass in hand. Time to actually file boxes in it тАФ tag, push, pull тАФ and meet the janitor who keeps it tidy.

git checkout lesson-11-push-pull-lifecycle
тЖР PreviousregistriesNext тЖТpush pull lifecycle

This page is the lesson's README from the lesson-10-ecr-setup branch, shown here so the whole School stays on one site. Code files open on GitHub at the same branch.