Amazon ECR คืออะไร? การแนะนำฟังก์ชันล่าสุดของ AWS

นี่เป็นบทความแปล ที่มีเนื้อหามาจากบทความภาษาญี่ปุ่นของ Classmethod, Inc. ในหัวข้อ「AWS再入門ブログリレー2022 Amazon ECR編」 หากผู้อ่านสนใจอ่านเนื้อหาต้นฉบับสามารถอ่านได้ที่ลิ้งค์ "บทความต้นฉบับ" ด้านล่าง เนื้อหาในบทความนี้การอธิบายบางอย่างจะถูกปรับให้เข้าใจง่ายขึ้นทำให้แตกต่างจากต้นฉบับในบางจุด

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Amazon ECR คืออะไร?

Amazon Elastic Container Registry (ECR) เป็นบริการ Docker container registry ที่เราสามารถจัดเก็บ, จัดการ, และปรับใช้กับ Docker image container ที่สร้างขึ้นเองหรือซื้อจาก AWS Marketplace ได้

ใน container registry มีบริการต่างๆ เช่น Docker Registry หรือจะเป็น บริการ SaaS อย่าง Docker Hub ที่บริษัท Docker เป็นผู้ให้บริการ เป็นต้น

โดย ECR มีคุณสมบัติดังต่อไปนี้

  • ไม่จำเป็นต้องดำเนินการด้านโครงสร้าง (infrastructure)
    • เนื่องจากเป็น Managed service จึงไม่มีความจำเป็นต้องดำเนินการด้านโครงสร้าง (infrastructure) หรือ ปรับขนาด (scailing)
  • มีความทนทานสูง และอยู่ในสภาพพร้อมใช้งานตลอดเวลา
    • การใช้ s3 เป็นพื้นที่จัดเก็บ
  • ผสานกับบริการต่างๆของ AWS
    • สามารถตั้งค่าการเข้าถึงที่ repository ต่างๆด้วย policy ที่ใช้ผ่าน IAM Role และ IAM User
    • ลดความซับซ้อนของ workflow ด้วยการใช้งานร่วมกับ Amazon ECS, Amazon EKS, AWS Lambda และอื่นๆ
    • ทำงานอย่างใกล้ชิดกับ Code Build และ Code Deploy และยังสามารถใช้ในสร้าง CI/CD pipeline ได้อีกด้วย

หากคุณต้องการใช้งานกับบริการอื่นๆของ AWS แนะนำให้ใช้บริการ ECR ครับ

ฟังก์ชั่นของ Amazon ECR

ECR เป็นการประกอบกันจาก Registory และ Repository โดยใน 1 region จะมี 1 Public Registory และ 1 Private Registory ครับ
เราสามารถสร้าง Repository ได้มากกว่า 1 ใน Registory โดย container image จะบันทึกที่ Repository ครับ

ฟังก์ชั่นของ Registory

Registory จะมี 2 ประเภทหลักๆดังนี้

Public Registory

  • คอนเทนเนอร์อิมเมจที่บันทึกไว้สามารถเผยแพร่สู่ภายนอก AWS ได้
    • คอนเทนเนอร์อิมเมจจะปรับใช้โดยอัตโนมัติในแต่ละ region ของ AWS ซึ่งช่วยลดเวลา pull ข้อมูล และยังปรับปรุงด้านความพร้อมในการใช้งาน
  • คอนเทนเนอร์อิมเมจที่เผยแพร่แล้วสามารถ pull ข้อมูลจาก ECR Public Gallery ได้
    • ในเดือนพฤศจิกายนปีที่แล้ว(2021) ได้มีการเปิดตัว Docker official image ซึ่งสามารถใช้งานแทน Docker Hub ได้
  • URL จะอยู่ในรูปแบบ public.ecr.aws/[alias]/
    • ในตอนที่สร้าง alias ครั้งแรกจะได้รับการกำหนดค่าแบบสุ่มที่เรียกว่า default alias
    • ยื่นเรื่องขอทำการ custom alias เมื่อได้รับการอนุมัติแล้วจะสามารถตั้งชื่อตามที่ต้องการได้

