Ở phần này, chúng ta sẽ tiến hành xây dựng một AMI Pipeline thông qua EC2 Image Builder.
EC2 Image Builder là dịch vụ giúp chúng ta đơn giản hoá các tác vụ từ khởi tạo, bảo trì, kiểm thử và phân phối các Linux/Windows Images.

Sau khi hoàn thành phần này, chúng ta sẽ có thể
Để tiến hành triển khai hạ tầng, chúng ta sẽ sử dụng dịch vụ AWS CloudFormation thông qua AWS Console hoặc AWS CLI.
| Thành Phần | Giá Trị (Bắt buộc) |
|---|---|
| Stack Name | pattern3-pipeline |
| Template | pattern3-pipeline.yml - tải ở mục Template bên dưới |
| BaselineVpcStack | pattern3-base |
Bạn hãy tải template ở đây:
Template nhận các tham số sau:
| Tham số | Mặc định | Ý nghĩa |
|---|---|---|
BaselineVpcStack | (bắt buộc) | Tên Stack của phần Hạ tầng Cơ bản, dùng để lấy VPC và Private Subnet |
MasterAMI | /aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64 | SSM Public Parameter trỏ đến AMI Amazon Linux 2023 mới nhất |
Ver | 1.0.0 | Phiên bản của Component và Image Recipe |
BuildInstanceType | t3.medium | Loại instance dùng để build AMI |
EnableInspectorScanning | false | Bật quét lỗ hổng bằng Amazon Inspector cho AMI đầu ra |
Sau đây là các bước khởi tạo thông qua AWS CLI:
aws cloudformation create-stack --stack-name pattern3-pipeline --template-body file://pattern3-pipeline.yml --parameters ParameterKey=BaselineVpcStack,ParameterValue=pattern3-base --capabilities CAPABILITY_IAM --region ap-southeast-2

Chờ Stack khởi tạo xong. Bước này khá nhanh, khoảng 1 đến 2 phút, vì chúng ta chỉ đang tạo định nghĩa của pipeline chứ chưa build AMI.
aws cloudformation wait stack-create-complete --stack-name pattern3-pipeline --region ap-southeast-2
Xác nhận CloudFormation Stack đã khởi tạo hoàn tất với StackStatus là CREATE_COMPLETE.
aws cloudformation describe-stacks --stack-name pattern3-pipeline --region ap-southeast-2 --query "Stacks[0].StackStatus" --output text

Pattern3ImagePipeline (ARN của pipeline) và Pattern3ParentImageId.aws cloudformation describe-stacks --stack-name pattern3-pipeline --region ap-southeast-2 --query "Stacks[0].Outputs" --output table

Bạn có thể kiểm tra AMI Amazon Linux 2023 nào đang được dùng làm Parent Image bằng lệnh sau. Giá trị này phải khớp với Pattern3ParentImageId ở Output:
aws ssm get-parameter --name /aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64 --region ap-southeast-2 --query "Parameter.Value" --output text

Nếu bạn đã triển khai bằng CloudFormation, có thể bỏ qua các mục thủ công bên dưới và đi thẳng tới Thực thi Builder Pipeline.
Phần này dành cho bạn muốn hiểu rõ từng thành phần của một AMI Pipeline. Chúng ta sẽ lần lượt thực hiện các bước sau đây:
Bởi tính chất của dịch vụ S3, khi đặt tên cho S3 Bucket, chúng ta cần phải tuân theo một số quy tắc được đặc tả tại URL sau.
uuidgen | awk -F- '{print tolower($1$2$3)}'
([guid]::NewGuid().ToString('N')).Substring(0,12).ToLower()

