Ngân hàng đề — AWS Certified SysOps Administrator Associate
Tìm thấy 936 câu.
A SysOps Administrator launched an Amazon EC2 instance and noticed it went from the pending state to the terminated state immediately after starting it. What is a possible cause of this issue?
-
A
AWS does not currently have enough available On-Demand capacity to service the request.
-
B
The API action for launching the specific instance type has been restricted in the AWS account.
-
C
The root EBS volume is encrypted and the Administrator does not have permissions to access the KMS key for decryption.
-
D
The limit on the number of instances that can be launched in the Region has been exceeded.
Xem giải thích
Đáp án
C — Ổ gốc EBS được mã hoá và người quản trị KHÔNG có quyền truy cập khoá KMS để giải mã.
Vì sao đúng
Triệu chứng rất đặc trưng: pending → terminated NGAY LẬP TỨC, không qua trạng thái running nào.
⚠ Điểm mấu chốt — chuỗi khởi chạy dừng ngay ở bước tạo volume:
Khởi chạy instance với AMI có ổ gốc mã hoá
↓
EC2 cần tạo EBS volume từ snapshot đã mã hoá
↓
Phải gọi KMS để lấy khoá dữ liệu
↓
Thiếu quyền trên CMK
↓
→ tạo volume THẤT BẠI
→ instance chuyển thẳng sang "terminated"
↓
→ chưa từng khởi động, chưa có log nào để đọc
⚠ Bốn quyền cần có trên CMK — thiếu một là hỏng:
kms:Decrypt
kms:GenerateDataKeyWithoutPlaintext
kms:CreateGrant ← hay bị quên nhất
kms:DescribeKey
⚠ Và nơi DUY NHẤT thấy nguyên nhân:
aws ec2 describe-instances --instance-ids i-xxxx \
--query 'Reservations[].Instances[].StateReason'
↓
→ thường thấy: "Client.InternalError: Client error on launch"
↓
Với Auto Scaling group:
→ xem ACTIVITY HISTORY của ASG
↓
→ không có log ứng dụng, không có console output
Xem thêm câu #11769, #11558 và #11566: cùng nguyên nhân KMS ở các bối cảnh khác — Auto Scaling group với AMI mã hoá, và trường hợp CMK nằm ở tài khoản khác.
Vì sao các phương án khác sai
-
D (đã vượt hạn mức số instance trong Region) — đây là phương án gần nhất vì cũng khiến việc khởi chạy thất bại. Nhưng khi đó lời gọi
RunInstancesbị TỪ CHỐI NGAY với lỗiInstanceLimitExceeded— không có instance nào được tạo ra, nên cũng không có trạng tháipendingrồiterminated. -
A (AWS không đủ dung lượng On-Demand) — cho lỗi
InsufficientInstanceCapacity, và cũng từ chối ngay chứ không tạo instance rồi chấm dứt. -
B (API khởi chạy loại instance đó bị hạn chế trong tài khoản) — nếu bị SCP hoặc IAM chặn thì lời gọi trả về
UnauthorizedOperationhoặcAccessDenied— lại là từ chối ngay từ đầu.
Ghi nhớ
⚠ Phân biệt hai kiểu thất bại khi khởi chạy — bảng phải thuộc: | Kiểu | Biểu hiện | |---|---| | Lời gọi API bị TỪ CHỐI | không có instance nào được tạo — InstanceLimitExceeded, InsufficientInstanceCapacity, UnauthorizedOperation | | Instance được tạo rồi CHẤM DỨT | pending → terminated — thường là KMS, hoặc AMI hỏng, hoặc user data lỗi nặng |
Từ khoá nhận diện:
"pending rồi terminated ngay" → thiếu quyền KMS (hoặc AMI/snapshot có vấn đề) "
Client.InternalErrorkhi khởi chạy" → key policy của CMK "InsufficientInstanceCapacity" → đổi AZ, đổi loại instance "InstanceLimitExceeded" → Service Quotas "ASG không khởi chạy được máy" → Activity history của ASG
| Các lý do khiến instance bị chấm dứt ngay | Nội dung |
|---|---|
| Thiếu quyền trên KMS key | phổ biến nhất |
| Snapshot của AMI bị hỏng | |
| Vượt hạn mức EBS (số volume, dung lượng) | |
| AMI không tương thích với loại instance (PV so với HVM, x86 so với arm64) | |
| Instance store-backed AMI thiếu tệp |
| Chẩn đoán theo thứ tự | Bước |
|---|---|
| 1 | describe-instances → đọc StateReason |
| 2 | Với ASG → Activity history, đọc StatusMessage |
| 3 | CloudTrail → tìm lời gọi RunInstances và các lời gọi KMS thất bại |
| 4 | get-key-policy → kiểm tra principal có trong key policy không |
| 5 | Thử khởi chạy bằng AMI không mã hoá để khoanh vùng |
| Hai loại khoá KMS — nhắc lại | Nội dung |
|---|---|
AWS managed key (aws/ebs) |
key policy KHÔNG sửa được; AWS cấu hình sẵn cho dịch vụ trong cùng tài khoản |
| Customer managed key (CMK) | phải TỰ cấp quyền cho mọi principal cần dùng |
| Phòng ngừa | Nội dung |
|---|---|
| Cấu hình key policy đầy đủ ngay khi tạo CMK | thêm sẵn role của EC2, ASG, và người dùng |
| Bật "EBS encryption by default" ở cấp Region | dùng CMK bạn chỉ định |
| Kiểm thử khởi chạy sau mỗi lần đổi AMI hoặc đổi khoá | |
| Cảnh báo | EventBridge bắt sự kiện ASG khởi chạy thất bại |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Lý do chấm dứt | describe-instances, đọc StateReason.Message | | Key policy có đủ không | get-key-policy, tìm principal của người khởi chạy | | AMI mã hoá bằng khoá nào | describe-images, xem block device mapping |
Và một mẹo chẩn đoán rất nhanh cho loại lỗi này: thử khởi chạy cùng cấu hình đó với một AMI KHÔNG mã hoá. Nếu máy lên bình thường thì nguyên nhân gần như chắc chắn nằm ở quyền KMS — và bạn tiết kiệm được cả buổi đọc thông báo Client.InternalError, một dòng lỗi nổi tiếng vì nó không nói gì về nguyên nhân thật.
A SysOps Administrator needs to restrict access to a bucket that is currently accessed by users in other AWS accounts. The Administrator requires that the bucket is only accessible to users in the same account.
How can this be achieved?
-
A
Change the bucket access control list (ACL) to restrict access to the bucket owner.
-
B
Create Amazon S3 presigned URLs for accessing objects in the bucket.
-
C
Move the S3 bucket to the S3 One Zone-IA storage class and disable versioning.
-
D
Create an object policy that restricts access to only users in the same account.
Xem giải thích
Đáp án
A — Đổi bucket ACL để giới hạn quyền truy cập chỉ cho chủ sở hữu bucket.
Vì sao đúng
Trong bốn phương án, A là phương án duy nhất thực sự thu hồi quyền truy cập của tài khoản khác.
⚠ Điểm mấu chốt — bucket ACL cấp quyền cho tài khoản AWS khác:
Bucket ACL có thể cấp quyền cho:
- chủ sở hữu bucket
- TÀI KHOẢN AWS KHÁC (theo canonical ID hoặc email)
- nhóm "Authenticated Users" / "All Users"
↓
Đặt ACL về "private" (chỉ chủ sở hữu)
↓
→ thu hồi mọi quyền đã cấp cho tài khoản khác
aws s3api put-bucket-acl --bucket ten-bucket --acl private
Ghi nhớ về chất lượng câu hỏi
ACL là cơ chế CŨ, và AWS nay khuyến nghị TẮT nó đi.
Từ tháng 4/2023, bucket tạo mới mặc định:
Object Ownership = BucketOwnerEnforced
↓
→ ACL bị VÔ HIỆU HOÁ hoàn toàn
→ mọi phân quyền chuyển sang BUCKET POLICY
↓
→ với bucket hiện đại, "đổi bucket ACL" là thao tác
KHÔNG CÒN Ý NGHĨA
Cách làm được khuyến nghị hiện nay:
// Bucket policy chỉ cho phép tài khoản của chính mình
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": ["arn:aws:s3:::ten-bucket", "arn:aws:s3:::ten-bucket/*"],
"Condition": {
"StringNotEquals": { "aws:PrincipalAccount": "111122223333" }
}
}
Khoá đáp án giữ nguyên vì trong bốn phương án đã cho, A là phương án duy nhất đúng về mặt cơ chế — ba phương án kia đều sai hẳn. Nhưng khi làm việc thật, hãy dùng bucket policy và bật BucketOwnerEnforced, đồng thời rà lại Block Public Access.
Vì sao các phương án khác sai
-
D (tạo "object policy" giới hạn quyền cho người dùng cùng tài khoản) — đây là phương án gần nhất và cái tên nghe rất hợp lý, nhưng S3 KHÔNG có khái niệm "object policy". Chỉ có bucket policy (cấp bucket) và object ACL (cấp đối tượng).
-
B (tạo presigned URL để truy cập đối tượng) — presigned URL CẤP THÊM quyền truy cập tạm thời cho người không có chứng chỉ. Nó làm điều ngược lại với yêu cầu của đề.
-
C (chuyển bucket sang lớp S3 One Zone-IA và tắt versioning) — hai thao tác về lớp lưu trữ và bảo vệ dữ liệu, hoàn toàn không liên quan tới kiểm soát truy cập.
Ghi nhớ
⚠ Ba cơ chế phân quyền của S3 — bảng phải thuộc: | Cơ chế | Phạm vi | Trạng thái | |---|---|---| | Bucket policy | cả bucket, JSON, mạnh nhất | khuyến nghị dùng | | IAM policy | gắn vào user/role | khuyến nghị dùng | | Bucket ACL / Object ACL | cấp thô, theo tài khoản | CŨ — AWS khuyến nghị tắt | | S3 Access Points | mỗi ứng dụng một chính sách riêng | cho bucket dùng chung |
Từ khoá nhận diện:
"thu hồi quyền của tài khoản khác" → bucket policy (hiện đại) hoặc ACL (cũ) "object policy" → KHÔNG TỒN TẠI "cấp quyền tạm thời cho người ngoài" → presigned URL "nhiều ứng dụng dùng chung bucket" → S3 Access Points "chặn hẳn mọi truy cập công khai" → Block Public Access
⚠ Ba chế độ Object Ownership — nhắc lại: | Chế độ | Nội dung | |---|---| | BucketOwnerEnforced | ACL VÔ HIỆU, chủ bucket luôn sở hữu — mặc định mới, AWS khuyến nghị | | BucketOwnerPreferred | chủ bucket sở hữu nếu người ghi dùng bucket-owner-full-control | | ObjectWriter | người ghi sở hữu — cách cũ |
| Thứ tự các lớp quyết định một request tới S3 | Bước |
|---|---|
| 1 | Block Public Access (tài khoản) — ghi đè tất cả |
| 2 | Block Public Access (bucket) |
| 3 | SCP của Organizations |
| 4 | Bucket policy (Deny thắng Allow) |
| 5 | Chính sách IAM của người gọi |
| 6 | ACL — chỉ khi Object Ownership cho phép |
| 7 | KMS key policy nếu đối tượng mã hoá |
| Các điều kiện hữu ích trong bucket policy | Nội dung |
|---|---|
aws:PrincipalAccount |
giới hạn theo tài khoản — dùng cho câu này |
aws:PrincipalOrgID |
giới hạn theo tổ chức |
aws:SourceVpce |
chỉ cho phép qua VPC endpoint |
aws:SourceIp |
giới hạn theo dải IP |
aws:SecureTransport |
ép HTTPS |
| Tìm xem ai đang truy cập được | Công cụ |
|---|---|
| IAM Access Analyzer for S3 | liệt kê bucket đang chia sẻ ra ngoài tài khoản |
| S3 Server Access Logging | ghi lại mọi request, kể cả bị từ chối |
| CloudTrail data event | chi tiết hơn, gần thời gian thực |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | ACL hiện tại là gì | get-bucket-acl --bucket <ten> | | Bucket có chia sẻ ra ngoài không | IAM Access Analyzer for S3 | | Object Ownership đang ở chế độ nào | get-bucket-ownership-controls |
Và một việc nên làm ngay sau khi xử lý xong yêu cầu này: chạy IAM Access Analyzer for S3 để xem còn bucket nào khác đang chia sẻ ra ngoài tài khoản. Quyền truy cập liên tài khoản thường được cấp trong một dự án cụ thể rồi không ai thu hồi khi dự án kết thúc — và công cụ này liệt kê chúng ra chỉ trong vài giây, miễn phí.
An organization has shifted its traditional on-site web application to an Amazon EC2 instance. This web application necessitates a single static public IP address for handling traffic and processing demands. The web application must be accessible to end-users via the example.com domain. A SysOps administrator is tasked with developing a solution that minimizes the management effort.
Which combination of actions will meet these requirements? (Select TWO.)
-
A
Create an Auto Scaling group with a minimum capacity of one and a maximum capacity of two.
-
B
Establish an Amazon Route 53 A record linked to the EC2 IP address.
-
C
Set up an Application Load Balancer (ALB) and incorporate the EC2 instance into a target group linked to the ALB.
-
D
Generate an Elastic IP address and link it with the EC2 instance.
-
E
Create an Amazon Route 53 CNAME record connected to the EC2 IP address.
Xem giải thích
Đáp án
B, D — hai việc cần làm:
- D — Tạo một Elastic IP và gắn nó vào EC2 instance.
- B — Tạo một bản ghi A trong Route 53 trỏ tới địa chỉ IP của EC2.
Vì sao đúng
Đề nêu ba ràng buộc, và cặp Elastic IP + A record thoả cả ba:
| Đề yêu cầu | Cách giải |
|---|---|
| MỘT địa chỉ IP công cộng TĨNH | Elastic IP |
Người dùng truy cập qua example.com |
bản ghi A trỏ tới IP đó |
| Công sức quản lý TỐI THIỂU | hai thao tác, không thêm hạ tầng nào |
⚠ Điều D — vì sao phải là Elastic IP:
IP công cộng TỰ ĐỘNG của EC2
↓
MẤT khi stop/start, đổi sang địa chỉ khác
↓
→ không phải "địa chỉ tĩnh"
↓
Elastic IP
↓
Là TÀI NGUYÊN ĐỘC LẬP của tài khoản
↓
→ giữ nguyên qua stop/start
→ chuyển sang máy khác được khi cần
→ đúng nghĩa "single static public IP"
⚠ Điều B — bản ghi A trỏ tới một địa chỉ IPv4:
Elastic IP là một địa chỉ IPv4 CỐ ĐỊNH
↓
Bản ghi A: tên miền → địa chỉ IPv4
↓
example.com A 52.1.2.3
↓
→ đúng loại bản ghi cho tình huống này
→ và example.com là ZONE APEX, nơi CNAME không dùng được
⚠ Vì sao KHÔNG dùng ALB ở đây — đây là chỗ dễ chọn nhầm:
ALB KHÔNG có IP tĩnh
↓
→ nó có nhiều IP thay đổi liên tục
→ chỉ dùng được qua tên DNS
↓
Đề nói rõ cần MỘT IP CÔNG CỘNG TĨNH
↓
→ ALB trái thẳng yêu cầu
→ (muốn IP tĩnh cho load balancer thì phải dùng NLB)
Vì sao các phương án khác sai
-
C (dựng ALB và đưa EC2 vào target group của nó) — đây là phương án gần nhất và là kiến trúc tốt hơn về mặt sẵn sàng cao. Nhưng ALB không cung cấp IP tĩnh, nên nó trái ràng buộc rõ ràng nhất của đề; và nó thêm một tài nguyên phải quản lý và trả tiền.
-
E (tạo bản ghi CNAME trỏ tới IP của EC2) — sai hai lần: CNAME trỏ tới TÊN MIỀN, không trỏ tới địa chỉ IP, và CNAME không dùng được ở zone apex như
example.com. -
A (tạo Auto Scaling group với min 1, max 2) — mâu thuẫn với ràng buộc "một IP tĩnh duy nhất": ASG có thể chạy hai instance, mỗi máy một địa chỉ khác nhau. Nó cũng thêm công sức quản lý.
Ghi nhớ
⚠ Các loại địa chỉ IP của EC2 — bảng phải thuộc: | Loại | Giữ khi stop/start | Chuyển sang máy khác | Tính tiền | |---|---|---|---| | Private IPv4 | có | không (cố định trong ENI) | không | | Public IPv4 (auto) | KHÔNG | KHÔNG | có (từ 2024) | | Elastic IP | CÓ | CÓ | có, kể cả khi không dùng | | IPv6 | có | có | không |
Từ khoá nhận diện:
"một IP công cộng tĩnh cho EC2" → Elastic IP "IP tĩnh cho LOAD BALANCER" → NLB (ALB không có) "IP tĩnh anycast toàn cầu" → Global Accelerator "trỏ tên miền tới một địa chỉ IP" → bản ghi A (IPv4) hoặc AAAA (IPv6) "trỏ tên miền tới ALB/CloudFront" → Alias record
⚠ Ba cách có IP tĩnh trên AWS — chọn cho đúng: | Cách | Dùng cho | |---|---| | Elastic IP | một EC2 instance hoặc NAT Gateway | | Network Load Balancer | IP tĩnh MỖI AZ, gán được Elastic IP | | AWS Global Accelerator | hai IP anycast toàn cầu, định tuyến tới nhiều Region |
| Elastic IP — chi tiết đáng nhớ | Nội dung |
|---|---|
| Phạm vi | theo Region |
| Tính tiền cả khi KHÔNG gắn | và khi gắn vào máy đã dừng |
| Hạn mức mặc định | 5 mỗi Region (xin tăng được) |
| Gắn Elastic IP | IP tự động bị THU HỒI |
| Chuyển sang máy khác | associate-address — mất vài giây |
| Từ 2/2024 | mọi IPv4 công cộng đều tính phí, kể cả IP tự động |
| Điểm yếu của kiến trúc này — cần nói rõ | Nội dung |
|---|---|
| Một instance = một điểm chết đơn | máy hỏng là dịch vụ ngừng |
| Không có sẵn sàng cao | không có AZ thứ hai |
| Cách cải thiện mà vẫn giữ IP tĩnh | NLB với Elastic IP, phía sau là ASG nhiều AZ |
| Hoặc | script tự chuyển Elastic IP sang máy dự phòng khi phát hiện lỗi |
| Vì sao đề chọn kiến trúc đơn giản này | Nội dung |
|---|---|
| Ứng dụng vừa chuyển từ tại chỗ sang | thường chưa sửa để chạy nhiều máy |
| Yêu cầu một IP tĩnh | có thể do đối tác đã ghi IP vào firewall |
| Công sức quản lý tối thiểu | ràng buộc rõ ràng của đề |
| Bước tiếp theo hợp lý | chuyển sang NLB + ASG khi ứng dụng sẵn sàng |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Elastic IP đã gắn chưa | describe-addresses, xem có InstanceId không | | Bản ghi đã lan chưa | dig example.com — phải ra đúng Elastic IP | | Có Elastic IP nào đang rảnh không | describe-addresses — mục thiếu InstanceId là đang tốn tiền vô ích |
Và một lời khuyên nên nói với đội ứng dụng ngay khi triển khai xong: kiến trúc này có một điểm chết đơn, và Elastic IP không thay đổi điều đó. Elastic IP giúp bạn chuyển địa chỉ sang máy khác khi cần — nhưng việc chuyển đó là thủ công. Nếu ứng dụng trở nên quan trọng, bước nâng cấp tự nhiên là NLB với Elastic IP đặt trước một Auto Scaling group nhiều AZ: bạn giữ nguyên địa chỉ tĩnh mà có thêm khả năng chịu lỗi.
A SysOps Administrator needs to control access to a small group of Amazon EC2 instances. Specific tags have been added to the EC2 instances.
Which additional actions should the Administrator take to control access? (Select TWO.)
-
A
Attach an IAM policy to the users or groups that require access.
-
B
Create an IAM policy that grants access to the instances based on the Principal element.
-
C
Attach an IAM role to the Amazon EC2 instances.
-
D
Create an IAM policy that grants access to the instances with the specific tag using the Condition element.
-
E
Create an Auto Scaling group for the EC2 instances and add a specific tag.
Xem giải thích
Đáp án
A, D — hai việc cần làm:
- D — Tạo một IAM policy cấp quyền trên instance có tag cụ thể, dùng phần tử
Condition. - A — Gắn chính sách đó vào user hoặc group cần quyền.
Vì sao đúng
Đây là mô hình ABAC (Attribute-Based Access Control) — phân quyền theo thuộc tính thay vì liệt kê từng tài nguyên.
⚠ Điểm mấu chốt — dùng Condition với khoá ec2:ResourceTag:
{
"Effect": "Allow",
"Action": ["ec2:StartInstances", "ec2:StopInstances", "ec2:RebootInstances"],
"Resource": "arn:aws:ec2:*:*:instance/*",
"Condition": {
"StringEquals": { "ec2:ResourceTag/Doi": "PhatTrien" }
}
}
→ chính sách áp cho MỌI instance
→ nhưng CHỈ có hiệu lực với instance mang tag Doi=PhatTrien
↓
→ thêm máy mới gắn đúng tag là TỰ ĐỘNG được quản
→ KHÔNG phải sửa chính sách
⚠ Vì sao phải có cả hai bước:
Bước D — VIẾT chính sách
↓
Chính sách tồn tại nhưng chưa có hiệu lực với ai
Bước A — GẮN chính sách vào user hoặc group
↓
→ giờ mới có người thật sự được cấp quyền
↓
Thiếu bước nào cũng không hoàn thành yêu cầu
⚠ Và đây là điểm phân biệt quan trọng nhất — Condition chứ không phải Principal:
Principal → "AI được phép"
↓
→ chỉ có trong RESOURCE-BASED policy
(bucket policy, key policy, trust policy)
→ chính sách IAM gắn vào user KHÔNG CÓ Principal
Condition → "TRONG ĐIỀU KIỆN NÀO"
↓
→ đây mới là nơi khai điều kiện về tag
Vì sao các phương án khác sai
-
B (tạo IAM policy cấp quyền dựa trên phần tử
Principal) — đây là phương án gần nhất và là hiểu nhầm cơ bản nhất: chính sách gắn vào user hoặc group là identity-based policy, và loại này KHÔNG CÓ trườngPrincipal(principal chính là danh tính được gắn chính sách).Principalchỉ xuất hiện trong resource-based policy. -
C (gắn IAM role vào các EC2 instance) — làm việc ngược lại: role gắn vào instance cho ứng dụng TRÊN máy gọi được dịch vụ AWS. Đề hỏi cách kiểm soát ai được quản lý những máy đó.
-
E (tạo Auto Scaling group cho các instance và gắn tag) — ASG là cơ chế co giãn, không phải cơ chế phân quyền. Gắn tag qua ASG thì tiện, nhưng bản thân nó không cấp hay chặn quyền nào.
Ghi nhớ
⚠ ABAC — phân quyền theo tag, bảng phải thuộc: | Khoá điều kiện | Nghĩa | |---|---| | ec2:ResourceTag/<key> | tag trên TÀI NGUYÊN được thao tác | | aws:RequestTag/<key> | tag trong REQUEST đang tạo tài nguyên | | aws:PrincipalTag/<key> | tag trên chính NGƯỜI GỌI | | aws:TagKeys | danh sách khoá tag trong request |
Từ khoá nhận diện:
"cấp quyền theo tag" →
Conditionvớiec2:ResourceTag"Principaltrong chính sách gắn vào user" → KHÔNG CÓ "ứng dụng trên EC2 gọi S3" → IAM role gắn vào instance "ép phải gắn tag khi tạo tài nguyên" →aws:RequestTag+aws:TagKeys"phân quyền không cần sửa chính sách khi thêm tài nguyên" → ABAC
⚠ ABAC và RBAC — khác biệt và khi nào dùng: | | RBAC (theo vai trò) | ABAC (theo thuộc tính) | |---|---|---| | Cách làm | liệt kê từng tài nguyên trong Resource | dùng Condition với tag | | Thêm tài nguyên mới | phải sửa chính sách | tự động áp dụng | | Số chính sách | tăng theo số nhóm tài nguyên | ít, dùng lại được | | Điều kiện | — | phải có kỷ luật gắn tag |
⚠ Mẫu ABAC mạnh nhất — so tag của NGƯỜI với tag của TÀI NGUYÊN:
{
"Effect": "Allow",
"Action": "ec2:*",
"Resource": "*",
"Condition": {
"StringEquals": {
"ec2:ResourceTag/Doi": "${aws:PrincipalTag/Doi}"
}
}
}
→ MỘT chính sách duy nhất cho MỌI đội
→ mỗi người chỉ quản được máy của đội mình
→ thêm đội mới: chỉ cần gắn tag, không sửa chính sách
| Ép gắn tag để ABAC đáng tin cậy | Cách |
|---|---|
aws:RequestTag trong IAM policy |
bắt buộc phải có tag khi tạo |
aws:TagKeys |
ép đúng bộ khoá tag |
| SCP | chặn tạo tài nguyên nếu thiếu tag |
| Tag Policy của Organizations | ép định dạng và giá trị hợp lệ |
AWS Config required-tags |
phát hiện tài nguyên thiếu tag |
| Cảnh báo về ABAC với EC2 | Nội dung |
|---|---|
Không phải action nào cũng hỗ trợ ResourceTag |
ví dụ ec2:DescribeInstances KHÔNG hỗ trợ — nó là action cấp Region |
| Hệ quả | người dùng thấy được mọi instance, chỉ không thao tác được |
| Chữa | dùng Resource Groups hoặc lọc ở tầng ứng dụng |
| Luôn kiểm tra | bảng "Actions, resources, and condition keys" của từng dịch vụ |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Chính sách có hiệu lực đúng không | IAM Policy Simulator với ARN của instance cụ thể | | Action đó có hỗ trợ điều kiện tag không | tra tài liệu Service Authorization Reference | | Instance đã gắn tag chưa | describe-instances --filters "Name=tag:Doi,Values=PhatTrien" |
Và một cạm bẫy rất hay gặp khi triển khai ABAC cho EC2: ec2:DescribeInstances không hỗ trợ điều kiện theo tag. Nghĩa là dù bạn viết chính sách chặt tới đâu, người dùng vẫn nhìn thấy toàn bộ instance trong tài khoản — họ chỉ không start, stop hay terminate được những máy không thuộc tag của mình. Nếu yêu cầu là "không được nhìn thấy", thì ABAC ở tầng IAM không giải quyết được, và bạn cần tách sang tài khoản riêng.
A SysOps Administrator manages an application that is used by several front-end servers in different regions. An AWS Web Application Firewall (WAF) is used to protect the application. Each request contains a header that includes the ID of the front-end server making the request. The SysOps Administrator wants to identify and count the requests from each front-end server.
Which condition should be added to the web ACL of the AWS WAF to accomplish this?
-
A
Size constraint
-
B
String match
-
C
IP match
-
D
ID match
Xem giải thích
Đáp án
B — String match condition (điều kiện khớp chuỗi).
Vì sao đúng
Đề cần đọc giá trị của một HEADER và đếm theo giá trị đó — đó chính là việc của string match.
⚠ Điểm mấu chốt — string match soi được vào bên trong request:
String match condition khớp được với:
- HEADER cụ thể (ví dụ X-Front-End-Id) ← đề bài cần
- URI, query string
- HTTP method
- body của request
- cookie
↓
Với mỗi giá trị header khác nhau → một rule riêng
↓
Đặt rule ở chế độ COUNT thay vì BLOCK
↓
→ WAF ĐẾM số request khớp, KHÔNG chặn
→ đúng yêu cầu "identify and count"
⚠ Và chế độ Count là chi tiết quan trọng nhất của câu này:
Action = BLOCK → chặn request
Action = ALLOW → cho qua
Action = COUNT → CHỈ ĐẾM, không can thiệp
↓
→ đề chỉ muốn NHẬN DIỆN và ĐẾM
→ dùng Count là đúng, không được Block
⚠ Xem kết quả ở đâu:
CloudWatch metrics của WAF
↓
Mỗi rule có chỉ số riêng, gắn nhãn theo tên rule
↓
→ vẽ đồ thị số request từ từng front-end server
WAF sampled requests
↓
→ xem mẫu request thật đã khớp rule nào
WAF logs → Kinesis Data Firehose → S3
↓
→ phân tích đầy đủ bằng Athena
Vì sao các phương án khác sai
-
D ("ID match" condition) — đây là phương án gần nhất vì đề nhắc tới "ID của front-end server", nên cái tên nghe rất khớp. Nhưng WAF KHÔNG có loại điều kiện nào tên "ID match". Đây là bẫy đặt tên.
-
A (size constraint) — khớp theo ĐỘ DÀI của một phần request (header dài bao nhiêu byte, body lớn cỡ nào). Nó không đọc giá trị.
-
C (IP match) — khớp theo địa chỉ IP nguồn. Có thể dùng nếu mỗi front-end server có IP cố định, nhưng đề nói rõ định danh nằm trong header, không phải ở IP.
Ghi nhớ
⚠ Các loại điều kiện của AWS WAF — bảng phải thuộc: | Loại | Khớp theo | |---|---| | String match / regex match | nội dung của header, URI, query, body, cookie | | Size constraint | độ dài của một phần request | | IP set match | địa chỉ IP nguồn | | Geo match | quốc gia của người gửi | | SQL injection match | mẫu tấn công SQL | | XSS match | mẫu tấn công cross-site scripting | | Rate-based rule | số request từ một IP trong 5 phút | | Labels | kết quả của rule khác (dùng cho rule ghép) |
Từ khoá nhận diện:
"khớp giá trị của một header" → string match "đếm mà không chặn" → action COUNT "giới hạn số request từ một IP" → rate-based rule "chặn theo quốc gia" → geo match "ID match condition" → KHÔNG TỒN TẠI
⚠ Ba action của một WAF rule — bảng phải thuộc: | Action | Nội dung | |---|---| | ALLOW | cho qua, dừng đánh giá các rule sau | | BLOCK | chặn, trả về 403 | | COUNT | chỉ đếm, KHÔNG can thiệp — tiếp tục đánh giá rule sau | | CAPTCHA / Challenge | thử thách người gửi thay vì chặn thẳng |
| Vì sao chế độ Count quan trọng trong thực tế | Nội dung |
|---|---|
| Kiểm thử rule trước khi bật Block | xem chính xác cái gì sẽ bị chặn |
| Đo lường và phân tích | như đúng yêu cầu của câu này |
| Tránh chặn nhầm | managed rule group rất dễ chặn lưu lượng hợp lệ |
| Thực hành tốt | luôn chạy Count vài ngày trước khi chuyển sang Block |
| Chuyển đổi text trước khi khớp (text transformation) | Nội dung |
|---|---|
LOWERCASE |
chuẩn hoá chữ hoa/thường |
URL_DECODE |
giải mã URL trước khi khớp |
HTML_ENTITY_DECODE |
giải mã HTML entity |
COMPRESS_WHITE_SPACE |
gộp khoảng trắng |
| Vì sao cần | chống né tránh — kẻ tấn công mã hoá payload để lách rule |
| WAF gắn được vào đâu — nhắc lại | Nội dung |
|---|---|
| CloudFront, ALB, API Gateway, AppSync, Cognito, App Runner | |
| KHÔNG gắn được | EC2, NLB, S3 trực tiếp, RDS |
| Quản lý nhiều tài khoản | AWS Firewall Manager |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Rule có khớp gì không | WAF sampled requests trong console | | Đếm được bao nhiêu | CloudWatch metrics của WAF, theo từng rule | | Header thật sự chứa gì | bật WAF logging ra S3 rồi truy vấn bằng Athena |
Và một lời khuyên khi dùng WAF để phân tích thay vì để chặn: hãy bật WAF logging ra S3 và phân tích bằng Athena, thay vì chỉ dựa vào chỉ số CloudWatch. Chỉ số cho bạn con số tổng theo từng rule, nhưng log cho bạn toàn bộ nội dung request — nghĩa là bạn trả lời được cả những câu hỏi chưa nghĩ ra lúc viết rule, mà không phải sửa cấu hình rồi chờ dữ liệu mới.
Program X is operating on Amazon EC2 instances, which are organized behind a Network Load Balancer (NLB). These instances are a part of an Auto Scaling group and reside within the same subnet as the NLB. However, software solutions hosted in an in-house data center are unable to interface with Program X via port 8081.
To investigate the issue, a SysOps administrator evaluates the network flow logs. The log shows the following entries:
2 123456789011 eni-5432a9dc987654321 10.0.1.23 172.32.17.148 60004 8081 1 4 350 1432918128 1432918243 ACCEPT OK 2 123456789011 eni-5432a9dc987654321 172.32.17.148 10.0.1.23 8081 60004 1 4 350 1432918195 1432918243 REJECT OK
What is the most likely cause of the blocked traffic?
-
A
The security group attached to the NLB doesn't have an allow rule for the traffic inbound from the data center.
-
B
The network ACL that is associated with the subnet does not allow outbound traffic for the ephemeral port range.
-
C
The firewall in the on-premises data center is not permitting traffic to the Amazon VPC.
-
D
The security group associated with the EC2 instances lacks an allow rule for the traffic incoming from the NLB.
Xem giải thích
Đáp án
B — Network ACL gắn với subnet KHÔNG cho phép lưu lượng ĐI RA trên dải cổng tạm (ephemeral port).
Vì sao đúng
Chính bản ghi flow log trong đề đã chỉ ra câu trả lời — chỉ cần đọc đúng.
⚠ Đọc hai dòng flow log:
Dòng 1: 10.0.1.23 → 172.32.17.148 cổng 60004 → 8081 ACCEPT
↓
Hmm, khoan — hãy đọc kỹ hướng
↓
Dòng 2: 172.32.17.148 → 10.0.1.23 cổng 8081 → 60004 REJECT
↓
→ gói ĐI RA từ cổng dịch vụ 8081
tới CỔNG TẠM 60004 của bên kia
↓
→ đó chính là GÓI PHẢN HỒI
→ và nó BỊ TỪ CHỐI
⚠ Điểm mấu chốt — chỉ NACL mới từ chối một gói phản hồi:
Security Group là STATEFUL
↓
Kết nối đã được chấp nhận ở chiều vào
↓
→ gói phản hồi TỰ ĐỘNG được phép đi ra
→ SG KHÔNG BAO GIỜ chặn phản hồi
↓
Network ACL là STATELESS
↓
Xét từng gói độc lập, không nhớ kết nối nào
↓
→ gói phản hồi phải khớp một luật OUTBOUND
→ không khớp → REJECT
↓
→ chỉ NACL giải thích được dòng log thứ hai
⚠ Cách sửa:
Thêm luật outbound vào NACL:
Allow TCP 1024–65535 tới 0.0.0.0/0
↓
→ phủ mọi dải cổng tạm của mọi hệ điều hành
(Linux 32768–60999, Windows 49152–65535,
NLB/Lambda 1024–65535)
Xem thêm câu #11730, #11721, #11727: cùng nguyên lý NACL stateless ở các bối cảnh khác. Câu này đặc biệt vì cho đọc flow log để tự suy ra nguyên nhân.
Vì sao các phương án khác sai
-
A (Security Group của NLB không có luật cho phép lưu lượng vào từ trung tâm dữ liệu) — đây là phương án gần nhất vì SG là nghi phạm quen thuộc. Nhưng dòng log thứ nhất đã ACCEPT, nghĩa là chiều vào hoàn toàn thông. (Ngoài ra, trong nhiều năm NLB không hề có Security Group — chỉ mới hỗ trợ từ tháng 8/2023.)
-
D (Security Group của EC2 thiếu luật cho lưu lượng đến từ NLB) — cùng lý do: nếu SG chặn thì dòng đầu tiên đã là REJECT, chứ không phải ACCEPT.
-
C (tường lửa ở trung tâm dữ liệu không cho lưu lượng tới VPC) — nếu vậy thì gói tin không bao giờ tới được VPC, và sẽ không có dòng log nào cả. Nhưng ở đây có tới hai dòng.
Ghi nhớ
⚠ Cách đọc một bản ghi VPC Flow Log — bảng phải thuộc: | Trường | Vị trí | Ý nghĩa | |---|---|---| | version | 1 | phiên bản định dạng | | account-id | 2 | tài khoản | | interface-id | 3 | ENI nào | | srcaddr | 4 | IP nguồn | | dstaddr | 5 | IP đích | | srcport | 6 | cổng nguồn | | dstport | 7 | cổng đích | | protocol | 8 | 6 = TCP, 17 = UDP | | packets, bytes | 9, 10 | khối lượng | | start, end | 11, 12 | mốc thời gian | | action | 13 | ACCEPT hoặc REJECT | | log-status | 14 | OK, NODATA, SKIPDATA |
Từ khoá nhận diện:
"gói vào ACCEPT, gói ra REJECT" → NACL thiếu luật outbound "cả hai chiều đều REJECT" → NACL inbound hoặc Security Group "không có dòng log nào" → gói chưa từng tới VPC — tường lửa bên ngoài, hoặc route table "SG chặn phản hồi" → KHÔNG BAO GIỜ, SG là stateful
⚠ Chẩn đoán bằng flow log — cách suy luận từng bước:
1. Có dòng log không?
KHÔNG → gói chưa tới VPC (route, tường lửa ngoài, DNS sai)
CÓ → đi tiếp
2. Dòng ĐI VÀO là ACCEPT hay REJECT?
REJECT → NACL inbound hoặc Security Group
ACCEPT → đi tiếp
3. Có dòng ĐI RA không, và nó là gì?
REJECT → NACL OUTBOUND thiếu cổng tạm ← câu này
KHÔNG CÓ → ứng dụng không trả lời (kiểm tra trong máy)
ACCEPT → mạng thông, vấn đề ở tầng cao hơn
| Dải cổng tạm — nhắc lại | Dải |
|---|---|
| Linux | 32768–60999 |
| Windows 2008+ | 49152–65535 |
| NLB, Lambda | 1024–65535 |
| Khuyến nghị cho NACL | mở 1024–65535 — phủ tất cả |
| Điều đặc biệt về NLB cần biết | Nội dung |
|---|---|
| Trước 8/2023 NLB KHÔNG có Security Group | lưu lượng đi thẳng tới target |
| Hệ quả | SG của target phải cho phép IP nguồn của CLIENT, không phải của NLB |
| Nay | NLB có hỗ trợ Security Group (phải bật lúc tạo) |
| Giữ IP nguồn | với target theo instance id, target thấy IP thật của client |
| Hai công cụ nên dùng trước khi đọc log bằng mắt | Nội dung |
|---|---|
| VPC Reachability Analyzer | mô phỏng đường đi, chỉ đích danh thành phần chặn |
| VPC Flow Logs + Athena | truy vấn hàng triệu dòng bằng SQL |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | NACL có mở chiều ra không | describe-network-acls — xem cả Egress: true | | Đường đi có thông không | VPC Reachability Analyzer | | Ứng dụng có lắng nghe không | ss -tlnp trên chính máy đó |
Và một kỹ năng rất đáng luyện vì nó rút ngắn mọi cuộc chẩn đoán mạng: đọc flow log theo CẶP hai dòng — một chiều vào, một chiều ra. Chỉ riêng việc xác định gói nào bị chặn ở chiều nào đã khoanh vùng được nguyên nhân xuống còn một hoặc hai khả năng, thay vì phải rà lần lượt security group, NACL, route table và cấu hình ứng dụng.
A SysOps Administrator has installed the CloudWatch agent on several Amazon EC2 instances. The agent has been configured to send custom metrics to Amazon CloudWatch. The Administrator needs to create a CloudWatch dashboard to display these metrics.
What steps should the Administrator take to complete this task?
-
A
Open the CloudWatch console, then from CloudWatch Events, add all custom metrics
-
B
Select the appropriate widget and metrics from the custom namespace, then add to the dashboard
-
C
Open the CloudWatch Logs console, create metric filters, and select the custom metrics
-
D
Select the AWS Namespace, filter by metric name, then add to the dashboard
Xem giải thích
Đáp án
B — Chọn widget phù hợp và chọn chỉ số từ CUSTOM NAMESPACE, rồi thêm vào dashboard.
Vì sao đúng
Chi tiết quyết định: chỉ số do CloudWatch agent đẩy lên nằm ở NAMESPACE TUỲ CHỈNH, không nằm chung với chỉ số dựng sẵn của AWS.
⚠ Điểm mấu chốt — hai loại namespace hoàn toàn tách biệt:
Namespace của AWS
↓
AWS/EC2, AWS/RDS, AWS/ApplicationELB, AWS/Lambda...
↓
→ chỉ số AWS tự cấp: CPU, mạng, đĩa (instance store)
Namespace TUỲ CHỈNH
↓
Mặc định của CloudWatch agent: CWAgent
Hoặc tên bạn tự đặt trong tệp cấu hình agent
↓
→ mem_used_percent, disk_used_percent, swap_used_percent
→ chỉ số của ứng dụng bạn tự đẩy lên
⚠ Quy trình tạo dashboard:
CloudWatch console → Dashboards → Create dashboard
↓
Add widget → chọn loại (Line, Number, Gauge, Stacked area)
↓
Trong danh sách namespace, chọn CWAgent
(KHÔNG phải AWS/EC2)
↓
Chọn chỉ số và dimension cần vẽ
↓
→ thêm vào dashboard
⚠ Và một chi tiết về dimension rất đáng nhớ:
Trong cấu hình agent, mục append_dimensions
↓
${aws:InstanceId} → xem theo từng máy
${aws:AutoScalingGroupName} → xem trung bình cả nhóm
↓
→ dimension quyết định bạn NHÓM chỉ số theo chiều nào
↓
Cảnh báo: mỗi tổ hợp dimension là MỘT CHỈ SỐ RIÊNG
được tính tiền
Vì sao các phương án khác sai
-
D (chọn AWS Namespace, lọc theo tên chỉ số, rồi thêm vào dashboard) — đây là phương án gần nhất và chỉ sai một từ: chỉ số tuỳ chỉnh KHÔNG nằm trong namespace của AWS. Tìm ở đó sẽ không thấy gì cả — và đây chính là chỗ nhiều người bối rối khi mới cài agent.
-
C (mở CloudWatch Logs console, tạo metric filter, rồi chọn chỉ số) — metric filter dùng để biến MẪU TRONG LOG thành chỉ số. Nhưng chỉ số ở đây đã là chỉ số rồi — agent đã đẩy chúng lên qua
PutMetricData, không cần biến đổi gì. -
A (từ CloudWatch Events, thêm tất cả chỉ số tuỳ chỉnh) — nhầm dịch vụ: CloudWatch Events (nay là EventBridge) xử lý SỰ KIỆN, không phải nơi quản lý chỉ số hay dashboard.
Ghi nhớ
⚠ Chỉ số EC2 có sẵn và phải cài agent — bảng phải thuộc: | Có sẵn (namespace AWS/EC2) | Phải cài CloudWatch agent (CWAgent) | |---|---| | CPUUtilization | mem_used_percent (RAM) | | NetworkIn / NetworkOut | disk_used_percent (đĩa còn trống) | | DiskReadBytes / DiskWriteBytes (instance store) | swap_used_percent | | StatusCheckFailed* | chỉ số theo tiến trình | | EBSReadOps / EBSWriteOps (Nitro) | log của ứng dụng |
Từ khoá nhận diện:
"chỉ số từ CloudWatch agent" → namespace
CWAgent"RAM, dung lượng đĩa của EC2" → phải cài agent "biến mẫu trong log thành chỉ số" → metric filter "phản ứng khi có sự kiện xảy ra" → EventBridge "phản ứng khi chỉ số vượt ngưỡng" → CloudWatch Alarm
⚠ Dashboard là tài nguyên GLOBAL — nhắc lại: | Thành phần | Phạm vi | |---|---| | Dashboard | GLOBAL — mỗi widget khai Region riêng | | Metric | theo Region | | Alarm | theo Region | | Hệ quả | một dashboard xem được chỉ số của nhiều Region |
| Các loại widget của dashboard | Nội dung |
|---|---|
| Line / Stacked area | chỉ số theo thời gian |
| Number | một con số hiện tại |
| Gauge | so với ngưỡng |
| Text (Markdown) | ghi chú và link runbook — rất đáng dùng |
| Logs table | kết quả Logs Insights |
| Alarm status | trạng thái nhiều alarm cùng lúc |
| Ba cách đẩy chỉ số tuỳ chỉnh — nhắc lại | Đặc điểm |
|---|---|
| CloudWatch agent | cách chuẩn cho chỉ số hệ thống — cấu hình JSON |
PutMetricData API |
từ mã của bạn, tính phí theo lời gọi |
| Embedded Metric Format (EMF) | nhúng chỉ số vào log — rẻ nhất khi có nhiều chỉ số |
| Bẫy chi phí với chỉ số tuỳ chỉnh | Nội dung |
|---|---|
| Tính tiền theo | số chỉ số DUY NHẤT mỗi tháng |
| Cardinality cao | mỗi tổ hợp dimension là một chỉ số riêng |
| Ví dụ nguy hiểm | thêm dimension customer_id cho 10.000 khách → 10.000 chỉ số |
| Lời khuyên | tránh đưa id người dùng, request id vào dimension |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Chỉ số có lên không | tìm namespace CWAgent trong CloudWatch | | Có những dimension nào | list-metrics --namespace CWAgent | | Vì sao không thấy | đọc log của chính agent tại /opt/aws/amazon-cloudwatch-agent/logs/ |
Và một mẹo nên áp dụng cho mọi dashboard dành cho đội trực: thêm một widget kiểu Text ở đầu, chứa link tới runbook và tên người trực. Dashboard tồn tại để được xem vào lúc hai giờ sáng bởi người có thể chưa từng thấy hệ thống này — và vài dòng Markdown chỉ ra "biểu đồ này bất thường thì làm gì" có giá trị hơn hẳn một widget đẹp thứ mười.
A company needs to track the allocation of Reserved instance discounts in the company’s consolidated bill.
Which AWS tool can be used to find this information?
-
A
AWS Organizations
-
B
Amazon Inspector
-
C
AWS Budgets
-
D
AWS Cost and Usage report
Xem giải thích
Đáp án
D — AWS Cost and Usage Report (CUR).
Vì sao đúng
Đề hỏi cách theo dõi việc PHÂN BỔ chiết khấu Reserved Instance trong hoá đơn gộp — và chỉ CUR có dữ liệu ở mức chi tiết đó.
⚠ Điểm mấu chốt — CUR là dữ liệu THÔ, chi tiết nhất mà AWS cung cấp:
Cost and Usage Report
↓
Một dòng cho MỖI đơn vị sử dụng, MỖI giờ
↓
Các cột dành riêng cho Reserved Instance:
reservation/ReservationARN
reservation/SubscriptionId
reservation/AmortizedUpfrontFeeForBillingPeriod
reservation/EffectiveCost
reservation/UnusedQuantity
lineItem/LineItemType = "DiscountedUsage"
↓
→ biết CHÍNH XÁC RI nào đã được áp cho
TÀI KHOẢN nào, INSTANCE nào, GIỜ nào
⚠ Và vì sao điều này quan trọng với hoá đơn gộp:
Reserved Instance mua ở tài khoản A
↓
Trong Organizations, chiết khấu được CHIA SẺ
cho mọi tài khoản trong tổ chức
↓
→ tài khoản B, C có thể đang hưởng chiết khấu của A
↓
→ công ty cần biết AI hưởng BAO NHIÊU
để phân bổ chi phí nội bộ cho đúng
↓
→ chỉ CUR trả lời được câu hỏi đó
⚠ Cách khai thác CUR:
CUR đổ vào một bucket S3 (định dạng CSV hoặc Parquet)
↓
Bật tích hợp Athena → truy vấn bằng SQL
↓
SELECT line_item_usage_account_id,
SUM(reservation_effective_cost)
FROM cur
WHERE line_item_line_item_type = 'DiscountedUsage'
GROUP BY 1;
↓
Hoặc dựng bảng điều khiển bằng QuickSight
Vì sao các phương án khác sai
-
C (AWS Budgets) — đây là phương án gần nhất về mặt "công cụ tài chính", và Budgets có loại ngân sách theo RI utilization và RI coverage. Nhưng nó dùng để đặt ngưỡng và cảnh báo, không phải để theo dõi việc phân bổ chiết khấu chi tiết trong hoá đơn gộp.
-
A (AWS Organizations) — quản lý cấu trúc tài khoản, SCP, và bật thanh toán gộp. Nó không cung cấp dữ liệu chi phí chi tiết nào.
-
B (Amazon Inspector) — dịch vụ quét lỗ hổng bảo mật. Không liên quan gì tới chi phí.
Ghi nhớ
⚠ Bộ công cụ chi phí — bảng phải thuộc: | Công cụ | Mức chi tiết | Việc | |---|---|---| | Cost and Usage Report (CUR) | chi tiết nhất — từng dòng, từng giờ | phân tích sâu, phân bổ nội bộ | | Cost Explorer | tổng hợp, có giao diện | xem nhanh, khuyến nghị rightsizing | | AWS Budgets | ngưỡng | cảnh báo khi vượt | | Cost Anomaly Detection | bất thường | phát hiện tăng đột biến | | Billing console | hoá đơn | tổng quan theo tháng |
Từ khoá nhận diện:
"phân bổ chiết khấu RI trong hoá đơn gộp" → CUR "dữ liệu chi phí chi tiết nhất" → CUR "cảnh báo khi RI utilization thấp" → Budgets "xem nhanh chi phí theo dịch vụ" → Cost Explorer "chi phí theo phòng ban" → cost allocation tag + Cost Explorer
⚠ Ba kiểu chiết khấu cam kết — bảng phải thuộc: | Kiểu | Linh hoạt | Đảm bảo dung lượng | |---|---|---| | Standard RI | ít nhất — cố định loại instance | zonal RI có | | Convertible RI | đổi được loại instance | có (zonal) | | Savings Plans | linh hoạt nhất — theo mức chi tiêu | KHÔNG | | Cả ba | cam kết 1 hoặc 3 năm, giảm tới 72% | |
| Cách RI được phân bổ trong Organizations | Nội dung |
|---|---|
| RI sharing bật mặc định | chiết khấu chia sẻ cho mọi tài khoản |
| Ưu tiên | tài khoản MUA RI được áp trước, phần dư mới chia cho tài khoản khác |
| Tắt sharing được | ở cấp từng tài khoản, từ tài khoản quản lý |
| Vì sao cần theo dõi | để phân bổ chi phí nội bộ cho công bằng |
| Các cột CUR đáng biết | Nội dung |
|---|---|
lineItem/LineItemType |
Usage, DiscountedUsage, RIFee, SavingsPlanCoveredUsage, Credit, Tax |
lineItem/UsageAccountId |
tài khoản nào THỰC SỰ dùng |
bill/PayerAccountId |
tài khoản trả tiền |
reservation/EffectiveCost |
chi phí thực sau khi phân bổ RI |
savingsPlan/SavingsPlanEffectiveCost |
tương tự cho Savings Plans |
resourceTags/user:<key> |
cost allocation tag |
| Thiết lập CUR | Bước |
|---|---|
| 1 | Billing console → Cost and Usage Reports → tạo report |
| 2 | Chọn granularity theo GIỜ và include resource IDs |
| 3 | Chọn định dạng Parquet để truy vấn rẻ hơn |
| 4 | Bật tích hợp Athena (hoặc Redshift, QuickSight) |
| 5 | Dữ liệu xuất hiện sau khoảng 24 giờ, cập nhật vài lần mỗi ngày |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | RI đang được dùng bao nhiêu | Cost Explorer → RI Utilization report | | Bao nhiêu tải được RI phủ | RI Coverage report | | Ai hưởng chiết khấu | CUR + Athena, nhóm theo line_item_usage_account_id |
Và một lời khuyên khi thiết lập CUR: hãy chọn granularity theo GIỜ và bật "include resource IDs" ngay từ đầu. Hai tuỳ chọn này làm tệp lớn hơn đáng kể, nhưng chúng là thứ quyết định bạn có trả lời được câu hỏi "instance nào, giờ nào, tài khoản nào" hay không — và CUR không hồi tố: dữ liệu của tháng trước sẽ mãi mãi ở mức chi tiết mà bạn đã chọn lúc ấy.
An application runs on Amazon EC2 instances in an Auto Scaling group behind an Application Load Balancer (ALB). A SysOps Administrator needs to set an Amazon CloudWatch alarm for when all target instances behind the ALB are unhealthy.
How should the Administrator configure the alarm?
-
A
In the AWS/EC2 namespace, alarm when the StatusCheckFailed_System metric is <=0
-
B
In the AWS/EC2 namespace, alarm when the StatusCheckFailed_Instance metric is >=1
-
C
In the AWS/ApplicationELB namespace, alarm when the HealthyHostCount metric is <=0
-
D
In the AWS/ApplicationELB namespace, alarm when the HealthyHostCount metric is >=1
Xem giải thích
Đáp án
C — Trong namespace AWS/ApplicationELB, đặt alarm khi chỉ số HealthyHostCount nhỏ hơn hoặc bằng 0.
Vì sao đúng
Đề hỏi "mọi target sau ALB đều không khoẻ" — và ALB có sẵn một chỉ số đếm đúng số target khoẻ.
⚠ Điểm mấu chốt — HealthyHostCount bằng 0 nghĩa là không còn máy nào phục vụ được:
HealthyHostCount
↓
Số target ĐANG KHOẺ trong một target group
↓
Bằng 0 → KHÔNG CÒN máy nào qua được health check
↓
→ alarm khi <= 0 là đúng điều kiện đề nêu
⚠ Vì sao phải dùng chỉ số của ALB chứ không phải của EC2:
Chỉ số EC2 (StatusCheckFailed) chỉ biết:
"máy còn sống hay không"
↓
Ứng dụng treo, cổng 8080 không trả lời
↓
→ EC2 status check vẫn PASS
→ nhưng ALB đánh dấu target là unhealthy
↓
→ chỉ ALB mới biết ỨNG DỤNG có phục vụ được không
⚠ Và một chi tiết quan trọng khi cấu hình alarm này:
HealthyHostCount có dimension theo TARGET GROUP
↓
→ nếu ALB có nhiều target group, phải đặt alarm cho TỪNG cái
↓
Thống kê nên dùng: Minimum
↓
→ vì chỉ số được báo cáo theo từng AZ
→ dùng Average có thể che mất việc một AZ đã hết máy khoẻ
↓
Treat missing data: notBreaching hay breaching?
↓
→ ALB ngừng phát chỉ số khi không có target nào ĐĂNG KÝ
→ cân nhắc "treat missing data as breaching" cho an toàn
Vì sao các phương án khác sai
-
D (cùng namespace ALB, nhưng alarm khi
HealthyHostCount >= 1) — đây là phương án gần nhất và đảo ngược điều kiện: nó sẽ kêu khi hệ thống đang khoẻ mạnh, và im lặng đúng lúc mọi máy đã chết. -
B (
StatusCheckFailed_Instance >= 1trong namespace EC2) — chỉ báo khi một máy có vấn đề ở tầng hệ điều hành. Nó không biết ứng dụng có phục vụ được không, và cũng không cho biết TẤT CẢ máy đã hỏng hay chưa. -
A (
StatusCheckFailed_System <= 0trong namespace EC2) — sai cả chỉ số lẫn điều kiện:StatusCheckFailed_Systembằng 0 nghĩa là hạ tầng AWS đang BÌNH THƯỜNG, nên alarm này sẽ kêu liên tục khi mọi thứ vẫn tốt.
Ghi nhớ
⚠ Các chỉ số của ALB nên đặt cảnh báo — bảng phải thuộc: | Chỉ số | Cảnh báo khi | |---|---| | HealthyHostCount | = 0 — không còn máy nào phục vụ | | UnHealthyHostCount | tăng bất thường | | TargetResponseTime | p99 vượt ngưỡng — dùng p99, không dùng trung bình | | HTTPCode_Target_5XX_Count | ứng dụng đang lỗi | | HTTPCode_ELB_5XX_Count | load balancer không phục vụ được | | RejectedConnectionCount | chạm giới hạn kết nối |
Từ khoá nhận diện:
"mọi target đều unhealthy" →
HealthyHostCount <= 0"máy chết ở tầng hệ điều hành" →StatusCheckFailed_Instance"hạ tầng AWS lỗi" →StatusCheckFailed_System"ứng dụng treo nhưng máy vẫn sống" → ELB health check, không phải EC2 status check "tự thay máy hỏng" → ASG với health check type = ELB
⚠ Nhắc lại hành vi khi mọi target unhealthy — điều rất dễ bất ngờ:
Tất cả target trong một AZ đều unhealthy
↓
ALB "FAIL OPEN": vẫn gửi request tới CHÍNH những target đó
↓
→ vì health check có thể báo sai
→ thà thử còn hơn từ chối mọi khách
↓
→ hệ quả: sự cố này KHÔNG hiện ra dưới dạng lỗi 503
→ khách vẫn nhận được trả lời, chỉ là từ máy đã hỏng
↓
→ đây chính là lý do PHẢI đặt alarm trên HealthyHostCount
| Ba nguồn health check cho ASG | Nội dung |
|---|---|
| EC2 (mặc định) | chỉ biết máy còn sống |
| ELB | kiểm tra ỨNG DỤNG có trả lời không — nên bật |
| Custom | tự gọi set-instance-health từ mã của mình |
| Nhắc lại | chỉ cần MỘT nguồn báo hỏng là ASG thay máy |
| Tham số health check của target group | Nội dung |
|---|---|
HealthCheckPath |
đường dẫn kiểm tra |
HealthyThresholdCount |
số lần đạt liên tiếp để thành khoẻ |
UnhealthyThresholdCount |
số lần trượt liên tiếp để thành hỏng |
Interval, Timeout |
tần suất và phép chờ |
Matcher |
mã HTTP coi là khoẻ, ví dụ 200-299 |
| Chẩn đoán khi target unhealthy | Bước |
|---|---|
| 1 | describe-target-health — đọc trường Reason |
| 2 | Security Group của target có mở cổng health check cho SG của ALB không |
| 3 | Gọi thẳng đường dẫn health check bằng curl từ trong VPC |
| 4 | Kiểm tra health check grace period của ASG có quá ngắn không |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Hiện có bao nhiêu máy khoẻ | chỉ số HealthyHostCount | | Vì sao máy không khoẻ | describe-target-health, trường Reason | | Alarm có kích hoạt đúng không | describe-alarm-history |
Và một lưu ý khi cấu hình alarm này cho hệ thống nhiều AZ: hãy dùng thống kê Minimum thay vì Average. ALB báo cáo HealthyHostCount theo từng Availability Zone, nên với hai AZ mà một AZ còn 4 máy khoẻ và AZ kia còn 0, giá trị trung bình vẫn là 2 — trông hoàn toàn bình thường, trong khi một nửa hệ thống của bạn đã ngừng phục vụ.
A company manages a fleet of Amazon EC2 instances in a VPC and wishes to remove their public IP addresses to protect them from internet-based threats. Some applications still require access to Amazon S3 buckets. A SysOps Administrator has been tasked with providing continued access to the S3 buckets.
Which solutions can the Administrator recommend? (Select TWO.)
-
A
Create a VPC endpoint in the VPC and configure the route tables appropriately.
-
B
Set up AWS Direct Connect and configure a virtual interface between the EC2 instances and the S3 buckets.
-
C
Deploy a NAT gateway in a public subnet and configure the route tables in the VPC appropriately.
-
D
Add an outbound rule in the security groups of the EC2 instances for Amazon S3 using private IP addresses.
-
E
Configure the internet gateway to route connections to S3 using private IP addresses.
Xem giải thích
Đáp án
A, C — hai cách cho EC2 không có IP công cộng vẫn truy cập S3:
- A — Tạo VPC endpoint trong VPC và cấu hình route table cho phù hợp.
- C — Triển khai NAT Gateway ở public subnet và cấu hình route table của VPC.
Vì sao đúng
Cả hai đều cho phép instance ở private subnet ra ngoài mà không cần IP công cộng, nhưng theo hai đường khác nhau.
⚠ Cách A — VPC endpoint: đi trong mạng AWS, KHÔNG ra internet:
Gateway endpoint cho S3
↓
Thêm một TUYẾN vào route table của private subnet:
pl-xxxxxxx (prefix list của S3) → vpce-xxxxxxx
↓
→ lưu lượng tới S3 đi trong mạng riêng của AWS
→ KHÔNG bao giờ ra internet
↓
→ HOÀN TOÀN MIỄN PHÍ
⚠ Cách C — NAT Gateway: ra internet nhưng chỉ một chiều:
NAT Gateway đặt ở PUBLIC subnet
↓
Route table của private subnet:
0.0.0.0/0 → nat-xxxxxxx
↓
→ instance RA được internet (và tới S3)
→ KHÔNG AI từ internet vào được instance
↓
→ tính tiền theo giờ VÀ theo mỗi GB
⚠ Và đây là lời khuyên thực tế — nên dùng CẢ HAI:
Gateway endpoint cho S3 và DynamoDB (MIỄN PHÍ)
+
NAT Gateway cho mọi thứ khác (tải gói, gọi API bên ngoài)
↓
→ lưu lượng S3 đi thẳng, KHÔNG qua NAT
→ cắt được phần lớn phí xử lý dữ liệu của NAT
↓
→ đây là mẹo tiết kiệm chi phí lớn nhất
liên quan tới VPC endpoint
Xem thêm câu #11763 và #11589: cùng chủ đề truy cập riêng tư tới S3 — #11763 cho File Gateway (chọn VPC endpoint vì rẻ nhất), #11589 cho instance cần tải bản vá (chọn NAT Gateway).
Vì sao các phương án khác sai
-
B (dựng Direct Connect và cấu hình virtual interface giữa EC2 và S3) — đây là phương án gần nhất về mặt "kết nối riêng tư", nhưng hiểu sai công dụng: Direct Connect nối trung tâm dữ liệu TẠI CHỖ với AWS. EC2 đã nằm trong AWS rồi, không cần Direct Connect để tới S3.
-
E (cấu hình Internet Gateway để định tuyến kết nối tới S3 bằng IP riêng) — IGW không làm việc đó: nó chỉ chuyển tiếp lưu lượng ra internet bằng IP công cộng. Và đề nói rõ là bỏ IP công cộng đi.
-
D (thêm luật outbound vào Security Group cho S3 bằng IP riêng) — Security Group mặc định đã cho phép mọi lưu lượng đi ra. Và S3 không có IP riêng nào để khai — nó là dịch vụ công khai.
Ghi nhớ
⚠ Hai loại VPC endpoint — bảng phải thuộc: | | Gateway endpoint | Interface endpoint (PrivateLink) | |---|---|---| | Dịch vụ | CHỈ S3 và DynamoDB | hầu hết dịch vụ AWS | | Chi phí | MIỄN PHÍ | theo giờ + theo GB | | Cơ chế | tuyến trong route table | ENI có IP riêng trong subnet | | Máy tại chỗ dùng được | KHÔNG | CÓ (qua DX/VPN) | | Bảo mật thêm | endpoint policy | endpoint policy + Security Group |
Từ khoá nhận diện:
"truy cập S3 từ private subnet, rẻ nhất" → gateway endpoint (miễn phí) "private subnet cần ra internet nói chung" → NAT Gateway "truy cập S3 từ TẠI CHỖ" → interface endpoint hoặc DX public VIF "IGW cho IP riêng" → KHÔNG LÀM ĐƯỢC "bỏ IP công cộng nhưng vẫn cần tải bản vá" → NAT Gateway
⚠ Mẹo tiết kiệm chi phí lớn nhất với VPC endpoint:
VPC có NAT Gateway, fleet đọc ghi S3 nhiều
↓
Không có gateway endpoint
↓
→ mọi lưu lượng S3 đi qua NAT Gateway
→ tính phí XỬ LÝ DỮ LIỆU theo từng GB
↓
Thêm gateway endpoint cho S3 (MIỄN PHÍ)
↓
→ lưu lượng S3 đi thẳng
→ cắt được một khoản đáng kể mỗi tháng
↓
→ nên làm cho MỌI VPC có NAT Gateway
| Endpoint policy — lớp kiểm soát thêm | Nội dung |
|---|---|
| Gắn vào endpoint | giới hạn bucket nào truy cập được qua đó |
| Chống | nhân viên đẩy dữ liệu ra bucket cá nhân |
| Kết hợp | aws:PrincipalOrgID — chỉ cho tài khoản trong tổ chức |
| Ngược lại | bucket policy dùng aws:SourceVpce để chỉ cho phép qua endpoint |
| Các endpoint hay cần cho private subnet | Dịch vụ |
|---|---|
s3 (gateway, miễn phí) |
tải gói, đọc ghi dữ liệu |
dynamodb (gateway, miễn phí) |
|
ssm, ssmmessages, ec2messages |
Systems Manager |
logs |
CloudWatch Logs |
ecr.api, ecr.dkr |
kéo image container |
secretsmanager, kms |
bí mật và mã hoá |
| Bỏ IP công cộng — còn cần lo gì nữa | Nội dung |
|---|---|
| Vào máy bằng cách nào | Session Manager (không cần SSH, không cần bastion) |
| Tải bản vá | NAT Gateway hoặc VPC endpoint cho SSM |
| Chi phí | từ 2/2024, IPv4 công cộng đều tính phí — bỏ đi còn tiết kiệm |
| Bảo mật | giảm hẳn bề mặt tấn công |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Endpoint đã tạo chưa | describe-vpc-endpoints | | Route table đã có tuyến chưa | gateway endpoint thêm tuyến — kiểm tra đúng bảng | | Instance ra được S3 chưa | từ trong máy: aws s3 ls |
Và một việc nên làm ngay trong mọi VPC đang có NAT Gateway: thêm gateway endpoint cho S3 và DynamoDB. Chúng hoàn toàn miễn phí, cấu hình mất vài phút, và với một fleet thường xuyên đọc ghi S3 thì chúng cắt đi phần lớn phí xử lý dữ liệu của NAT — một khoản mà rất nhiều đội trả đều đặn hằng tháng suốt nhiều năm mà không biết rằng nó hoàn toàn tránh được.