Private Registory

  • คอนเทนเนอร์อิมเมจที่บันทึกไว้สามารถเผยแพร่ได้ภายในวงจำกัด
    • ใช้งานกับแอพพลิเคชั่นภายในบริษัท
  • URL จะอยู่ในรูปแบบ [Account ID].dkr.ecr.[Region].amazonaws.com
    • โดย URL จะเปลี่ยนไปตาม AWS Account และ Region
  • pull through cache
    • Public Registry Repository สามารถทำการ cashed ข้อมูลใน Private Registryได้
    • และด้วยการใช้งาน VPC endpoint interface ของ ECR ทำให้สามารถเข้าถึงเนื้อหาที่อัพเดทของ Public Registory จาก Private Subnetได้
    • ข้อมูลจะไม่ real time เนื่องจากจะเชื่อมข้อมูล 1 ครั้ง/24 ชั่วโมง
  • Replication
    • 1.Cross-Region Replication
      • เลือก Region อื่นแล้วทำการ Replication
    • 2.Cross-Account Replication
      • เลือก Region และ account ปลายทางแล้วทำการ Replication
      • ต้องมีการตั้งค่า policy ของ Registory เพื่อเปิดการเข้าถึง account ปลายทาง
  • การอนุญาต
    • อนุญาตเปิดใช้งานฟังก์ชั่น pull through cache และ Replication ผ่าน AWS Principal
    • ใช้งาน Registory policy และบันทึกคำขออนุญาต
  • scan
    • 1.การ scan พื้นฐาน
      • สามารถสแกนช่องโหว่ในช่วงที่มีการ push โดยใช้ฐานข้อมูล CVE
    • 2.การแสกนขั้นสูง (Enhanced scanning)
      • ผสานร่วมกับบริการ Amazon Inspector v2 ทำให้สามารถ scan ข้อมูลอัตโนมัติได้อย่างต่อเนื่อง
      • scan เกี่ยวกับช่องโหว่ทั้งแพคเกจภาษาโปรแกรมมิ่ง และ OS (ระบบปฏิบัติการ)

ฟังก์ชั่นของ Repository

Repository จะมี 2 ประเภทใหญ่ๆดังนี้

Public Repository

ใน Public Repository จะตั้งค่าเป็นชื่อ Repository
โดยจะมีออฟชั่นที่สนับสนุนเกี่ยวกับ วิธีการใช้ image , ภาพรวมของ Repository , โลโก้ หรือ ประเภทเนื้อหา ต่างๆได้อีกด้วย

Private Repository

Private Repository จะสามารถตั้งค่าได้ตามนี้

  • Tag Immutability
    • เมื่อเปิดใช้งาน จะป้องกัน image tag ถูกเขียนทับโดยการ push ข้อมูลจาก image ที่ใช้ tag เดียวกัน
    • ด้วยการจะทำให้ image tag ทั้งหมดไม่ซ้ำกัน จึงสามารถห้ามการทำงานของ latest tag ในระดับ Repository ได้
  • การเข้ารหัส
    • เข้ารหัส image ที่เก็บไว้ใน Repository โดยใช้ KMS
    • ในค่าเริ่มต้น key เข้ารหัสจะเป็น key ที่ AWS เป็นเจ้าของ
    • สามารถตั้งค่า KMS key ที่สร้างไว้เองได้

สร้าง Private Repository แล้วลองทำการ push

มาสร้าง Private Repository แล้วลอง push ข้อมูลกัน

client machine

client machine จะใช้งานได้เวอร์ชั่นของระบบต่างๆดังนี้

  • OS
    • macOS Big Sur Version 11.6.5
  • aws-cli
    • 2.4.16
  • Docker Desktop
    • 4.6.1

