Ngân hàng đề — AWS Certified Solutions Architect Professional
Tìm thấy 1221 câu.
A company is developing an application on AWS, where the application's logs are sent to an Amazon OpenSearch Service cluster within a VPC for analysis. The development team, which includes remote workers and staff at three different office locations, needs to access the OpenSearch Service for log analysis directly from their local development machines.
What is the most effective solution to enable this access while adhering to the requirement that all data must be stored within a VPC?
-
A
Set up an AWS Client VPN endpoint, associate it with a subnet in the VPC, and configure a Client VPN self-service portal. Instruct the developers to connect using the Client VPN client.
-
B
Deploy and configure a bastion host in a public subnet of the VPC, adjust the security group of the bastion host to allow SSH access from the company's CIDR ranges, and instruct the developers to connect using SSH.
-
C
Configure a transit gateway connected to the VPC, set up an AWS Site-to-Site VPN, and create an attachment to the transit gateway. Guide the developers to connect using an OpenVPN client.
-
D
Configure a transit gateway connected to the VPC, order an AWS Direct Connect connection, set up a public VIF on the Direct Connect connection, and associate it with the transit gateway. Instruct the developers to connect to the Direct Connect connection.
Xem giải thích
Đáp án
A — Dựng AWS Client VPN endpoint, gắn nó vào một subnet trong VPC, bật self-service portal, rồi hướng dẫn lập trình viên nối bằng Client VPN client.
Vì sao đúng
Đề có hai ràng buộc chồng lên nhau, và chỉ một dịch vụ thoả cả hai: người dùng phân tán ở nhiều nơi (làm việc từ xa + ba văn phòng) và dữ liệu phải nằm trong VPC.
| Yêu cầu của đề | Cách đáp ứng |
|---|---|
| Người dùng ở khắp nơi, kể cả từ xa | VPN theo từng máy khách, không theo từng địa điểm |
| Truy cập trực tiếp từ máy cá nhân | client cài trên laptop, không qua máy trung gian |
| Dữ liệu chỉ nằm trong VPC | OpenSearch giữ nguyên trong VPC, không phơi ra Internet |
| Ít việc quản trị | self-service portal — người dùng tự tải cấu hình |
⚠ Điểm mấu chốt: Client VPN là VPN "client-to-site", khác hẳn Site-to-Site VPN:
Laptop lập trình viên (bất kỳ đâu)
↓
Client VPN endpoint (dịch vụ có quản lý, nhiều AZ)
↓
Gắn vào subnet trong VPC → nhận IP trong dải VPC
↓
→ gọi thẳng endpoint riêng của OpenSearch, không đi qua Internet
Điểm quan trọng nhất: OpenSearch trong VPC chỉ có địa chỉ riêng. Máy ở ngoài không phân giải và không định tuyến tới được. Client VPN giải quyết đúng chuyện đó bằng cách đưa laptop vào trong mạng VPC — sau khi nối, laptop có một IP thuộc dải subnet đã gắn, nên nó phân giải và gọi được endpoint riêng như một EC2 nội bộ.
Client VPN còn khớp với hình thái người dùng của đề. Người làm từ xa không có địa chỉ IP cố định — họ ở nhà, ở quán, ở khách sạn. Mọi giải pháp gắn với địa điểm (Site-to-Site VPN, Direct Connect) đều giả định một đầu mạng cố định, và giả định đó sai với nhóm người này.
Dựng endpoint và gắn subnet:
aws ec2 create-client-vpn-endpoint \
--client-cidr-block 10.100.0.0/22 \
--server-certificate-arn arn:aws:acm:ap-southeast-1:111122223333:certificate/abc \
--authentication-options Type=federated-authentication,FederatedAuthentication={SAMLProviderArn=arn:aws:iam::111122223333:saml-provider/IdP} \
--connection-log-options Enabled=true,CloudwatchLogGroup=/aws/clientvpn \
--self-service-portal enabled
aws ec2 associate-client-vpn-target-network \
--client-vpn-endpoint-id cvpn-endpoint-abc \
--subnet-id subnet-private-1a
⚠ Dải client CIDR không được trùng với CIDR của VPC:
Client CIDR trùng dải VPC
↓
Bảng định tuyến của laptop có hai đường cho cùng một dải
↓
→ nối được VPN nhưng không tới được tài nguyên, và không có lỗi rõ ràng
Dải này cũng phải đủ lớn: mỗi subnet được gắn tiêu tốn một phần, và AWS đòi tối thiểu /22.
Vì sao các phương án khác sai
-
B (bastion host trong public subnet, mở SSH từ dải CIDR của công ty) — đây là phương án gần nhất và nó thật sự giữ được dữ liệu trong VPC: OpenSearch không phơi ra ngoài, mọi truy cập đi qua một điểm kiểm soát. Nhưng nó vỡ ở đúng chỗ đề nhấn mạnh. Thứ nhất, "dải CIDR của công ty" không phủ được người làm từ xa — họ dùng mạng gia đình với IP động, không nằm trong dải nào cả. Thứ hai, phân tích log OpenSearch là việc dùng giao diện web Dashboards, mà qua SSH thì phải dựng port forwarding hoặc SOCKS proxy thủ công trên từng máy — đó không phải "truy cập trực tiếp từ máy phát triển" như đề đòi. Thứ ba, bastion là một EC2 phải vá, phải giám sát, phải quản lý khoá SSH: nhiều việc hơn hẳn một endpoint có quản lý.
-
C (transit gateway + Site-to-Site VPN, nối bằng OpenVPN client) — trộn lẫn hai mô hình không ăn khớp. Site-to-Site VPN nối hai mạng với nhau, không nối từng laptop; nó cần thiết bị đầu cuối có IP công cộng cố định ở phía kia. Câu "lập trình viên nối bằng OpenVPN client" không khớp với thứ vừa dựng — Site-to-Site VPN của AWS không phát hồ sơ cho client cá nhân. Ngay cả khi dựng cho ba văn phòng thì người làm từ xa vẫn ở ngoài.
-
D (transit gateway + Direct Connect với public VIF) — sai nặng nhất, và sai ở một chi tiết đáng nhớ: public VIF không cho vào tài nguyên riêng trong VPC. Public VIF chỉ tới các endpoint công cộng của AWS (S3, DynamoDB, API công khai). Muốn tới VPC phải là private VIF hoặc transit VIF. Ngoài ra Direct Connect mất hàng tuần tới hàng tháng để cung cấp, tốn kém, và nối tới địa điểm — vô dụng với người làm từ xa.
Ghi nhớ
⚠ Bốn cách nối vào tài nguyên riêng trong VPC — bảng phải thuộc: | Cách | Nối cái gì | Hợp với | |---|---|---| | Client VPN | một máy khách → VPC | người dùng phân tán, làm từ xa | | Site-to-Site VPN | mạng → VPC, qua Internet | văn phòng có thiết bị đầu cuối cố định | | Direct Connect | mạng → AWS, đường riêng | băng thông lớn, độ trễ ổn định, dài hạn | | Session Manager | shell vào EC2 | quản trị máy, không phải truy cập ứng dụng web |
Từ khoá nhận diện:
"remote workers" hoặc "users at multiple locations" → Client VPN "data must remain in the VPC" → không được đổi sang endpoint công khai "connect from their local development machines" → client-to-site, không phải bastion "public VIF" để vào tài nguyên riêng trong VPC → LUÔN SAI
| Loại VIF của Direct Connect | Tới được |
|---|---|
| Private VIF | VPC qua virtual private gateway |
| Transit VIF | Direct Connect gateway → transit gateway |
| Public VIF | chỉ endpoint công cộng của AWS — không vào VPC |
| Cách xác thực Client VPN | Khi nào |
|---|---|
| Chứng chỉ lẫn nhau | nhóm nhỏ, tự quản chứng chỉ |
| Active Directory | đã có AD, muốn dùng lại nhóm người dùng |
| Federated (SAML) | đã có IdP, muốn bật self-service portal |
| Chi phí Client VPN | Tính theo |
|---|---|
| Mỗi subnet được gắn | tính theo giờ, kể cả khi không ai nối |
| Mỗi kết nối client | tính theo giờ nối |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Laptop đã vào được mạng VPC chưa | dig <domain-opensearch> phải ra IP riêng | | Đường về có thông không | kiểm bảng định tuyến của Client VPN endpoint | | Ai đang nối | bật connection log ghi vào CloudWatch Logs |
Và một lời khuyên: hãy gỡ association của subnet khi không dùng nữa, đừng chỉ ngắt kết nối người dùng. Client VPN tính tiền theo giờ mỗi subnet được gắn, không theo số người đang nối — một endpoint dựng để thử nghiệm rồi bỏ quên vẫn tính tiền đều đặn hằng tháng dù không ai kết nối lần nào. Không có cảnh báo nào cho chuyện này; nó chỉ hiện ra khi ai đó đọc kỹ hoá đơn.
A company has deployed a SAML 2.0 federated identity solution with their on-premises identity provider (IdP) to authenticate users' access to the AWS environment. A Solutions Architect ran authentication tests through the federated identity web portal and access to the AWS environment was granted. When a test users attempt to authenticate through the federated identity web portal, they are not able to access the AWS environment.
Which items should the solutions architect check to ensure identity federation is properly configured? (Select THREE.)
-
A
The AWS STS service has the on-premises IdP configured as an event source for authentication requests.
-
B
The IAM roles created for the federated users' or federated groups' trust policy have set the SAML provider as the principal.
-
C
The IAM users are providing the time-based one-time password (TOTP) codes required for authenticated access.
-
D
The company's IdP defines SAML assertions that properly map users or groups in the company to IAM roles with appropriate permissions.
-
E
The web portal calls the AWS STS AssumeRoleWithSAML API with the ARN of the SAML provider, the ARN of the IAM role, and the SAML assertion from IdP.
-
F
The IAM users permissions policy has allowed the sts:AssumeRoleWithSAML API action allowed in their permissions policy.
Xem giải thích
Đáp án
B, D, E — ba thứ phải kiểm khi liên kết danh tính SAML hỏng:
- B — Trust policy của IAM role đặt SAML provider làm principal.
- D — IdP của công ty phát SAML assertion ánh xạ đúng người dùng/nhóm sang IAM role có quyền phù hợp.
- E — Web portal gọi
AssumeRoleWithSAMLvới ARN của SAML provider, ARN của IAM role, và SAML assertion từ IdP.
Vì sao đúng
Manh mối quan trọng nhất nằm ở chỗ dễ lướt qua: kiến trúc sư thử thì được, người dùng thử thì không. Hạ tầng liên kết danh tính đã đứng vững — nếu SAML provider hay endpoint sai thì cả hai đều hỏng. Vậy lỗi nằm ở đường ánh xạ từ danh tính cụ thể sang role cụ thể, chứ không ở nền tảng.
| Mắt xích | Ai chịu trách nhiệm | Hỏng thì triệu chứng |
|---|---|---|
| Assertion mang đúng role | IdP (D) | không có role nào để chọn |
| Role chấp nhận IdP đó | trust policy (B) | AccessDenied khi assume |
| Portal gọi đúng API | ứng dụng (E) | không lấy được thông tin đăng nhập tạm |
⚠ Điểm mấu chốt: liên kết SAML là một chuỗi ba mắt xích, đứt bất kỳ mắt nào cũng ra cùng một triệu chứng "không vào được":
Người dùng đăng nhập vào IdP tại chỗ
↓
IdP phát SAML assertion — trong đó có thuộc tính Role
↓
Portal gọi sts:AssumeRoleWithSAML (provider ARN + role ARN + assertion)
↓
IAM đọc trust policy của role: principal có phải SAML provider này không?
↓
→ trả về thông tin đăng nhập tạm thời
B — trust policy phải nhận đúng provider. Đây là chiều "role có tin IdP không". Không có nó thì dù assertion hoàn hảo, IAM vẫn từ chối:
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Principal": {"Federated": "arn:aws:iam::111122223333:saml-provider/CongTyIdP"},
"Action": "sts:AssumeRoleWithSAML",
"Condition": {"StringEquals": {"SAML:aud": "https://signin.aws.amazon.com/saml"}}
}]
}
D — IdP phải ánh xạ người dùng sang role. Đây là mắt xích khớp nhất với triệu chứng của đề: tài khoản kiểm thử của kiến trúc sư nằm trong nhóm đã được ánh xạ, tài khoản người dùng thử thì chưa. Assertion phải mang hai thuộc tính:
| Thuộc tính SAML | Nội dung |
|---|---|
https://aws.amazon.com/SAML/Attributes/Role |
<role-arn>,<provider-arn> — cả hai, ngăn bằng dấu phẩy |
https://aws.amazon.com/SAML/Attributes/RoleSessionName |
tên hiển thị trong CloudTrail |
E — portal phải gọi đúng API với đủ ba tham số:
aws sts assume-role-with-saml \
--role-arn arn:aws:iam::111122223333:role/NguoiDungLienKet \
--principal-arn arn:aws:iam::111122223333:saml-provider/CongTyIdP \
--saml-assertion file://assertion-base64.txt
Vì sao các phương án khác sai
-
F (IAM user phải có
sts:AssumeRoleWithSAMLtrong permissions policy) — đây là phương án gần nhất và nó đúng ở một điểm quan trọng:AssumeRoleWithSAMLthật sự là hành động cần được cho phép. Nhưng nó đặt sai chỗ hoàn toàn. Hành động này được cho phép trong trust policy của role (chiều tài nguyên), không phải trong permissions policy của một IAM user. Sâu hơn nữa: liên kết danh tính tồn tại chính là để KHÔNG cần IAM user. Người dùng liên kết không có IAM user nào để gắn policy vào — nói "permissions policy của IAM user" là tự mâu thuẫn với mô hình đang bàn. Đây là bẫy hay gặp nhất của dạng câu này vì tên hành động đọc lên nghe rất hợp lý. -
A (STS có IdP tại chỗ làm "event source") — không có khái niệm này. STS không đăng ký "nguồn sự kiện"; nó nhận lời gọi API kèm assertion. Cụm "event source" mượn từ Lambda, đặt vào đây chỉ để nghe quen tai.
-
C (người dùng phải nhập mã TOTP) — MFA thuộc về bước xác thực tại IdP, xảy ra trước khi có assertion. Nó không phải mắt xích trong đường liên kết sang AWS, và triệu chứng của MFA sai là "đăng nhập IdP thất bại", không phải "đăng nhập IdP xong mà không vào được AWS". Lại một lần nữa mâu thuẫn: đề nói người dùng liên kết, mà "IAM users" thì không tồn tại trong luồng này.
Ghi nhớ
⚠ Bốn thành phần của liên kết SAML — bảng phải thuộc: | Thành phần | Ở đâu | Việc | |---|---|---| | IdP metadata | tải lên IAM khi tạo SAML provider | cho AWS biết khoá ký của IdP | | Trust policy | trên IAM role | role tin provider nào | | Attribute mapping | cấu hình ở IdP | người/nhóm nào ra role nào | | Permissions policy | trên IAM role | sau khi vào rồi thì làm được gì |
Từ khoá nhận diện:
"the architect's test worked but users cannot access" → lỗi ở ánh xạ người dùng/nhóm, không ở nền tảng "SAML provider as the principal" → đúng, đó là trust policy "IAM users' permissions policy" trong bài về người dùng liên kết → LUÔN SAI, họ không có IAM user "AssumeRoleWithSAML" → cần provider ARN + role ARN + assertion, thiếu một là hỏng
| API STS liên kết | Dùng với |
|---|---|
AssumeRoleWithSAML |
IdP nói SAML 2.0 (AD FS, Okta, Ping) |
AssumeRoleWithWebIdentity |
OIDC (Cognito, Google, GitHub Actions) |
AssumeRole |
liên tài khoản, không liên kết danh tính ngoài |
| Lỗi thường gặp | Nguyên nhân thật |
|---|---|
| Không thấy role nào để chọn | assertion thiếu thuộc tính Role |
AccessDenied lúc assume |
trust policy không có provider này |
InvalidIdentityToken |
assertion hết hạn hoặc sai SAML:aud |
| Vào được nhưng không làm gì được | permissions policy của role quá hẹp |
| Thời hạn phiên | Giá trị |
|---|---|
| Mặc định | 1 giờ |
| Tối đa | tới 12 giờ, phải nâng MaxSessionDuration của role |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Xem nội dung assertion thật | bắt SAMLResponse ở trình duyệt, giải base64, đọc thuộc tính Role | | Xem lời gọi có tới AWS không | tìm sự kiện AssumeRoleWithSAML trong CloudTrail | | Thử tách biệt khỏi portal | gọi thẳng aws sts assume-role-with-saml bằng assertion vừa bắt |
Và một lời khuyên: hãy giải mã SAMLResponse thật của chính người dùng đang lỗi, đừng tin cấu hình ánh xạ trên màn hình IdP. Rất nhiều IdP hiển thị quy tắc ánh xạ trông hoàn hảo nhưng không khớp người dùng cụ thể — vì họ thuộc nhóm khác, hoặc thuộc tính nguồn rỗng. Khi ánh xạ không khớp, IdP vẫn phát assertion hợp lệ, chỉ là thiếu thuộc tính Role; đăng nhập vẫn "thành công" ở phía IdP, không có lỗi nào ở đó cả, và sự cố chỉ lộ ra ở bước sau dưới dạng một trang trắng khó hiểu.
A global enterprise utilizes AWS Control Tower for streamlined account management within its AWS Organizations structure. The enterprise has established a policy across its various organizational units (OUs) to ensure enhanced security and compliance. The policy strictly prohibits Amazon EC2 instances in any of these OUs from being assigned public IP addresses.
Which is the most effective solution to enforce this policy across the enterprise's AWS environment while using AWS Control Tower?
-
A
Configure Service Control Policies (SCPs) within AWS Control Tower to disallow assigning public IP addresses to EC2 instances across all OUs.
-
B
Implement network ACLs in each VPC within the OUs to block internet traffic, thereby negating the need for public IP addresses on EC2 instances.
-
C
Utilize AWS Config to constantly monitor the EC2 instances across all OUs, triggering AWS Lambda functions to remove any detected public IP addresses automatically.
-
D
Set up AWS WAF web ACLs to restrict internet access to EC2 instances, effectively making public IP addresses unnecessary.
Xem giải thích
Đáp án
A — Cấu hình Service Control Policy (SCP) trong AWS Control Tower để cấm gán địa chỉ IP công cộng cho EC2 instance trên toàn bộ các OU.
Vì sao đúng
Đề dùng ba từ khoá cùng lúc: enforce, across all OUs, AWS Control Tower. Cả ba đều trỏ về một công cụ duy nhất — SCP. Đây là dạng câu phân biệt ngăn chặn với phát hiện rồi sửa.
| Yêu cầu của đề | Cách đáp ứng |
|---|---|
| Cấm tuyệt đối, không chỉ cảnh báo | SCP chặn ngay tại lời gọi API |
| Áp cho mọi OU | gắn SCP ở root hoặc ở từng OU, thừa kế xuống |
| Dùng Control Tower | Control Tower gọi SCP là "guardrail" phòng ngừa |
| Tài khoản mới cũng phải dính | thừa kế tự động, không cần thao tác thêm |
⚠ Điểm mấu chốt: SCP chặn TRƯỚC khi tài nguyên tồn tại, mọi cách khác chỉ dọn sau khi nó đã tồn tại:
RunInstances kèm AssociatePublicIpAddress=true
↓
SCP xét: hành động này có bị Deny không?
↓
→ API trả UnauthorizedOperation — instance KHÔNG BAO GIỜ được tạo
↓
→ không có cửa sổ thời gian nào máy có IP công cộng
Chính sách thực tế trông như sau. Chú ý nó chặn theo điều kiện trên tham số, không chặn nguyên hành động RunInstances:
{
"Version": "2012-10-17",
"Statement": [{
"Sid": "CamGanIpCongCong",
"Effect": "Deny",
"Action": "ec2:RunInstances",
"Resource": "arn:aws:ec2:*:*:network-interface/*",
"Condition": {
"Bool": {"ec2:AssociatePublicIpAddress": "true"}
}
}]
}
⚠ Resource phải là network-interface, không phải instance:
IP công cộng gắn vào ENI, không gắn vào instance
↓
Điều kiện ec2:AssociatePublicIpAddress chỉ xét được ở ngữ cảnh ENI
↓
→ viết Resource là instance/* thì chính sách không khớp lần nào
↓
→ không lỗi, không cảnh báo, guardrail đơn giản là không bao giờ chặn ai
Trong Control Tower, SCP xuất hiện dưới tên preventive guardrail và được quản lý tập trung: bật ở cấp OU, mọi tài khoản trong đó và mọi tài khoản mới được Account Factory tạo ra sau này đều thừa hưởng. Đó chính là nghĩa "centrally governed" của đề.
Vì sao các phương án khác sai
-
C (AWS Config giám sát rồi Lambda tự gỡ IP công cộng) — đây là phương án gần nhất và nó thật sự chạy được: đây là mẫu "detective guardrail + auto-remediation" hoàn toàn hợp lệ, Control Tower cũng có sẵn detective guardrail. Nhưng nó không phải cấm, nó là dọn dẹp. Giữa lúc instance khởi động và lúc Lambda gỡ IP có một khoảng thời gian thật — thường vài phút với Config — trong đó máy đang mở ra Internet. Với một chính sách bảo mật viết là "strictly prohibits", một cửa sổ vài phút là vi phạm. Thêm nữa: gỡ IP công cộng khỏi một ENI đang chạy không đơn giản như nghe — với IP tự động gán thì cách duy nhất là dừng hoặc huỷ instance, nghĩa là hành động khắc phục tự nó gây gián đoạn. Và giải pháp này còn phải triển khai Config rule + Lambda + quyền cross-account cho hàng chục tài khoản, nhiều việc hơn hẳn một SCP.
-
B (network ACL chặn traffic Internet trong từng VPC) — chặn lưu lượng chứ không chặn việc gán IP. Instance vẫn nhận IP công cộng, vẫn hiện ra trong danh sách tài nguyên phơi ra ngoài, vẫn vi phạm chính sách. Tệ hơn, NACL nằm trong quyền của từng tài khoản thành viên — người vận hành ở đó sửa được, nên đây không phải kiểm soát tập trung. Và phải làm thủ công cho từng VPC mới.
-
D (AWS WAF web ACL hạn chế truy cập Internet tới EC2) — sai về bản chất dịch vụ. WAF không gắn được trực tiếp vào EC2 instance; nó chỉ gắn vào CloudFront, ALB, API Gateway, AppSync và Cognito. WAF cũng chỉ xét lưu lượng HTTP/HTTPS ở tầng 7 — nó không liên quan gì tới việc một máy có địa chỉ công cộng hay không.
Ghi nhớ
⚠ Bốn loại guardrail trong Control Tower — bảng phải thuộc: | Loại | Cơ chế | Thời điểm | |---|---|---| | Preventive | SCP | chặn lời gọi API — vi phạm không xảy ra | | Detective | AWS Config rule | phát hiện sau khi tài nguyên đã tồn tại | | Proactive | CloudFormation Hooks | chặn lúc triển khai stack, trước khi tạo | | Mandatory / Strongly recommended / Elective | phân loại theo mức | mandatory thì không tắt được |
Từ khoá nhận diện:
"prohibits" / "prevent" / "must not be able to" → SCP (preventive) "detect" / "report" / "alert when" → AWS Config (detective) "across all OUs" + "centrally" → SCP gắn ở root hoặc OU "AWS Config + Lambda to remove" khi đề nói cấm tuyệt đối → SAI, đó là dọn sau "WAF" gắn vào EC2 → LUÔN SAI, WAF không gắn được vào EC2
| Cách một EC2 có IP công cộng | Chặn bằng |
|---|---|
AssociatePublicIpAddress=true lúc chạy |
điều kiện SCP ở trên |
Subnet bật MapPublicIpOnLaunch |
SCP chặn ec2:ModifySubnetAttribute, hoặc Config rule |
| Gắn Elastic IP sau đó | SCP chặn ec2:AssociateAddress |
| Chặn cái gì | Điều kiện SCP |
|---|---|
| IP công cộng tự động | ec2:AssociatePublicIpAddress |
| Elastic IP | Deny ec2:AssociateAddress |
| Internet gateway mới | Deny ec2:CreateInternetGateway |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | SCP có thật sự chặn không | chạy aws ec2 run-instances --associate-public-ip-address trong tài khoản thành viên | | Còn máy nào đang có IP công cộng | Config rule quản lý sẵn ec2-instance-no-public-ip | | Có ai bị chặn nhầm không | lọc CloudTrail theo errorCode = UnauthorizedOperation |
Và một lời khuyên: hãy chặn cả ec2:AssociateAddress chứ không chỉ IP tự động. Một SCP chỉ chặn AssociatePublicIpAddress vẫn cho phép người dùng khởi động máy trong subnet riêng rồi gắn Elastic IP vào sau — kết quả cuối cùng y hệt thứ chính sách muốn cấm, nhưng đi qua một API khác. Không có gì báo cho bạn biết lỗ này tồn tại: bảng điều khiển Control Tower vẫn hiện guardrail màu xanh "đang bật", vì đúng là nó đang bật — chỉ có điều nó canh sai cửa.
A new AWS Lambda function has been created to replicate objects that are received in an Amazon S3 bucket to several other S3 buckets in various AWS accounts. The Lambda function is triggered when an object create event occurs in the main S3 bucket. A Solutions Architect is concerned that the function may impact other critical functions due to Lambda's regional concurrency limit.
How can the solutions architect ensure the new Lambda function will not impact other critical Lambda functions?
-
A
Configure the reserved concurrency limit for the new Lambda function. Monitor existing critical Lambda functions with Amazon CloudWatch alarms for the Throttles Lambda metric.
-
B
Modify the execution timeout for the Lambda function to the maximum allowable value. Monitor existing critical Lambda functions with Amazon CloudWatch alarms for the Throttles Lambda metric.
-
C
Create multiple Lambda functions and create an event notification configuration for object create events that triggers each function. Configure S3 to load balance between the Lambda functions to spread the load.
-
D
Ensure the new Lambda function implements an exponential backoff algorithm. Monitor existing critical Lambda functions with Amazon CloudWatch alarms for the Throttles Lambda metric.
Xem giải thích
Đáp án
A — Đặt reserved concurrency cho hàm Lambda mới, và theo dõi các hàm quan trọng hiện có bằng CloudWatch alarm trên chỉ số Throttles.
Vì sao đúng
Lambda có một hạn mức concurrency dùng chung cho cả tài khoản trong mỗi Region (mặc định 1.000). Mọi hàm rút từ cùng một hũ đó. Một hàm mới nổi lên có thể ăn hết hũ và làm mọi hàm khác bị throttle — đúng nỗi lo của đề.
| Yêu cầu của đề | Cách đáp ứng |
|---|---|
| Hàm mới không ảnh hưởng hàm quan trọng | reserved concurrency đặt TRẦN cứng cho nó |
| Biết được nếu vẫn có hàm bị nghẽn | alarm trên Throttles |
| Không phải viết lại kiến trúc | một thiết lập trên hàm, không đổi mã |
⚠ Điểm mấu chốt: reserved concurrency vừa là TRẦN vừa là SÀN, đó là lý do nó giải được bài này:
Đặt reserved concurrency = 100 cho hàm sao chép
↓
Hàm đó KHÔNG BAO GIỜ vượt quá 100 lời gọi đồng thời ← trần: bảo vệ hàm khác
↓
100 suất ấy bị RÚT khỏi hũ chung, dành riêng cho nó ← sàn: bảo vệ chính nó
↓
→ hàm quan trọng vẫn còn 900 suất, không ai giẫm chân ai
Tính hai mặt này là điều hay bị bỏ sót. Đặt reserved concurrency không chỉ kìm hàm mới lại — nó còn cắt hẳn phần đó ra khỏi hũ chung. Nghĩa là ngay cả khi hàm sao chép bùng lên vì hàng nghìn object đổ vào S3 cùng lúc, phần còn lại của tài khoản vẫn nguyên vẹn.
# đặt trần 100 cho hàm sao chép
aws lambda put-function-concurrency \
--function-name sao-chep-s3 --reserved-concurrent-executions 100
# xem hũ chung còn bao nhiêu
aws lambda get-account-settings \
--query 'AccountLimit.ConcurrentExecutions'
Phần alarm cũng không thừa. Throttles là chỉ số duy nhất cho biết đã có lời gọi bị từ chối vì hết suất:
aws cloudwatch put-metric-alarm \
--alarm-name lambda-quan-trong-bi-nghen \
--namespace AWS/Lambda --metric-name Throttles \
--dimensions Name=FunctionName,Value=ham-quan-trong \
--statistic Sum --period 60 --threshold 1 \
--comparison-operator GreaterThanOrEqualToThreshold \
--evaluation-periods 1
⚠ Đặt reserved concurrency quá thấp thì chính hàm đó tự bóp cổ mình:
Sự kiện S3 gọi Lambda bất đồng bộ
↓
Vượt reserved concurrency → bị throttle
↓
Lambda tự thử lại, mặc định 2 lần trong tối đa 6 giờ
↓
→ hết lượt thử mà vẫn nghẽn thì SỰ KIỆN BỊ MẤT nếu không cấu hình DLQ
Vì thế đi kèm reserved concurrency luôn phải có dead-letter queue hoặc on-failure destination.
Vì sao các phương án khác sai
-
D (thuật toán exponential backoff trong hàm + alarm Throttles) — đây là phương án gần nhất và backoff thật sự là kỹ thuật đúng cho việc gọi ra dịch vụ ngoài: hàm này ghi sang nhiều bucket ở nhiều tài khoản, backoff giúp nó chịu được lỗi tạm thời từ S3. Nhưng nó không giải bài này. Backoff xử lý cái xảy ra bên trong một lời gọi Lambda đang chạy; vấn đề của đề là có bao nhiêu lời gọi chạy cùng lúc. Tệ hơn nữa, backoff kéo dài thời gian chạy mỗi lời gọi, mà concurrency = tốc độ gọi × thời gian chạy — nên nó làm tăng số suất bị chiếm, đúng chiều ngược với mục tiêu. Đây là bẫy tinh vi: một kỹ thuật đúng đắn, đặt sai bài toán, và tác dụng phụ của nó lại đi ngược yêu cầu.
-
B (tăng timeout lên mức tối đa) — sai theo cùng cơ chế, còn rõ ràng hơn. Timeout dài hơn nghĩa là mỗi lời gọi giữ suất concurrency lâu hơn, nên hàm chiếm nhiều suất hơn chứ không ít đi. Đây là phương án làm vấn đề tệ đi.
-
C (tạo nhiều hàm Lambda, cho S3 "cân bằng tải" giữa chúng) — hai chỗ sai. Thứ nhất, S3 event notification không có cơ chế cân bằng tải — nó gửi sự kiện tới mọi đích khớp cấu hình, không chia lượt. Thứ hai, kể cả chia được thì tổng concurrency vẫn rút từ cùng một hũ của tài khoản; chia một khối lượng công việc ra năm hàm không làm nó tốn ít suất hơn.
Ghi nhớ
⚠ Bốn khái niệm concurrency của Lambda — bảng phải thuộc: | Khái niệm | Nghĩa | |---|---| | Account concurrency | hũ chung của Region, mặc định 1.000, xin nâng được | | Reserved concurrency | trần cứng cho một hàm, đồng thời rút phần đó khỏi hũ chung | | Provisioned concurrency | giữ sẵn môi trường đã khởi tạo — chống cold start, có tính tiền | | Burst concurrency | tốc độ tăng suất ban đầu, tuỳ Region |
Từ khoá nhận diện:
"not impact other functions" → reserved concurrency "cold start" / "consistent latency" → provisioned concurrency "TooManyRequestsException" → đang bị throttle vì concurrency "increase the timeout" để chữa nghẽn concurrency → LUÔN SAI, làm tệ hơn "exponential backoff" để chữa nghẽn concurrency → SAI, đó là chữa lỗi gọi ra ngoài
| Công thức | Nội dung |
|---|---|
| Concurrency cần | tốc độ gọi (lời gọi/giây) × thời gian chạy trung bình (giây) |
| Ví dụ | 100 lời gọi/giây × 2 giây = 200 suất |
| Kiểu gọi | Bị throttle thì sao |
|---|---|
| Đồng bộ (API Gateway) | trả 429 ngay cho người gọi |
| Bất đồng bộ (S3, SNS) | Lambda tự thử lại tới 6 giờ, hết lượt thì mất nếu không có DLQ |
| Event source mapping (SQS, Kinesis) | tin nhắn nằm lại trong nguồn, thử lại sau |
| Đặt reserved = 0 | Ý nghĩa |
|---|---|
| Hiệu ứng | tắt hoàn toàn hàm đó — cách dừng khẩn cấp một hàm đang chạy loạn |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Hàm đang dùng bao nhiêu suất | chỉ số ConcurrentExecutions theo từng hàm | | Đã có ai bị từ chối chưa | chỉ số Throttles — bất kỳ giá trị nào khác 0 đều đáng xem | | Hũ chung còn bao nhiêu | UnreservedConcurrentExecutions |
Và một lời khuyên: hãy cấu hình dead-letter queue hoặc on-failure destination cho mọi hàm được gọi bất đồng bộ mà bạn đặt reserved concurrency. Đây là nơi mất dữ liệu âm thầm điển hình: sự kiện S3 bị throttle sẽ được Lambda thử lại vài lần rồi bỏ đi hẳn nếu không có nơi hứng. Hàm không báo lỗi vì nó chưa từng chạy, Errors vẫn bằng 0, biểu đồ nhìn hoàn toàn bình thường — chỉ có object không bao giờ được sao chép sang bucket đích, và bạn chỉ biết khi có người đi tìm một tệp lẽ ra phải ở đó.
A Solutions Architect is developing a mechanism to gain security approval for Amazon EC2 images (AMIs) so that they can be used by developers. The AMIs must go through an automated assessment process (CVE assessment) and be marked as approved before developers can use them. The approved images must be scanned every 30 days to ensure compliance.
Which combination of steps should the Solutions Architect take to meet these requirements while following best practices? (Select TWO.)
-
A
Use AWS Lambda to write automatic approval rules. Store the approved AMI list in AWS Systems Manager Parameter Store. Use a managed AWS Config rule for continuous scanning on all EC2 instances and use AWS Systems Manager Automation documents for remediation.
-
B
Use the AWS Systems Manager EC2 agent to run the CVE assessment on the EC2 instances launched from the approved AMIs.
-
C
Use Amazon Inspector to run the CVE assessment package on the EC2 instances launched from the approved AMIs.
-
D
Use AWS GuardDuty to run the CVE assessment package on the EC2 instances launched from the approved AMIs.
-
E
Use AWS Lambda to write automatic approval rules. Store the approved AMI list in AWS Systems Manager Parameter Store. Use Amazon EventBridge to trigger an AWS Systems Manager Automation document on all EC2 instances every 30 days.
Xem giải thích
Đáp án
C, E — hai bước để duyệt AMI tự động và quét lại định kỳ:
- C — Dùng Amazon Inspector chạy gói đánh giá CVE trên các EC2 instance khởi động từ AMI đã duyệt.
- E — Dùng Lambda viết luật duyệt tự động, lưu danh sách AMI đã duyệt trong SSM Parameter Store, dùng EventBridge kích hoạt Systems Manager Automation document trên mọi instance mỗi 30 ngày.
Vì sao đúng
Đề đòi ba thứ: đánh giá CVE tự động, đánh dấu đã duyệt, và quét lại mỗi 30 ngày. Hai phương án đúng chia nhau đúng ba việc đó.
| Yêu cầu của đề | Bước nào lo | Bằng gì |
|---|---|---|
| Đánh giá CVE | C | Amazon Inspector |
| Đánh dấu đã duyệt | E | SSM Parameter Store |
| Quét lại mỗi 30 ngày | E | EventBridge theo lịch |
⚠ Điểm mấu chốt: Inspector quét INSTANCE, không quét AMI trực tiếp — nên quy trình phải chạy máy lên từ AMI đó:
AMI ứng viên
↓
Khởi động một instance tạm từ AMI
↓
Inspector quét lỗ hổng phần mềm trên instance đó
↓
Lambda đọc kết quả, đối chiếu ngưỡng nghiêm trọng
↓
→ đạt thì ghi AMI id vào Parameter Store, huỷ instance tạm
C — vì sao Inspector là công cụ đúng. Trong bộ công cụ AWS, Inspector là dịch vụ duy nhất làm đánh giá lỗ hổng phần mềm dựa trên cơ sở dữ liệu CVE. Nó tự phát hiện tài nguyên qua SSM agent, tự cập nhật nguồn CVE, và chấm điểm rủi ro. Đề nói thẳng "CVE assessment" — chỉ có một câu trả lời.
E — vì sao Parameter Store là nơi giữ danh sách duyệt. Nó cần một nơi mà cả người và pipeline đọc được, có phiên bản, có quyền IAM riêng:
# ghi nhận một AMI đã qua kiểm duyệt
aws ssm put-parameter \
--name /ami/da-duyet/amazon-linux-2023 \
--type String --value ami-0abc123 --overwrite
# CloudFormation/Terraform lấy AMI hiện hành từ đây thay vì hard-code
aws ssm get-parameter --name /ami/da-duyet/amazon-linux-2023 \
--query 'Parameter.Value' --output text
Và lịch 30 ngày do EventBridge giữ:
aws events put-rule --name quet-lai-ami-30-ngay \
--schedule-expression "rate(30 days)"
⚠ Vì sao phải quét LẠI dù AMI không đổi:
AMI đóng băng tại thời điểm tạo — nội dung không bao giờ đổi
↓
Nhưng CVE mới được công bố mỗi ngày
↓
→ một AMI "sạch" tháng trước có thể đang chứa lỗ hổng nghiêm trọng hôm nay
↓
→ "đã duyệt" phải có hạn dùng, không phải nhãn vĩnh viễn
Vì sao các phương án khác sai
-
A (Lambda + Parameter Store + Config rule quản lý sẵn quét liên tục + SSM Automation khắc phục) — đây là phương án gần nhất và nửa đầu của nó giống hệt E: Lambda viết luật duyệt, Parameter Store giữ danh sách — phần đó đúng. Nó chỉ hỏng ở nửa sau. AWS Config không đánh giá CVE. Config kiểm tra cấu hình tài nguyên có khớp quy tắc mong muốn không (bucket có mã hoá chưa, security group có mở 0.0.0.0/0 không) — nó không nhìn vào danh sách gói phần mềm bên trong máy và không biết CVE là gì. Ngoài ra "continuous scanning" không đáp ứng yêu cầu chu kỳ 30 ngày rõ ràng của đề, và Config đắt hơn hẳn khi chạy liên tục trên toàn bộ đội máy.
-
B (dùng SSM agent để chạy đánh giá CVE) — nhầm vai trò. SSM agent là phương tiện, không phải công cụ đánh giá: Inspector dùng SSM agent để thu thập kho gói phần mềm, nhưng bản thân agent không có cơ sở dữ liệu CVE và không chấm điểm gì. Nói "dùng SSM agent chạy CVE assessment" giống như nói "dùng dây mạng để quét virus".
-
D (GuardDuty chạy gói đánh giá CVE) — sai dịch vụ. GuardDuty là phát hiện mối đe doạ, không phải quản lý lỗ hổng. Nó đọc VPC Flow Logs, DNS logs, CloudTrail để tìm hành vi bất thường — máy đang gọi tới địa chỉ C2, khoá bị dùng từ nơi lạ, dấu hiệu đào tiền số. Nó trả lời "có ai đang tấn công tôi không", còn Inspector trả lời "tôi có lỗ hổng nào không". Hai câu hỏi khác nhau hoàn toàn.
Ghi nhớ
⚠ Bốn dịch vụ bảo mật hay bị lẫn — bảng phải thuộc: | Dịch vụ | Trả lời câu hỏi | Nguồn dữ liệu | |---|---|---| | Inspector | "Tôi có lỗ hổng phần mềm nào?" | kho gói qua SSM agent + CSDL CVE | | GuardDuty | "Có ai đang tấn công tôi?" | Flow Logs, DNS, CloudTrail | | AWS Config | "Cấu hình có lệch chuẩn không?" | trạng thái cấu hình tài nguyên | | Security Hub | "Gom mọi phát hiện lại xem thế nào?" | tổng hợp từ ba cái trên |
Từ khoá nhận diện:
"CVE" / "vulnerability assessment" / "patch level" → Inspector "threat detection" / "malicious activity" / "compromised credentials" → GuardDuty "compliance" / "configuration drift" / "desired state" → AWS Config "every 30 days" / lịch cố định → EventBridge scheduled rule "Config rule để quét CVE" → LUÔN SAI, Config không biết CVE
| Inspector quét được | Ghi chú |
|---|---|
| EC2 instance | cần SSM agent, tự động, liên tục |
| Container image trong ECR | quét lúc push và quét lại định kỳ |
| Lambda function | cả mã lẫn thư viện phụ thuộc |
| Nơi giữ danh sách AMI đã duyệt | Ưu điểm |
|---|---|
| SSM Parameter Store | có phiên bản, có quyền IAM, template đọc trực tiếp được |
| Tag trên AMI | dễ nhìn nhưng ai có quyền cũng sửa được |
| Bảng DynamoDB | linh hoạt hơn, nhưng thêm thứ phải vận hành |
| Công cụ dựng AMI theo pipeline | Việc |
|---|---|
| EC2 Image Builder | dựng, kiểm thử và phân phối AMI theo lịch — có tích hợp sẵn Inspector |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Inspector có thấy máy không | aws inspector2 list-coverage — máy thiếu SSM agent sẽ không xuất hiện | | Danh sách duyệt có mới không | aws ssm get-parameter-history xem lần cập nhật gần nhất | | Lịch có chạy không | chỉ số Invocations của EventBridge rule |
Và một lời khuyên: hãy kiểm list-coverage của Inspector chứ đừng nhìn số phát hiện. Đây là lỗi im lặng nguy hiểm nhất của quản lý lỗ hổng: một máy thiếu SSM agent, hoặc agent chết, sẽ không xuất hiện trong kết quả quét — và vì nó không xuất hiện, nó cũng không có phát hiện nào. Bảng điều khiển hiện "0 lỗ hổng nghiêm trọng" trông y hệt nhau dù bạn đang an toàn thật hay đang không quét gì cả. Con số cần theo dõi là số máy được quét, không phải số lỗ hổng tìm thấy.
A company includes several business units that each use a separate AWS account and a parent company AWS account. The company requires a single AWS bill across all AWS accounts with costs broken out for each business unit. The company also requires that services and features be restricted in the business unit accounts and this must be governed centrally.
Which combination of steps should a Solutions Architect take to meet these requirements? (Select TWO.)
-
A
Enable consolidated billing in the parent account's billing console and link the business unit AWS accounts.
-
B
Create an SCP that allows only approved services and features, then apply the policy to the business unit AWS accounts.
-
C
Use permissions boundaries applied to each business unit’s AWS account to define the maximum permissions available for services and features.
-
D
Use AWS Organizations to create a single organization in the parent account with all features enabled. Then, invite each business unit’s AWS account to join the organization.
-
E
Use AWS Organizations to create a separate organization for each AWS account with all features enabled. Then, create trust relationships between the AWS organizations.
Xem giải thích
Đáp án
B, D — hai bước để có một hoá đơn chung, tách chi phí theo đơn vị, và giới hạn dịch vụ tập trung:
- D — Dùng AWS Organizations tạo một tổ chức duy nhất trong tài khoản mẹ với all features bật, rồi mời từng tài khoản đơn vị kinh doanh gia nhập.
- B — Tạo SCP chỉ cho phép các dịch vụ và tính năng đã duyệt, gắn vào các tài khoản đơn vị kinh doanh.
Vì sao đúng
Đề có ba yêu cầu, và thứ tự phụ thuộc giữa chúng chính là nội dung câu hỏi: một hoá đơn, tách chi phí theo đơn vị, giới hạn dịch vụ được quản lý tập trung.
| Yêu cầu của đề | Bước nào lo |
|---|---|
| Một hoá đơn duy nhất | D — Organizations bao gồm luôn consolidated billing |
| Tách chi phí theo đơn vị | D — mỗi tài khoản thành viên là một dòng riêng |
| Giới hạn dịch vụ, quản trị tập trung | B — SCP |
⚠ Điểm mấu chốt: SCP chỉ tồn tại khi tổ chức bật "all features" — nên D là điều kiện tiên quyết của B:
Tạo tổ chức với chế độ Consolidated billing only
↓
Có hoá đơn gộp, có tách chi phí theo tài khoản
↓
Nhưng KHÔNG dùng được SCP — mục quản trị bị xám
↓
→ phải bật all features mới có công cụ kiểm soát
Đây là lý do B và D đi với nhau chứ không phải hai lựa chọn độc lập. AWS Organizations có hai chế độ, và chọn nhầm thì mất hẳn nửa yêu cầu của đề:
| Chế độ | Có gì | Thiếu gì |
|---|---|---|
| Consolidated billing only | hoá đơn gộp, chia sẻ mức giá bậc thang, chia sẻ Reserved Instance | không có SCP, không có quản trị tập trung |
| All features | mọi thứ trên + SCP + tag policy + backup policy | — |
Về tách chi phí: consolidated billing tự nhiên cho ra chi phí theo từng tài khoản thành viên. Vì mỗi đơn vị kinh doanh dùng một tài khoản riêng, ranh giới tài khoản chính là ranh giới chi phí — không cần gắn tag gì thêm. Đây là một trong những lý do chính người ta tách tài khoản theo đơn vị tổ chức.
# tạo tổ chức với đầy đủ tính năng
aws organizations create-organization --feature-set ALL
# mời tài khoản đơn vị kinh doanh
aws organizations invite-account-to-organization \
--target Id=444455556666,Type=ACCOUNT
# nâng cấp nếu lỡ tạo ở chế độ chỉ gộp hoá đơn
aws organizations enable-all-features
⚠ Nâng từ "chỉ gộp hoá đơn" lên "all features" cần MỌI tài khoản thành viên đồng ý:
Gọi enable-all-features
↓
Mỗi tài khoản thành viên nhận một handshake phải chấp nhận
↓
Một tài khoản không phản hồi → cả quá trình treo
↓
→ tạo đúng chế độ ngay từ đầu rẻ hơn nhiều
Vì sao các phương án khác sai
-
A (bật consolidated billing trong billing console rồi liên kết các tài khoản) — đây là phương án gần nhất và nó thật sự giải được hai trong ba yêu cầu: một hoá đơn, và chi phí tách theo tài khoản. Rất nhiều người chọn nó vì đề mở đầu bằng chuyện hoá đơn. Nhưng nó bỏ trắng yêu cầu thứ ba — không có SCP thì không có cách nào giới hạn dịch vụ tập trung. Còn một điểm nữa đáng nhớ: consolidated billing ngày nay không phải một tính năng bật riêng mà là một chế độ của AWS Organizations. Mô tả "bật trong billing console rồi liên kết tài khoản" là cách làm của thời trước Organizations, không còn đúng với giao diện hiện tại.
-
C (permissions boundary áp cho từng tài khoản) — sai về đơn vị áp dụng. Permissions boundary gắn vào IAM user hoặc IAM role, không gắn vào tài khoản. Không tồn tại thứ gọi là "permissions boundary của một AWS account". Kể cả nếu gắn cho từng role thì đó vẫn là việc phải làm trong từng tài khoản, do người ở tài khoản đó thực hiện và sửa được — trái hẳn với "governed centrally".
-
E (tạo tổ chức riêng cho mỗi tài khoản rồi thiết lập quan hệ tin cậy giữa các tổ chức) — không có cơ chế này. Các tổ chức AWS không "liên kết" hay "tin cậy" lẫn nhau, và một tài khoản chỉ thuộc đúng một tổ chức tại một thời điểm. Nhiều tổ chức cũng có nghĩa nhiều hoá đơn — đi ngược yêu cầu đầu tiên.
Ghi nhớ
⚠ Bốn thứ chỉ có ở chế độ all features — bảng phải thuộc: | Tính năng | Việc | |---|---| | SCP | đặt trần quyền cho tài khoản và OU | | Tag policy | ép chuẩn hoá khoá và giá trị tag | | Backup policy | áp chính sách AWS Backup tập trung | | AI services opt-out policy | chặn dùng dữ liệu để cải thiện dịch vụ |
Từ khoá nhận diện:
"single AWS bill" → Organizations (consolidated billing nằm sẵn trong đó) "restrict services ... governed centrally" → SCP → bắt buộc all features "costs broken out for each business unit" + mỗi đơn vị một tài khoản → có sẵn, không cần tag "permissions boundary applied to an account" → LUÔN SAI, boundary gắn cho IAM entity "trust relationships between organizations" → LUÔN SAI, không tồn tại
| Lợi ích tài chính của consolidated billing | Nội dung |
|---|---|
| Mức giá bậc thang | dùng chung khối lượng nên rơi vào bậc rẻ hơn |
| Reserved Instance / Savings Plans | chia sẻ được giữa các tài khoản, bật/tắt bằng RI sharing |
| Một phương thức thanh toán | tài khoản quản lý trả cho cả tổ chức |
| Giới hạn cần nhớ | Con số |
|---|---|
| SCP không áp cho | management account |
| Một tài khoản thuộc | đúng một tổ chức |
| Rời tổ chức | phải có đủ thông tin thanh toán độc lập |
| Cách đưa tài khoản vào tổ chức | Ghi chú |
|---|---|
invite-account-to-organization |
tài khoản đã có sẵn — phải được chấp nhận |
create-account |
tạo mới, vào thẳng tổ chức, không cần handshake |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Tổ chức đang ở chế độ nào | aws organizations describe-organization --query 'Organization.FeatureSet' | | SCP đã áp cho tài khoản nào | list-policies-for-target | | Chi phí theo tài khoản | Cost Explorer, nhóm theo Linked Account |
Và một lời khuyên: hãy kiểm FeatureSet trước khi hứa với ai rằng bạn sẽ áp SCP. Một tổ chức tạo ở chế độ chỉ gộp hoá đơn nhìn bề ngoài không khác gì tổ chức đầy đủ — vẫn thấy danh sách tài khoản, vẫn thấy OU trong giao diện, hoá đơn vẫn gộp đúng. Sự khác biệt chỉ lộ ra khi bạn đi tìm mục Policies và thấy nó bị vô hiệu hoá. Đến lúc đó, việc nâng cấp lại cần mọi tài khoản thành viên bấm đồng ý — và tài khoản của đơn vị vừa được mua lại, do một đội khác giữ, có thể mất vài tuần mới trả lời.
A financial services company receives a data feed from a credit card service provider. The feed consists of approximately 2,500 records that are sent every 10 minutes in plaintext and delivered over HTTPS to an encrypted S3 bucket. The data includes credit card data that must be automatically masked before sending the data to another S3 bucket for additional internal processing. There is also a requirement to remove and merge specific fields, and then transform the record into JSON format.
Which solutions will meet these requirements?
-
A
Create an AWS Glue crawler and custom classifier based upon the data feed formats and build a table definition to match. Perform an Amazon Athena query on file delivery to start an Amazon EMR ETL job to transform the entire record according to the processing and transformation requirements. Define the output format as JSON. Once complete, send the results to another S3 bucket for internal processing and scale down the EMR cluster.
-
B
Trigger an AWS Lambda function on file delivery that extracts each record and writes it to an Amazon SQS queue. Trigger another Lambda function when new messages arrive in the SQS queue to process the records, writing the results to a temporary location in Amazon S3. Trigger a final Lambda function once the SQS queue is empty to transform the records into JSON format and send the results to another S3 bucket for internal processing.
-
C
Create an AWS Glue crawler and custom classifier based on the data feed formats and build a table definition to match. Trigger an AWS Lambda function on file delivery to start an AWS Glue ETL job to transform the entire record according to the processing and transformation requirements. Define the output format as JSON. Once complete, have the ETL job send the results to another S3 bucket for internal processing.
-
D
Trigger an AWS Lambda function on file delivery that extracts each record and writes it to an Amazon SQS queue. Configure an AWS Fargate container application to automatically scale to a single instance when the SQS queue contains messages. Have the application process each record and transform the record into JSON format. When the queue is empty, send the results to another S3 bucket for internal processing and scale down the AWS Fargate task.
Xem giải thích
Đáp án
C — Tạo Glue crawler và custom classifier theo định dạng data feed để dựng định nghĩa bảng, dùng Lambda kích hoạt khi tệp về để chạy Glue ETL job làm toàn bộ việc che dữ liệu, gộp trường và chuyển sang JSON, rồi ghi kết quả sang bucket S3 khác.
Vì sao đúng
Đề mô tả một bài ETL kinh điển, và ba con số trong đề quyết định lựa chọn: 2.500 bản ghi, mỗi 10 phút, định dạng phải đổi.
| Yêu cầu của đề | Cách đáp ứng |
|---|---|
| Che dữ liệu thẻ tín dụng | phép biến đổi trong Glue ETL job |
| Bỏ trường, gộp trường | cùng một job, cùng một lượt đọc |
| Chuyển sang JSON | định dạng đầu ra của job |
| Tự động khi tệp về | S3 event → Lambda → khởi động job |
⚠ Điểm mấu chốt: cả bốn phép biến đổi là MỘT công việc trên MỘT bản ghi — tách chúng ra là tự tạo việc:
Tệp về bucket nguồn
↓
S3 event notification → Lambda
↓
Lambda gọi StartJobRun của Glue
↓
Glue job đọc bản ghi → che → bỏ trường → gộp trường → đổi sang JSON
↓
→ ghi thẳng sang bucket đích, một lượt đọc, một lượt ghi
Glue là dịch vụ serverless: không có cụm để dựng, không có cụm để tắt, tính tiền theo DPU-giờ thực dùng. Với khối lượng 2.500 bản ghi mỗi 10 phút, đây là mức tải rất nhỏ — mọi thứ nặng hơn đều là thừa.
Phần custom classifier cũng không phải chi tiết trang trí. Crawler mặc định nhận ra CSV, JSON, Parquet, Avro và vài dạng phổ biến. Data feed của nhà cung cấp thẻ tín dụng thường là định dạng riêng — cột cố định chiều rộng, hoặc dấu phân cách lạ. Classifier tự viết cho crawler biết cách đọc, và crawler dựng bảng trong Data Catalog để job tham chiếu.
# trong Glue ETL job — che số thẻ, giữ 4 số cuối
from pyspark.sql import functions as F
bang = bang.withColumn(
"so_the_che",
F.concat(F.lit("************"), F.substring(F.col("so_the"), -4, 4))
).drop("so_the", "cvv")
bang.write.mode("append").json("s3://xu-ly-noi-bo/giao-dich/")
⚠ Che dữ liệu phải BỎ HẲN cột gốc, không chỉ thêm cột đã che:
Thêm cột so_the_che nhưng giữ nguyên cột so_the
↓
Tệp đầu ra vẫn chứa số thẻ đầy đủ
↓
→ dữ liệu vẫn thuộc phạm vi PCI DSS, việc che coi như chưa làm
Vì sao các phương án khác sai
-
A (Glue crawler + classifier, nhưng Athena query kích hoạt EMR ETL job rồi tắt cụm) — đây là phương án gần nhất và nửa đầu giống hệt C: crawler với custom classifier để dựng bảng là bước đúng. Nó hỏng ở nửa sau, theo hai cách. Thứ nhất, cơ chế kích hoạt vô lý: Athena là công cụ truy vấn, không phải bộ kích hoạt — một truy vấn Athena không "khởi động EMR job khi tệp về", chuyện đó không xảy ra. Thứ hai, dựng và tắt một cụm EMR cho mỗi 10 phút là sai hoàn toàn về quy mô: cụm EMR mất 5–10 phút chỉ để khởi động, tức là chu kỳ tiếp theo đã tới trước khi chu kỳ trước kịp sẵn sàng. EMR dành cho khối lượng hàng terabyte, không phải 2.500 bản ghi.
-
B (Lambda tách từng bản ghi → SQS → Lambda xử lý → Lambda cuối chuyển JSON khi hàng đợi rỗng) — kiến trúc vỡ ở một điểm chí mạng: không có sự kiện "hàng đợi SQS đã rỗng".
ApproximateNumberOfMessageslà con số xấp xỉ, có độ trễ, và có thể về 0 giữa chừng trong khi vẫn còn tin nhắn đang bay. Xây điều kiện kết thúc lên trên nó là xây trên cát — job cuối sẽ chạy sớm và bỏ sót bản ghi. Ngoài ra, bổ 2.500 bản ghi thành 2.500 tin nhắn rồi ba tầng Lambda là phức tạp gấp nhiều lần một job đọc cả tệp. -
D (Lambda → SQS → Fargate tự co giãn về một instance → xử lý → tắt) — cùng lỗi "khi hàng đợi rỗng" như B, cộng thêm một cụm container phải định nghĩa, phải đóng gói image, phải quản lý vòng đời. "Tự co giãn về một instance" cũng tự mâu thuẫn: một tác vụ duy nhất thì đâu còn là co giãn.
Ghi nhớ
⚠ Bốn công cụ xử lý dữ liệu — chọn theo quy mô và tần suất: | Công cụ | Hợp với | Không hợp với | |---|---|---| | AWS Glue | ETL theo lô, serverless, vài MB tới vài trăm GB | luồng dưới một giây | | Lambda | biến đổi nhỏ, dưới 15 phút | dữ liệu lớn hơn bộ nhớ, job dài | | EMR | hàng TB, cần Spark/Hive tuỳ biến sâu | lô nhỏ chạy thường xuyên | | Kinesis Data Firehose | biến đổi nhẹ khi đang truyền | phép biến đổi phức tạp nhiều bước |
Từ khoá nhận diện:
"crawler + custom classifier" → định dạng nguồn không chuẩn, cần Glue Data Catalog "mask / remove / merge / transform into JSON" → một Glue ETL job làm hết "when the SQS queue is empty" → LUÔN SAI, không có sự kiện đó "spin up an EMR cluster" cho lô nhỏ chạy mỗi vài phút → SAI về quy mô "Athena query ... to start a job" → SAI, Athena không kích hoạt gì cả
| Thành phần Glue | Việc |
|---|---|
| Crawler | quét dữ liệu, suy ra lược đồ, ghi vào Data Catalog |
| Classifier | dạy crawler đọc định dạng lạ |
| Data Catalog | kho metadata dùng chung cho Glue, Athena, EMR, Redshift Spectrum |
| ETL job | mã Spark hoặc Python shell thực hiện biến đổi |
| Trigger | khởi động job theo lịch, theo sự kiện, hoặc theo job trước |
| Cách kích hoạt job khi tệp về S3 | Ghi chú |
|---|---|
S3 event → Lambda → StartJobRun |
linh hoạt nhất, lọc được theo tiền tố |
| S3 event → EventBridge → Glue trigger | ít mã hơn |
| Glue crawler theo lịch | trễ hơn, hợp với lô lớn ít khi tới |
| Che dữ liệu nhạy cảm | Công cụ |
|---|---|
| Trong ETL | phép biến đổi trong Glue job |
| Phát hiện dữ liệu nhạy cảm trong S3 | Amazon Macie |
| Che khi truy vấn | Lake Formation column-level và cell-level filter |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Bảng có đọc đúng không | chạy SELECT * FROM bang LIMIT 10 trong Athena sau khi crawler xong | | Job có che thật không | tải một tệp đầu ra về, grep tìm mẫu số thẻ | | Job có chạy mỗi lần tệp về không | so số lần StartJobRun với số object mới trong bucket |
Và một lời khuyên: hãy grep tệp ĐẦU RA để tìm dữ liệu nhạy cảm, đừng chỉ đọc mã biến đổi. Đây là kiểu lỗi im lặng đắt giá nhất trong nhóm này: nếu phép che của bạn thêm cột mới mà quên drop cột gốc, job vẫn chạy thành công, số bản ghi vẫn khớp, không log nào báo gì — chỉ có bucket "đã làm sạch" vẫn chứa nguyên số thẻ đầy đủ. Và vì nó được gắn nhãn là dữ liệu đã che, sẽ có người sao chép nó sang nơi có quyền truy cập rộng hơn.
A Solutions Architect is designing a web application that will serve static content in an Amazon S3 bucket and dynamic content hosted on Amazon EC2 instances behind an Application Load Balancer (ALB). The application will use Amazon CloudFront and the solution should require that the content is available through CloudFront only.
Which combination of steps should the Solutions Architect take to restrict direct content access to CloudFront? (Select THREE.)
-
A
Configure the ALB to add a custom header to HTTP requests that are sent to the EC2 instances.
-
B
Configure CloudFront to add a custom header to requests that it sends to the origin.
-
C
Create a web ACL in AWS WAF with a rule to validate the presence of a custom header and associate the web ACL with the ALB.
-
D
Create a CloudFront Origin Access Identity (OAI) and add it to the CloudFront distribution. Update the S3 bucket policy to allow access to the OAI only.
-
E
Create a web ACL in AWS WAF with a rule to validate the presence of a custom header and associate the web ACL with the CloudFront distribution.
-
F
Configure an S3 bucket policy to allow access from the CloudFront IP addresses only.
Xem giải thích
Đáp án
B, C, D — ba bước để nội dung chỉ vào được qua CloudFront:
- D — Tạo Origin Access Identity (OAI), thêm vào distribution, sửa bucket policy của S3 chỉ cho OAI.
- B — Cấu hình CloudFront thêm một custom header vào request nó gửi tới origin.
- C — Tạo web ACL trong AWS WAF với luật kiểm tra header đó có mặt, gắn web ACL vào ALB.
Vì sao đúng
Đề có hai origin khác nhau — S3 cho nội dung tĩnh và ALB cho nội dung động — và mỗi loại có cách khoá riêng. Đây là điểm mấu chốt: một cơ chế không dùng cho cả hai được.
| Origin | Cơ chế khoá | Vì sao |
|---|---|---|
| S3 | OAI (D) | S3 hiểu principal của CloudFront, khoá bằng IAM policy |
| ALB | custom header + WAF (B + C) | ALB không có khái niệm principal CloudFront |
⚠ Điểm mấu chốt: S3 khoá bằng DANH TÍNH, ALB khoá bằng BÍ MẬT DÙNG CHUNG:
Người dùng → CloudFront
↓
Đường tĩnh: CloudFront ký request bằng OAI
↓
→ S3 bucket policy chỉ cho principal OAI đó → người ngoài bị chặn
↓
Đường động: CloudFront thêm header X-Origin-Verify: <chuỗi bí mật>
↓
→ WAF trên ALB kiểm header → không có header thì chặn
D — vì sao OAI là cách đúng cho S3. OAI là một danh tính đặc biệt do CloudFront giữ. Bucket policy tham chiếu tới nó, nên chỉ CloudFront ký được request hợp lệ:
{
"Effect": "Allow",
"Principal": {"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity E1ABCDEF"},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::cong-ty-tinh/*"
}
B + C — vì sao ALB cần cách khác. ALB không xác thực principal AWS; nó chỉ thấy một request HTTP. Cách duy nhất để nó phân biệt "đến từ CloudFront" với "ai đó gọi thẳng" là một giá trị bí mật CloudFront biết mà người ngoài không biết:
# CloudFront thêm header khi gọi origin (cấu hình ở origin custom headers)
# X-Origin-Verify: 8f3a... ← chuỗi ngẫu nhiên dài
# WAF trên ALB: chặn request không mang đúng header đó
aws wafv2 create-web-acl --name chi-cho-cloudfront --scope REGIONAL \
--default-action Block={} \
--rules file://luat-kiem-header.json
⚠ Web ACL phải gắn vào ALB, KHÔNG phải vào CloudFront distribution:
Gắn web ACL kiểm header vào CloudFront
↓
Nó kiểm request của NGƯỜI DÙNG gửi tới CloudFront
↓
Người dùng không mang header đó → mọi khách bị chặn
↓
→ còn đường vào thẳng ALB thì vẫn mở toang
Header phải được kiểm ở đúng nơi cần bảo vệ, tức là ở ALB. Đây là chỗ phân biệt phương án C và E.
Vì sao các phương án khác sai
-
E (web ACL kiểm header, gắn vào CloudFront distribution) — đây là phương án gần nhất và luật WAF trong đó hoàn toàn đúng: kiểm sự có mặt của custom header là đúng kỹ thuật. Nó chỉ gắn sai chỗ, và sai chỗ làm hỏng cả hai chiều. Gắn ở CloudFront thì WAF xét request đi vào CloudFront — do trình duyệt người dùng gửi, và trình duyệt tất nhiên không có header nội bộ đó, nên khách thật bị chặn. Trong khi đó ALB vẫn không được bảo vệ chút nào: ai biết tên miền của nó vẫn gọi thẳng được. Đây là bẫy hay nhất của câu này vì E và C chỉ khác đúng một từ ở cuối câu.
-
A (ALB thêm custom header vào request gửi tới EC2) — sai chiều hoàn toàn. Header phải do CloudFront thêm vào ở đầu thượng nguồn, để chứng minh request đã đi qua CloudFront. Nếu ALB tự thêm header thì mọi request tới ALB đều có nó, kể cả request đi thẳng — nó không chứng minh được gì cả. Ngoài ra bảo vệ chặng ALB→EC2 không phải điều đề hỏi.
-
F (bucket policy chỉ cho dải IP của CloudFront) — chạy được nhưng sai về vận hành và về bảo mật. Dải IP của CloudFront thay đổi liên tục; giữ danh sách này bằng tay là bảo trì vô tận, và bỏ sót một dải mới là mất dịch vụ. Về bảo mật thì nó còn tệ hơn: các dải đó dùng chung cho mọi distribution CloudFront của mọi khách hàng AWS, nên bất kỳ ai cũng có thể trỏ distribution của họ vào bucket của bạn và đi lọt.
Ghi nhớ
⚠ Bốn cách khoá origin sau CloudFront — bảng phải thuộc: | Origin | Cơ chế nên dùng | Ghi chú | |---|---|---| | S3 (REST endpoint) | OAC (mới) hoặc OAI (cũ) | OAC hỗ trợ SSE-KMS và mọi Region | | S3 (website endpoint) | custom header + bucket policy | website endpoint không nhận OAI | | ALB / EC2 | custom header + WAF | không có khái niệm principal | | API Gateway | custom header, hoặc IAM/Lambda authorizer | tuỳ kiểu API |
Từ khoá nhận diện:
"available through CloudFront only" + S3 → OAI/OAC + bucket policy "available through CloudFront only" + ALB → custom header + WAF trên ALB "associate the web ACL with the CloudFront distribution" khi mục tiêu là chặn đường vào ALB → SAI, gắn nhầm chỗ "allow the CloudFront IP ranges" → SAI, IP đổi liên tục và dùng chung mọi khách hàng "LEAST operational overhead" cho ALB → AWS managed prefix list cho CloudFront
| OAI so với OAC | Khác biệt |
|---|---|
| OAI | cơ chế cũ, không hỗ trợ SSE-KMS, không hỗ trợ mọi Region |
| OAC | thay thế OAI, ký SigV4, hỗ trợ KMS và PUT/POST |
| Ba lớp có thể chặn | Cách |
|---|---|
| Tầng 7 theo nội dung | WAF (header, chuỗi, tốc độ, địa lý) |
| Tầng 4 theo nguồn | security group với managed prefix list com.amazonaws.global.cloudfront.origin-facing |
| Tầng danh tính | OAI/OAC cho S3 |
| Xoay chuỗi bí mật trong header | Cách an toàn |
|---|---|
| Bước 1 | thêm luật WAF chấp nhận cả giá trị cũ và mới |
| Bước 2 | đổi giá trị ở CloudFront, chờ propagate |
| Bước 3 | bỏ giá trị cũ khỏi luật WAF |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Đường vòng đã bị chặn chưa | curl thẳng vào tên miền của ALB — phải nhận 403 | | Đường chính còn chạy không | curl qua tên miền CloudFront — phải nhận 200 | | S3 đã khoá chưa | curl thẳng vào URL S3 — phải nhận AccessDenied |
Và một lời khuyên: hãy curl thẳng vào tên miền của ALB sau khi làm xong, đừng chỉ kiểm rằng trang web vẫn chạy. Cấu hình sai kiểu này không gây bất kỳ triệu chứng nào ở đường đi bình thường: khách vẫn vào được, trang vẫn hiện, biểu đồ vẫn đẹp — vì đường qua CloudFront chưa bao giờ bị đụng tới. Thứ duy nhất khác biệt là cánh cửa sau vẫn mở, và cách duy nhất để biết là tự đi thử cánh cửa đó. Nếu nó trả về 200, bạn chưa bảo vệ được gì cả.
A company is migrating its on-premises systems to AWS. The computers consist of a combination of Windows and Linux virtual machines on VMware and physical servers.
The company wants to be able to identify dependencies between on-premises systems and group systems together into applications to build migration plans. The company also needs to understand the performance requirements for systems so they can be right-sized.
How can these requirements be met?
-
A
Extract system information from an on-premises configuration management database (CMDB). Import the data directly into the Application Discovery Service.
-
B
Install the AWS Application Discovery Service Discovery Connector in VMware vCenter. Allow the Discovery Connector to collect data for one week.
-
C
Install the AWS Application Discovery Service Discovery Connector in VMware vCenter. Install the AWS Application Discovery Service Discovery Agent on the physical on-premises servers. Allow the Discovery Agent to collect data for a period of time.
-
D
Install the AWS Application Discovery Service Discovery Agent on each of the on-premises systems. Allow the Discovery Agent to collect data for a period of time.
Xem giải thích
Đáp án
C — Cài Application Discovery Service Discovery Connector trong VMware vCenter, ĐỒNG THỜI cài Discovery Agent trên các máy chủ vật lý tại chỗ, rồi để chúng thu thập dữ liệu một thời gian.
Vì sao đúng
Đề nêu hai đặc điểm môi trường và ba yêu cầu, và chỉ một phương án phủ hết cả năm.
| Đặc điểm / yêu cầu | Phương án C đáp ứng bằng |
|---|---|
| Máy ảo trên VMware | Discovery Connector cắm vào vCenter |
| Máy chủ vật lý | Discovery Agent cài trên từng máy |
| Tìm phụ thuộc giữa các hệ thống | chỉ Agent làm được |
| Gom hệ thống thành ứng dụng | Migration Hub, dựa trên dữ liệu phụ thuộc |
| Hiểu yêu cầu hiệu năng để right-size | cả hai đều đo, Agent chi tiết hơn |
⚠ Điểm mấu chốt: Connector và Agent nhìn thấy hai thứ khác nhau, và chỉ Agent thấy được phụ thuộc mạng:
Discovery Connector — một máy ảo cắm vào vCenter
↓
Hỏi vCenter về danh sách VM, CPU, RAM, đĩa, mạng ở mức máy ảo
↓
→ thấy được "có gì" và "dùng bao nhiêu", KHÔNG thấy được "nói chuyện với ai"
Discovery Agent — cài trong hệ điều hành
↓
Đọc tiến trình đang chạy, cổng đang mở, kết nối TCP đang mở
↓
→ thấy được máy A cổng 3306 đang nối tới máy B — chính là quan hệ phụ thuộc
Đây là lý do phương án B (chỉ Connector) không đủ, và cũng là lý do phải cài Agent trên máy vật lý — Connector chỉ biết những gì vCenter biết, mà vCenter không biết gì về máy chủ vật lý.
Sau khi thu thập, dữ liệu đổ về AWS Migration Hub, nơi bạn nhóm các máy chủ thành application và xem đồ thị phụ thuộc:
# xem những gì đã phát hiện
aws discovery describe-configurations --configuration-ids <id>
# gom thành một ứng dụng để lập kế hoạch di chuyển theo cụm
aws discovery create-application \
--name "He thong dat hang" --description "Web + app + MySQL"
⚠ Phải để chạy đủ lâu, và "đủ lâu" phụ thuộc chu kỳ nghiệp vụ:
Thu thập một ngày
↓
Bỏ sót job chạy cuối tuần, báo cáo cuối tháng, đỉnh tải theo mùa
↓
→ right-size theo dữ liệu thiếu → máy chọn quá nhỏ, hoặc bỏ sót một phụ thuộc quan trọng
Vì thế đề viết "for a period of time" chứ không nêu con số cứng — khoảng hai tới bốn tuần là mức thường dùng, đủ phủ ít nhất một chu kỳ tháng.
Vì sao các phương án khác sai
-
B (chỉ cài Connector trong vCenter, thu thập một tuần) — đây là phương án gần nhất và nó đúng một nửa: Connector là công cụ chuẩn cho phần VMware, và một tuần cũng không phải khoảng thời gian vô lý. Nhưng nó hỏng ở hai chỗ. Thứ nhất, đề nói rõ môi trường có cả máy chủ vật lý — Connector không thấy chúng, nên một phần hạ tầng biến mất khỏi kế hoạch di chuyển. Thứ hai, và quan trọng hơn: Connector không thu thập được quan hệ phụ thuộc. Nó đọc số liệu ở mức máy ảo từ vCenter, không nhìn vào bên trong hệ điều hành để thấy tiến trình và kết nối TCP. Mà "identify dependencies between systems" là yêu cầu đầu tiên đề nêu.
-
D (chỉ cài Agent trên mọi hệ thống) — về mặt kỹ thuật thì thu được đủ dữ liệu, kể cả phụ thuộc. Nhưng nó bỏ qua công cụ dựng riêng cho môi trường VMware: cài agent lên hàng trăm máy ảo thủ công tốn công gấp bội so với cắm một Connector vào vCenter và lấy ngay toàn bộ kho máy ảo. Với môi trường VMware, mẫu chuẩn của AWS là Connector cho VM, Agent cho phần Connector không với tới — hoặc cho những máy cần dữ liệu phụ thuộc chi tiết.
-
A (xuất dữ liệu từ CMDB tại chỗ rồi nhập vào Application Discovery Service) — đề nói thẳng công ty không có CMDB trung tâm và tài liệu thì thiếu và lỗi thời. Phương án này giả định đúng cái mà đề vừa phủ nhận. Ngay cả khi có CMDB, dữ liệu tĩnh trong đó không chứa số liệu hiệu năng thật để right-size, cũng không chứa quan hệ phụ thuộc quan sát được.
Ghi nhớ
⚠ Hai chế độ của Application Discovery Service — bảng phải thuộc: | | Discovery Connector | Discovery Agent | |---|---|---| | Cài ở đâu | máy ảo cắm vào vCenter | trong hệ điều hành từng máy | | Hợp với | môi trường VMware, quy mô lớn | máy vật lý, máy ngoài VMware, cần chi tiết | | Thấy được | kho máy ảo, CPU/RAM/đĩa/mạng | thêm tiến trình, cổng, kết nối TCP | | Phụ thuộc mạng | KHÔNG | CÓ | | Công cài đặt | một lần cho cả vCenter | từng máy một |
Từ khoá nhận diện:
"identify dependencies between systems" → bắt buộc có Agent "VMware" + "physical servers" → cả Connector lẫn Agent "no CMDB / documentation is outdated" → loại mọi phương án nhập từ CMDB "group systems into applications" → Migration Hub "estimate costs after migration" → Migration Evaluator (trước là TSO Logic)
| Công cụ giai đoạn di chuyển | Việc |
|---|---|
| Application Discovery Service | thu thập kho máy và phụ thuộc |
| Migration Hub | nơi xem tập trung, gom thành ứng dụng, theo dõi tiến độ |
| Migration Evaluator | ước tính chi phí sau khi lên cloud |
| Cloud Adoption Readiness Tool (CART) | bảng đánh giá mức sẵn sàng của tổ chức |
| Application Migration Service (MGN) | thực hiện rehost — trước là SMS |
| DMS + SCT | di chuyển và chuyển đổi cơ sở dữ liệu |
| Nhóm 7R | Nghĩa |
|---|---|
| Rehost | bê nguyên lên, không sửa |
| Replatform | sửa nhẹ, ví dụ MySQL tự quản → RDS |
| Refactor | viết lại theo kiến trúc cloud |
| Repurchase / Retire / Retain / Relocate | mua thứ khác / bỏ / giữ lại / chuyển nguyên khối VMware |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Đã thấy đủ máy chưa | so số máy trong Migration Hub với danh sách vCenter cộng máy vật lý | | Đã có dữ liệu phụ thuộc chưa | mở đồ thị Network Connections của một máy bất kỳ | | Dữ liệu đủ dài chưa | xem khoảng thời gian thu thập có phủ ít nhất một chu kỳ tháng |
Và một lời khuyên: hãy mở đồ thị phụ thuộc của một máy bạn đã biết rõ, xem nó có hiện đúng những kết nối bạn biết là có không. Đây là kiểu thiếu sót không báo lỗi: nếu bạn chỉ cắm Connector, Migration Hub vẫn hiện đầy đủ danh sách máy chủ, số liệu CPU và RAM vẫn đẹp, mọi thứ trông như đã xong — chỉ có phần phụ thuộc là trống, và bạn không nhận ra vì "trống" trông y hệt "máy này không phụ thuộc gì". Kết quả là một làn di chuyển được lên lịch thiếu mất cơ sở dữ liệu mà ứng dụng cần, và chuyện đó chỉ lộ ra sau khi cắt chuyển.
A new application that provides fitness and training advice has become extremely popular with thousands of new users from around the world. The web application is hosted on a fleet of Amazon EC2 instances in an Auto Scaling group behind an Application Load Balancer (ALB). The content consists of static media files and different resources must be loaded depending on the client operating system.
Users have reported increasing latency for loading web pages and Amazon CloudWatch is showing high utilization of the EC2 instances.
Which set actions should a solutions architect take to improve response times?
-
A
Move content to Amazon S3. Create an Amazon CloudFront distribution to serve content out of the S3 bucket. Use the User-Agent HTTP header to load different content.
-
B
Create separate Auto Scaling groups based on client operating systems. Switch to a Network Load Balancer (NLB). Use the User-Agent HTTP header in the NLB to route to a different set of EC2 instances.
-
C
Create a separate ALB for each client operating system. Create one Auto Scaling group behind each ALB. Use Amazon Route 53 to route to different ALBs depending on the User-Agent HTTP header.
-
D
Move content to Amazon S3. Create an Amazon CloudFront distribution to serve content out of the S3 bucket. Use Lambda@Edge to load different resources based on the User-Agent HTTP header.
Xem giải thích
Đáp án
D — Chuyển nội dung sang S3, tạo CloudFront distribution phục vụ từ bucket đó, và dùng Lambda@Edge để nạp tài nguyên khác nhau dựa trên header User-Agent.
Vì sao đúng
Đề có hai vấn đề chồng lên nhau: độ trễ vì người dùng ở khắp thế giới và EC2 quá tải vì đang phục vụ tệp tĩnh. Cộng thêm một ràng buộc: nội dung phải khác nhau tuỳ hệ điều hành máy khách.
| Vấn đề của đề | Cách chữa |
|---|---|
| Người dùng toàn cầu, trang chậm | CloudFront — phục vụ từ điểm biên gần họ |
| EC2 quá tải | S3 giữ tệp tĩnh, EC2 hết việc phục vụ tệp |
| Nội dung khác nhau theo hệ điều hành | Lambda@Edge đọc User-Agent và định tuyến |
⚠ Điểm mấu chốt: CloudFront không tự phân nhánh theo User-Agent — mặc định nó chỉ có một phiên bản cho mỗi URL:
Request tới điểm biên kèm User-Agent: ... Android ...
↓
Lambda@Edge chạy ngay tại điểm biên (viewer request hoặc origin request)
↓
Đọc header, viết lại đường dẫn: /anh/logo.png → /anh/android/logo.png
↓
→ trả nội dung đúng nền tảng, vẫn được cache tại biên
Đây là phần thực chất của câu hỏi. Nếu chỉ đặt CloudFront lên trước S3, mọi máy khách nhận cùng một tệp — không đáp ứng được yêu cầu "tài nguyên khác nhau tuỳ hệ điều hành". Lambda@Edge là cơ chế cho phép chạy logic tại điểm biên, không phải quay về origin.
// Lambda@Edge — origin request
exports.handler = async (event) => {
const request = event.Records[0].cf.request;
const ua = (request.headers['user-agent'] || [{value: ''}])[0].value;
const nenTang = /Android/i.test(ua) ? 'android'
: /iPhone|iPad/i.test(ua) ? 'ios'
: 'web';
request.uri = '/' + nenTang + request.uri;
return request;
};
⚠ Phải đưa User-Agent vào cache key, nếu không mọi máy nhận chung một bản:
Lambda@Edge chọn đúng nội dung cho máy đầu tiên
↓
CloudFront cache kết quả theo URL gốc, không tính User-Agent
↓
→ máy iPhone tiếp theo nhận bản Android còn trong cache
↓
→ không lỗi, không cảnh báo, chỉ là giao diện sai với một nửa người dùng
Cách làm đúng là chuẩn hoá User-Agent thành một header hẹp (ví dụ X-Nen-Tang: android|ios|web) ở viewer request, rồi đưa header đó vào cache policy. Đưa thẳng User-Agent vào cache key là thảm hoạ về tỷ lệ trúng cache, vì có hàng chục nghìn chuỗi khác nhau — mỗi chuỗi thành một mục cache riêng.
Vì sao các phương án khác sai
-
A (S3 + CloudFront, dùng
User-Agentđể nạp nội dung khác nhau) — đây là phương án gần nhất và hai bước đầu giống hệt D: chuyển sang S3 và đặt CloudFront lên trước là đúng, và nó cũng nhận raUser-Agentlà tín hiệu cần dùng. Nó chỉ thiếu đúng một thứ — cơ chế. "Dùng headerUser-Agentđể nạp nội dung khác nhau" mô tả kết quả mong muốn chứ không nói ai làm việc đó. CloudFront tự nó không phân nhánh nội dung theo header; nó chỉ có thể chuyển tiếp header về origin và đưa vào cache key. Với origin là S3 tĩnh thì chẳng có gì ở đầu kia đọc header và chọn tệp cả — S3 trả object theo khoá, hết. Thiếu Lambda@Edge (hoặc CloudFront Function) thì yêu cầu thứ ba không được đáp ứng. -
B (Auto Scaling group riêng theo hệ điều hành, chuyển sang NLB, định tuyến theo
User-Agentở NLB) — sai về tầng mạng. NLB hoạt động ở tầng 4, nó nhìn IP và cổng, không đọc được header HTTP. Định tuyến theoUser-Agentở NLB là chuyện không thể. Ngoài ra phương án này không đụng gì tới hai vấn đề chính: nội dung vẫn phục vụ từ một Region nên người ở xa vẫn chậm, và EC2 vẫn phải phục vụ tệp tĩnh. -
C (ALB riêng cho mỗi hệ điều hành, Route 53 định tuyến theo
User-Agent) — Route 53 là DNS, và DNS không thấy header HTTP. Truy vấn DNS xảy ra trước khi kết nối HTTP tồn tại; nó chỉ biết địa chỉ IP của bộ phân giải, không biết trình duyệt nào đang hỏi. Đây là một trong những nhầm lẫn phổ biến nhất về Route 53. Phương án này cũng nhân đôi hạ tầng mà không giải quyết độ trễ toàn cầu.
Ghi nhớ
⚠ Bốn nơi chạy mã ở điểm biên — bảng phải thuộc: | | CloudFront Functions | Lambda@Edge | |---|---|---| | Ngôn ngữ | JavaScript (ECMAScript 5.1) | Node.js, Python | | Thời gian chạy tối đa | dưới 1 ms | 5 giây (viewer), 30 giây (origin) | | Chạy ở | viewer request/response | cả bốn điểm móc | | Gọi mạng được không | không | có | | Hợp với | viết lại URL, thêm header, chuyển hướng | logic cần gọi dịch vụ khác, xử lý thân request |
| Bốn điểm móc của CloudFront | Chạy khi |
|---|---|
| Viewer request | ngay khi nhận request, trước khi tra cache |
| Origin request | chỉ khi cache trượt, trước khi gọi origin |
| Origin response | sau khi origin trả lời, trước khi cache |
| Viewer response | ngay trước khi trả cho người dùng |
Từ khoá nhận diện:
"users around the world" + "high EC2 utilization" → S3 + CloudFront "different content based on the User-Agent" → Lambda@Edge hoặc CloudFront Function "NLB routes based on HTTP header" → LUÔN SAI, NLB ở tầng 4 "Route 53 routes based on User-Agent" → LUÔN SAI, DNS không thấy HTTP "ALB routes based on header" → đúng, ALB làm được — nhưng không giải bài toán độ trễ toàn cầu
| Định tuyến theo header — làm được ở đâu | Ghi chú |
|---|---|
| ALB listener rule | có, ALB ở tầng 7 |
| CloudFront Function / Lambda@Edge | có, ngay tại biên |
| NLB | không |
| Route 53 | không |
| Cache key nên chứa | Ghi chú |
|---|---|
Header đã chuẩn hoá (X-Nen-Tang) |
vài giá trị, cache vẫn hiệu quả |
User-Agent thô |
hàng chục nghìn giá trị — phá nát tỷ lệ trúng cache |
Ba việc kiểm chứng: | Việc | Cách | |---|---| | Tỷ lệ trúng cache | chỉ số CacheHitRate của CloudFront | | Có trả đúng bản cho từng nền tảng không | curl -H "User-Agent: ... Android ..." và so với bản iOS | | Lambda@Edge có chạy không | log nằm ở CloudWatch của Region gần điểm biên, không phải Region gốc |
Và một lời khuyên: hãy thử hai User-Agent khác nhau liên tiếp trên cùng một URL và so nội dung trả về. Lỗi cache key kiểu này không hiện ra ở lần thử đầu: máy đầu tiên gọi vào một điểm biên lạnh sẽ nhận đúng nội dung, và bạn kết luận là xong. Chỉ từ request thứ hai trở đi, khi bản đã cache được trả lại cho một nền tảng khác, sai lệch mới xuất hiện — và nó xuất hiện không đều, tuỳ điểm biên nào đang giữ bản nào, nên rất dễ bị bỏ qua như một sự cố ngẫu nhiên của người dùng.