pattern3-logging và chuỗi UUID trên, rồi chặn toàn bộ truy cập public. Bucket này chỉ chứa log nội bộ nên không có lý do gì để mở ra Internet.BUCKET="pattern3-logging-$(uuidgen | awk -F- '{print tolower($1$2$3)}')"
echo "Bucket: $BUCKET"
aws s3 mb "s3://${BUCKET}" --region ap-southeast-2
aws s3api put-public-access-block --bucket "$BUCKET" --public-access-block-configuration "BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true" --region ap-southeast-2
$BUCKET = "pattern3-logging-" + ([guid]::NewGuid().ToString('N')).Substring(0,12).ToLower()
Write-Output "Bucket: $BUCKET"
aws s3 mb "s3://$BUCKET" --region ap-southeast-2
aws s3api put-public-access-block --bucket $BUCKET --public-access-block-configuration "BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true" --region ap-southeast-2

Hãy ghi lại tên bucket, bạn sẽ cần nó ở bước tạo IAM Role và bước cấu hình logging cho pipeline.
Chi tiết về việc khởi tạo S3 bucket có tại Creating a bucket.
IAM Role này sẽ được sử dụng cho EC2 Image Builder với vai trò là một instance profile cho EC2 instance được khởi tạo tạm thời. EC2 instance này sẽ thực hiện tác vụ OS Patching.
Sau đây là quá trình tạo ra một IAM Role:
Roles và nhấn nút Create role.
AWS service và chọn Use case là EC2, sau đó nhấn Next.
Add permissions, tìm và chọn lần lượt các policy dưới đây:Next để sang màn hình Name, review, and create.pattern3-recipe-instance-role cùng với miêu tả cụ thể.
Create role.pattern3-recipe-instance-role.Permissions, chọn Add permissions và chọn Create inline policy.
<S3_BUCKET_NAME> bằng tên S3 Bucket ở bước trước.{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "WriteBuildLogs",
"Effect": "Allow",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::<S3_BUCKET_NAME>/*"
},
{
"Sid": "DescribeBucket",
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket"
],
"Resource": "arn:aws:s3:::<S3_BUCKET_NAME>"
}
]
}

Next.Create policy để hoàn tất.
Hãy chú ý phạm vi quyền ở đặc tả trên. Build instance chỉ cần ghi log lên đúng một bucket, nên policy chỉ mở s3:PutObject trên bucket đó. Tránh dùng "Action": "s3:*" hay gán managed policy AmazonS3FullAccess, vì như vậy là cấp quyền rộng hơn nhu cầu thực tế.
Chúng ta sẽ cần một EC2 Security Group cho EC2 instance tạm thời. Security Group không cần bất kỳ một Inbound Rule nào, tuy nhiên cần đảm bảo Outbound Rule mặc định để build instance có thể truy cập Internet qua NAT Gateway nhằm tải các bản vá.

Create security group.pattern3-pipeline-instance-security-group và miêu tả.pattern3-base.Create security group để khởi tạo.

Chúng ta sẽ tiến hành tạo một Component của dịch vụ EC2 Image Builder.
Create component.Linux.Amazon Linux 2023.pattern3-pipeline-ConfigureOSComponent.1.0.0.Component to update the OS with latest package versions.
Ảnh minh hoạ có thể hiển thị Amazon Linux 2. Bạn hãy chọn Amazon Linux 2023, vì Amazon Linux 2 đã kết thúc hỗ trợ.
Definition document, chọn Define document content.name: ConfigureOS
description: Update the operating system to the latest available packages
schemaVersion: 1.0
phases:
- name: build
steps:
- name: UpdateOS
action: UpdateOS

Create component để tiến hành khởi tạo.
Ở phần thực hành này, chúng ta chỉ đơn giản đặc tả với hành động UpdateOS nhằm cập nhật toàn bộ package của hệ điều hành. Trên Amazon Linux 2023, UpdateOS sẽ chạy dnf thay vì yum như trên Amazon Linux 2, nhưng đặc tả component thì không cần thay đổi. Bạn có thể tham khảo thêm các action module khác tại Action modules reference.
Trước khi định nghĩa Builder Pipeline, chúng ta cần phải có một Builder Recipe.
Create image recipe.pattern3-pipeline-ImageRecipe.1.0.0.Pattern3 Configure OS Recipe.Select managed images, sau đó:Amazon Linux.Quick start (Amazon-managed).Use latest available OS version để mỗi lần build đều lấy bản AL2023 mới nhất.

Đừng chọn Enter custom AMI ID rồi điền một AMI ID cố định. Một AMI ID cố định sẽ cũ dần và có thể bị AWS đánh dấu deprecated, khiến pipeline khởi đầu từ một image đã lạc hậu. Chọn managed image kèm Use latest available OS version giúp mỗi lần build đều bắt đầu từ bản Amazon Linux 2023 mới nhất, đúng tinh thần của một bài thực hành về vá lỗi.
Volume type sang gp3 để rẻ và nhanh hơn gp2.Owned by me.
Create recipe để tiến hành khởi tạo.
Infrastructure Configuration mô tả nơi AMI được build: loại instance, VPC, subnet, security group và nơi ghi log. Đây là tài nguyên độc lập, phải tạo trước khi tạo pipeline.
Create infrastructure configuration.pattern3-pipeline-InfraConfig.Build infrastructure for pattern3 image pipeline.pattern3-recipe-instance-role đã tạo trước đó.
t3.medium.pattern3-base, chọn một Private Subnet, và chọn security group pattern3-pipeline-instance-security-group.
Nếu bạn để trống mục VPC và subnet thì Image Builder sẽ dùng default VPC và default subnet của tài khoản. Bài thực hành sẽ vẫn build ra AMI, nhưng build instance không còn nằm trong hạ tầng bạn đã tạo ở phần 2, và kiến trúc không còn khớp với sơ đồ. Hãy chọn tường minh.
Terminate instance on failure được bật.
Create infrastructure configuration.Build instance bắt buộc phải nằm trong Private Subnet có đường ra Internet qua NAT Gateway. Instance này cần kết nối tới Systems Manager và tới repository của Amazon Linux 2023 để tải các bản vá. Nếu đặt vào một subnet không có đường ra, pipeline sẽ treo ở bước Building rồi thất bại vì SSM Agent không đăng ký được.
Lấy VPC ID và Subnet ID từ Output của Stack pattern3-base:
aws cloudformation describe-stacks --stack-name pattern3-base --region ap-southeast-2 --query "Stacks[0].Outputs" --output table
Tại thanh điều hướng bên tay trái, chọn Image pipelines, sau đó nhấn Create pipeline.
Mục General:
pattern3-pipeline-ImagePipeline.Pattern 3 pipeline to update OS.
Manual.Mặc định của trang là On schedule, chạy tự động mỗi tuần. Bạn phải đổi sang Manual, vì hai lý do: ở phần 5 chúng ta sẽ kích hoạt pipeline bằng Systems Manager, và một pipeline chạy định kỳ sẽ âm thầm tạo AMI kèm EBS Snapshot mới mỗi tuần, phát sinh chi phí ngay cả khi bạn đã học xong.
Mục Recipe:
pattern3-pipeline-ImageRecipe từ danh sách.Use latest version available để pipeline tự dùng bản recipe mới nhất. Nếu muốn cố định thì chọn Specify recipe version rồi chọn 1.0.0.Mục Workflow: giữ Use default workflows.

Select a configuration, rồi chọn pattern3-pipeline-InfraConfig đã tạo ở bước trước.Mục Distribution settings: giữ Create with default settings. AMI sẽ được tạo tại Region hiện tại là ap-southeast-2, đúng như dòng Distribution details hiển thị.

Mục Advanced settings, mở rộng ra nếu muốn tinh chỉnh. Với bài thực hành bạn có thể giữ nguyên toàn bộ:
ResourceType = awsstudygroup-000099-imagebuilder.5 consecutive failures. Chính sách này chỉ áp dụng cho lần chạy theo lịch, không áp dụng cho Run pipeline thủ công.Disabled, giữ nguyên cũng được. Chọn Enabled nếu bạn muốn Image Builder thu thập metadata qua SSM Inventory để kiểm tra tính tương thích của component.Disabled. Muốn bật quét lỗ hổng thì phải kích hoạt security scanning settings ở cấp tài khoản trước, việc này dùng Amazon Inspector và nằm ngoài phạm vi bài thực hành.Nhấn Create pipeline ở cuối trang.
Với t3.medium, quá trình build mất khoảng 20 đến 30 phút. Bạn có thể chọn loại nhỏ hơn để tiết kiệm chi phí nhưng thời gian build sẽ lâu hơn. Phần lớn thời gian là các bước cố định của Image Builder như khởi tạo instance, chạy component, tạo snapshot và đăng ký AMI.

Sau khi quá trình đặc tả đã hoàn tất, chúng ta tiến hành thử nghiệm Builder Pipeline.

Tại danh sách Image pipelines, chọn pipeline vừa tạo, nhấn nút Actions và chọn Run pipeline.

Một khi thực thi hoàn tất, chúng ta sẽ kiểm tra liệu AMI mới có được khởi tạo hay không.

Nếu dùng AWS CLI, bạn có thể chạy pipeline và theo dõi trạng thái như sau:
# Lay ARN pipeline truc tiep tu Image Builder, dung duoc cho ca hai cach tao
PIPELINE_ARN=$(aws imagebuilder list-image-pipelines --region ap-southeast-2 --query "imagePipelineList[?name=='pattern3-pipeline-ImagePipeline'].arn | [0]" --output text)
BUILD_ARN=$(aws imagebuilder start-image-pipeline-execution --image-pipeline-arn "$PIPELINE_ARN" --region ap-southeast-2 --query "imageBuildVersionArn" --output text)
aws imagebuilder get-image --image-build-version-arn "$BUILD_ARN" --region ap-southeast-2 --query "image.state" --output json
Trạng thái sẽ lần lượt đi qua PENDING, BUILDING, TESTING, DISTRIBUTING rồi AVAILABLE. Khi đạt AVAILABLE, bạn lấy AMI ID mới bằng:
aws imagebuilder get-image --image-build-version-arn "$BUILD_ARN" --region ap-southeast-2 --query "image.outputResources.amis[0].image" --output text
# Lay ARN pipeline truc tiep tu Image Builder, dung duoc cho ca hai cach tao
$PIPELINE_ARN = aws imagebuilder list-image-pipelines --region ap-southeast-2 --query "imagePipelineList[?name=='pattern3-pipeline-ImagePipeline'].arn | [0]" --output text
$BUILD_ARN = aws imagebuilder start-image-pipeline-execution --image-pipeline-arn "$PIPELINE_ARN" --region ap-southeast-2 --query "imageBuildVersionArn" --output text
aws imagebuilder get-image --image-build-version-arn "$BUILD_ARN" --region ap-southeast-2 --query "image.state" --output json
Trạng thái sẽ lần lượt đi qua PENDING, BUILDING, TESTING, DISTRIBUTING rồi AVAILABLE. Khi đạt AVAILABLE, bạn lấy AMI ID mới bằng:
aws imagebuilder get-image --image-build-version-arn "$BUILD_ARN" --region ap-southeast-2 --query "image.outputResources.amis[0].image" --output text
EC2 Image Builder sử dụng Automation Document của dịch vụ Systems Manager để hoàn thành quá trình khởi tạo. Chúng ta có thể truy cập vào Systems Manager để theo dõi quá trình này cũng như kiểm tra trạng thái của document ImageBuilderBuildImageDocument.
Tham khảo thêm về quá trình kiểm tra Automation Document tại Running automations.
Mỗi lần pipeline chạy thành công sẽ sinh ra một AMI kèm một EBS Snapshot. Các tài nguyên này không bị CloudFormation xoá khi bạn xoá Stack, và snapshot sẽ tiếp tục phát sinh chi phí. Phần Dọn dẹp tài nguyên có hướng dẫn xoá chúng.
Bây giờ, chúng ta sẽ sang phần kế tiếp với việc triển khai quá trình Build Automation với dịch vụ Systems Manager.