เมื่อสร้าง directory ชื่อ ecr-test บน local แล้วก็ทำการสร้าง Dockerfile ตามด้านล่างนี้ครับ

ecr-test/Dockerfile

FROM alpine:3.15.1
CMD ["echo","Hello World"]

สร้าง Repository

เราจะสร้าง Repository ผ่านหน้า management console โดยจะสร้างและตั้งค่าชื่อ Repository ว่า test ตามภาพทางด้านล่างนี้ครับ

เมื่อตั้งค่าเสร็จแล้ว ให้เลือกที่ create Repository

push ข้อมูล Docker image เข้าไปยัง Repository

เราสร้าง Repository ที่ชื่อว่า test ใน ECR ได้แล้ว จากหน้า management console ให้เลือกที่ View push commands

จากนั้นระบบจะแสดง 4 คำสั่งสำหรับการ push ข้อมูล Docker image ไปยัง test Repository

จาก terminal ของ client เราจะรัน 4 คำสั่งนี้ที่ ecr-test directory

xxxxxxx@xxxxxxx ecr-test % aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin AWS account number.dkr.ecr.ap-northeast-1.amazonaws.com
Login Succeeded
xxxxxxx@xxxxxxx ecr-test % docker build -t test .                                                                                                                             
[+] Building 0.9s (5/5) FINISHED                                                                                                                                                                                          
 => [internal] load build definition from Dockerfile                                                                                                                                                                 0.0s
 => => transferring dockerfile: 87B                                                                                                                                                                                  0.0s
 => [internal] load .dockerignore                                                                                                                                                                                    0.0s
 => => transferring context: 2B                                                                                                                                                                                      0.0s
 => [internal] load metadata for docker.io/library/alpine:3.15.1                                                                                                                                                     0.9s
 => CACHED [1/1] FROM docker.io/library/alpine:3.15.1@sha256:d6d0a0eb4d40ef96f2310ead734848b9c819bb97c9d846385c4aca1767186cd4                                                                                        0.0s
 => exporting to image                                                                                                                                                                                               0.0s
 => => exporting layers                                                                                                                                                                                              0.0s
 => => writing image sha256:8597e2c888b061820f07bcf32674ceaa26b5b510b8f8c004e7c623c27177beca                                                                                                                         0.0s
 => => naming to docker.io/library/test                                                                                                                                                                              0.0s

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
xxxxxxx@xxxxxxx ecr-test % docker tag test:latest AWS account number.dkr.ecr.ap-northeast-1.amazonaws.com/test:latest
xxxxxxx@xxxxxxx ecr-test % docker push AWS account number.dkr.ecr.ap-northeast-1.amazonaws.com/test:latest
The push refers to repository [AWS account number.dkr.ecr.ap-northeast-1.amazonaws.com/test]
534ef0372885: Pushed 
latest: digest: sha256:5deb9e49c07e84ba35cd0523d03098fad9b2766bee8af6f9d7bf045afb4e1c8f size: 527

จากคำสั่งทางด้านบนทำให้เราสามารถ push ข้อมูล image ไปยัง test Repository ได้ครับ

โดย image ที่บันทึกใน Repository จะสามารถทำงานเป็น container ได้ด้วยการอ้างอิงข้อมูลจาก ECS และ EKS ครับ และในส่วนของ image tag ก็สามารถตั้งเป็นชื่ออื่นๆได้ด้วยครับ

สุดท้ายนี้

จบไปแล้วนะครับ กับเรื่องเกี่ยวกับ Amazon ECR เป็นยังไงกันบ้างครับ พอจะเข้าใจกันมากขึ้นมั้ยครับ หวังว่าทุกคนจะถูกใจกันนะครับ บนหน้าเว็บไซต์ยังมีบทความที่น่าสนใจอัพเดทอยู่เรื่อยๆยังไงฝากติดตามกันด้วยนะครับ

บทความอ้างอิง

AWS再入門ブログリレー2022 Amazon ECR編 | DevelopersIO