Ngân hàng đề — AWS Certified Developer Associate
Tìm thấy 1356 câu.
A Developer has created a task definition that includes the following JSON code:
- "placementStrategy": [
- {
- "field": "attribute:ecs.availability-zone",
- "type": "spread"
- },
- {
- "field": "instanceId",
- "type": "spread"
- }
- ]
What is the effect of this task placement strategy?
-
A
It distributes tasks evenly across Availability Zones and then distributes tasks evenly across the instances within each Availability Zone
-
B
It distributes tasks evenly across Availability Zones and then distributes tasks randomly across instances within each Availability Zone
-
C
It distributes tasks evenly across Availability Zones and then bin packs tasks based on memory within each Availability Zone
-
D
It distributes tasks evenly across Availability Zones and then distributes tasks evenly across distinct instances within each Availability Zone
Xem giải thích
Đáp án
A — Phân bố task đều trên các Availability Zone, rồi phân bố đều trên các instance trong từng AZ.
Vì sao đúng
Placement strategy của ECS được đánh giá theo thứ tự trong mảng, và mỗi phần tử là một tầng lọc:
"placementStrategy": [
{ "field": "attribute:ecs.availability-zone", "type": "spread" }, ← tầng 1
{ "field": "instanceId", "type": "spread" } ← tầng 2
]
Tầng 1 — spread theo AZ: ECS đặt task sao cho số lượng cân bằng nhất có thể giữa các AZ. Ba AZ, sáu task ⇒ mỗi AZ hai task.
Tầng 2 — spread theo instanceId: trong AZ đã chọn, ECS lại phân bố đều giữa các instance. Đây là điều làm nên khác biệt với "ngẫu nhiên".
Kết quả là mẫu đặt task chịu lỗi tốt nhất: một AZ sập thì chỉ mất phần tương ứng, một instance chết thì cũng chỉ mất phần nhỏ.
Vì sao các phương án khác sai
- B. "…rồi phân bố ngẫu nhiên trong từng AZ" — nhầm
spreadvớirandom. Đây là haitypekhác nhau:spreadcân bằng có chủ đích,randomchọn tuỳ ý. Tầng 2 trong đề ghi rõ"type": "spread". - C. "…rồi bin pack theo bộ nhớ trong từng AZ" —
binpacklà chiến lược ngược lại: nó dồn task lên càng ít instance càng tốt để tiết kiệm chi phí. Nó không có trong JSON của đề. - D. "…phân bố đều trên các instance riêng biệt (distinct)" — khác biệt tinh tế:
distinctInstancelà một placement CONSTRAINT, không phải strategy. Nó bắt buộc mỗi instance chỉ được có một task, trong khispreadtheoinstanceIdchỉ cân bằng số lượng và vẫn cho phép nhiều task trên cùng một máy.
Ghi nhớ
type |
Hành vi | Dùng khi |
|---|---|---|
spread |
cân bằng đều theo field |
tính sẵn sàng cao |
binpack |
dồn chặt theo cpu hoặc memory |
tiết kiệm chi phí |
random |
chọn ngẫu nhiên | không có yêu cầu đặc biệt |
Và phân biệt hai khái niệm: strategy = ưu tiên đặt ở đâu; constraint = bắt buộc/cấm đặt ở đâu.
A gaming company is building an application to track the scores for their games using an Amazon DynamoDB table. Each item in the table is identified by a partition key
(user_id) and a sort key (game_name). The table also includes the attribute “TopScore”. The table design is shown below:

A Developer has been asked to write a leaderboard application to display the highest achieved scores for each game (game_name), based on the score identified in the “TopScore” attribute.
What process will allow the Developer to extract results MOST efficiently from the DynamoDB table?
-
A
Create a global secondary index with a partition key of “game_name” and a sort key of “TopScore” and get the results based on the score attribute
-
B
Use a DynamoDB scan operation to retrieve the scores for “game_name” using the “TopScore” attribute, and order the results based on the score attribute
-
C
Create a local secondary index with a partition key of “game_name” and a sort key of “TopScore” and get the results based on the score attribute
-
D
Create a global secondary index with a partition key of “user_id” and a sort key of “game_name” and get the results based on the “TopScore” attribute
Xem giải thích
Đáp án
A — Tạo global secondary index (GSI) với partition key là game_name và sort key là TopScore.
Vì sao đúng
Bảng gốc (nhìn thấy trong ảnh cấu hình) có:
- Partition key:
user_id(String) - Sort key:
game_name(String)
Với khoá đó, bạn chỉ truy vấn hiệu quả theo một người dùng cụ thể ("người này chơi những game nào"). Nhưng bảng xếp hạng hỏi ngược lại: "game này ai điểm cao nhất" — tức là truy vấn theo game_name và sắp xếp theo TopScore.
GSI cho phép định nghĩa một cặp khoá hoàn toàn khác:
| Bảng gốc | GSI | |
|---|---|---|
| Partition key | user_id |
game_name |
| Sort key | game_name |
TopScore |
Với GSI này, một lệnh Query duy nhất trả về bảng xếp hạng đã sắp xếp sẵn:
table.query(
IndexName='leaderboard-index',
KeyConditionExpression=Key('game_name').eq('space-race'),
ScanIndexForward=False, # giảm dần — điểm cao lên trước
Limit=10)
Đây chính là mẫu "đảo khoá" kinh điển của DynamoDB.
Vì sao các phương án khác sai
- C. Local secondary index (LSI) — đây là điểm loại quan trọng nhất, và nó là một ràng buộc cứng: LSI bắt buộc dùng CÙNG partition key với bảng gốc, chỉ được đổi sort key. Bảng gốc có partition key là
user_id, nên không thể tạo LSI với partition keygame_name. Ngoài ra LSI chỉ tạo được lúc tạo bảng, không thêm sau được. - B. Dùng Scan — Scan đọc toàn bộ bảng rồi lọc ở phía client. Với bảng của một công ty game thì đó là hàng triệu item mỗi lần xem bảng xếp hạng: cực chậm, cực tốn read capacity. Và Scan không sắp xếp kết quả.
- D. GSI với partition key
user_idvà sort keygame_name— trùng y hệt khoá của bảng gốc, nên không mở ra kiểu truy vấn nào mới. Vẫn không trả lời được câu hỏi "game này ai cao điểm nhất".
Ghi nhớ
| GSI | LSI | |
|---|---|---|
| Partition key | đổi được | phải giống bảng gốc |
| Sort key | đổi được | đổi được |
| Tạo lúc nào | bất cứ lúc nào | chỉ lúc tạo bảng |
| Số lượng | 20 (mặc định) | 5 |
| Capacity | riêng | dùng chung với bảng |
| Nhất quán | chỉ eventual | cho phép strongly consistent |
Câu thần chú: cần đổi partition key ⇒ bắt buộc là GSI.
The source code for an application is stored in a file named index.js that is in a folder along with a template file that includes the following code:
- AWSTemplateFormatVersion: '2010-09-09'
- Transform: 'AWS::Serverless-2016-10-31'
- Resources:
- LambdaFunctionWithAPI:
- Type: AWS::Serverless::Function
- Properties:
- Handler: index.handler
- Runtime: nodejs12.x
What does a Developer need to do to prepare the template so it can be deployed using an AWS CLI command?
-
A
Run the
aws cloudformation packagecommand to upload the source code to an Amazon S3 bucket and produce a modified CloudFormation template -
B
Run the
aws cloudformation compilecommand to base64 encode and embed the source file into a modified CloudFormation template -
C
Run the
aws lambda zipcommand to package the source file together with the CloudFormation template and deploy the resulting zip archive -
D
Run the
aws serverless create-packagecommand to embed the source file directly into the existing CloudFormation template
Xem giải thích
Đáp án
A — Chạy lệnh aws cloudformation package để tải mã nguồn lên S3 và sinh ra một template CloudFormation đã được sửa.
Vì sao đúng
Template trong đề dùng transform AWS::Serverless-2016-10-31 — tức là template SAM. Với AWS::Serverless::Function, thuộc tính CodeUri (hoặc mặc định là thư mục hiện tại) trỏ tới mã nguồn cục bộ.
Nhưng CloudFormation không đọc được đường dẫn cục bộ trên máy bạn. Nó chỉ nhận URI của S3. Đó là lý do phải có bước package:
aws cloudformation package \
--template-file template.yaml \
--s3-bucket kho-artifact-cua-toi \
--output-template-file template-da-dong-goi.yaml
Lệnh này làm ba việc: nén mã nguồn, tải lên S3, và sinh ra template mới trong đó CodeUri đã được thay bằng URI S3 thật:
CodeUri: s3://kho-artifact-cua-toi/a1b2c3d4e5f6...
Sau đó mới deploy được:
aws cloudformation deploy --template-file template-da-dong-goi.yaml \
--stack-name ung-dung --capabilities CAPABILITY_IAM
Vì sao các phương án khác sai
- B.
aws cloudformation compile— lệnh này không tồn tại. AWS CLI cho CloudFormation cópackage,deploy,create-stack,update-stack,validate-template… nhưng không cócompile. Và nhúng mã base64 vào template cũng không phải cách SAM hoạt động — template có giới hạn kích thước 51.200 byte khi truyền trực tiếp. - C.
aws lambda zip— cũng không tồn tại. Lệnhaws lambdacócreate-function,update-function-code,invoke… nhưng không cózip. Việc nén là dopackagehoặcsam buildtự làm. - D.
aws serverless create-package— không có namespaceaws serverlesstrong AWS CLI. Công cụ chuyên cho SAM làsamCLI (sam build,sam package,sam deploy), một chương trình riêng biệt.
Ghi nhớ
Hai bộ lệnh tương đương cho SAM: | AWS CLI | SAM CLI | |---|---| | aws cloudformation package | sam package | | aws cloudformation deploy | sam deploy |
sam deploy --guided gộp cả hai và tự hỏi các tham số cần thiết — cách gọn nhất trong thực tế. Nguyên tắc cần nhớ: CodeUri trỏ vào máy cục bộ thì luôn phải qua bước package trước khi deploy.
The following permissions policy is applied to an IAM user account:
- {
- "Version": "2012-10-17",
- "Statement": [{
- "Effect": "Allow",
- "Action": "sqs:*",
- "Resource": "arn:aws:sqs:*:513246782345:staging-queue*"
- }]
- }
Due to this policy, what Amazon SQS actions will the user be able to perform?
-
A
The user will be able to create a queue named “staging-queue“
-
B
The user will be able to use all Amazon SQS actions, but only for queues with names begin with the string “staging-queue“
-
C
The user will be granted cross-account access from account number “513246782345” to queue “staging-queue”
-
D
The user will be able to apply a resource-based policy to the Amazon SQS queue named “staging-queue”
Xem giải thích
Đáp án
B — Người dùng thực hiện được mọi hành động SQS, nhưng chỉ trên các queue có tên bắt đầu bằng staging-queue.
Vì sao đúng
Đọc từng phần của policy:
{
"Effect": "Allow",
"Action": "sqs:*", ← MỌI hành động SQS
"Resource": "arn:aws:sqs:*:513246782345:staging-queue*" ← queue khớp mẫu
}
| Phần | Ý nghĩa |
|---|---|
"Action": "sqs:*" |
tất cả API của SQS: SendMessage, ReceiveMessage, DeleteQueue, CreateQueue… |
arn:aws:sqs: |
dịch vụ SQS |
* (vị trí Region) |
mọi Region |
513246782345 |
ID tài khoản sở hữu queue |
staging-queue* |
tiền tố — dấu * cuối khớp mọi hậu tố |
Nên staging-queue, staging-queue-1, staging-queue-orders đều khớp; còn prod-queue hay my-staging-queue thì không (* ở cuối chỉ mở rộng về phía sau).
Vì sao các phương án khác sai
- A. "Chỉ tạo được queue tên
staging-queue" — quá hẹp về hành động (policy chosqs:*, không riêngCreateQueue) và quá hẹp về tài nguyên (mẫu có*nên khớp nhiều tên, không chỉ một). Phương án này mô tả một tập con rất nhỏ của quyền thực tế. - C. "Được cấp quyền truy cập chéo tài khoản từ tài khoản 513246782345" — hiểu ngược. Đây là identity policy gắn vào một IAM user; số tài khoản trong ARN chỉ nói queue nằm ở tài khoản nào. Truy cập chéo tài khoản còn cần resource policy của queue ở phía bên kia cho phép — mà policy này không phải thứ đó.
- D. "Áp được resource-based policy lên queue" — quá hẹp. Đúng là
sqs:*bao gồmsqs:SetQueueAttributes(dùng để đặt queue policy), nhưng đó chỉ là một trong hàng chục hành động được cấp. Mô tả này bỏ sót phần lớn nội dung policy.
Ghi nhớ
Cấu trúc ARN của SQS: arn:aws:sqs:<region>:<account-id>:<ten-queue>.
Vài lưu ý về ký tự đại diện trong IAM:
*khớp không hoặc nhiều ký tự bất kỳ?khớp đúng một ký tựDenyluôn thắng mọiAllow, bất kể thứ tự- Với truy cập chéo tài khoản, phải có cả hai vế: identity policy bên gọi và resource policy bên nhận
A Developer has created the code for a Lambda function saved the code in a file named lambda_function.py. He has also created a template that named template.yaml. The following code is included in the template file:
- AWSTemplateFormatVersion: '2010-09-09'
- Transform: 'AWS::Serverless-2016-10-31'
- Resources:
- microservicehttpendpointpython3:
- Type: 'AWS::Serverless::Function'
- Properties:
- Handler: lambda_function.lambda_handler
- CodeUri: .
What commands can the Developer use to prepare and then deploy this template? (Select TWO.)
-
A
Run
aws serverless packageand thenaws serverless deploy -
B
Run
aws cloudformation compile and thenaws cloudformation deploy -
C
Run
aws cloudformationpackage and thenaws cloudformation deploy -
D
Run
sam buildand thensam package -
E
Run
sam packageand thensam deploy
Xem giải thích
Đáp án
C và E.
- C —
aws cloudformation packagerồiaws cloudformation deploy - E —
sam packagerồisam deploy
Vì sao đúng
Template dùng transform AWS::Serverless-2016-10-31 với CodeUri: . — trỏ vào thư mục cục bộ. CloudFormation không đọc được đường dẫn cục bộ, nên quy trình luôn có hai bước:
- Package — nén mã, tải lên S3, sinh template mới với
CodeUrilà URI S3 - Deploy — tạo hoặc cập nhật stack từ template đã đóng gói
Và có hai bộ lệnh tương đương để làm việc đó:
# Cách 1 — AWS CLI (phương án C)
aws cloudformation package --template-file template.yaml \
--s3-bucket kho-artifact --output-template-file packaged.yaml
aws cloudformation deploy --template-file packaged.yaml --stack-name ung-dung
# Cách 2 — SAM CLI (phương án E)
sam package --template-file template.yaml --s3-bucket kho-artifact \
--output-template-file packaged.yaml
sam deploy --template-file packaged.yaml --stack-name ung-dung
sam package và sam deploy thực chất là lớp bọc mỏng quanh chính hai lệnh CloudFormation kia — nên cả hai đều đúng, và đó là lý do câu hỏi có hai đáp án.
Vì sao các phương án khác sai
- A.
aws serverless package/aws serverless deploy— namespaceaws serverlesskhông tồn tại trong AWS CLI. Công cụ chuyên cho SAM là chương trình riêng tênsam. - B.
aws cloudformation compile— lệnh này không có. AWS CLI cho CloudFormation không cócompile. - D.
sam buildrồisam package— cả hai lệnh đều có thật, nhưng dãy này thiếu bước deploy.sam buildbiên dịch phụ thuộc,sam packagetải lên S3 — xong rồi vẫn chưa có gì được triển khai. Đây là bẫy tinh vi nhất: đúng lệnh, thiếu bước cuối.
Ghi nhớ
Quy trình SAM đầy đủ:
sam build → biên dịch mã và phụ thuộc (tuỳ chọn với runtime thông dịch)
sam package → nén + tải lên S3 + sinh template mới (= aws cloudformation package)
sam deploy → tạo/cập nhật stack (= aws cloudformation deploy)
Trong thực tế thường chỉ cần sam deploy --guided — nó gộp package và deploy, đồng thời lưu cấu hình vào samconfig.toml cho các lần sau.
Based on the following AWS CLI command the resulting output, what has happened here?
- $ aws lambda invoke --function-name MyFunction --invocation-type Event --payload ewogICJrZXkxIjogInZhbHVlMSIsCiAgImtleTIiOiAidmFsdWUyIiwKICAia2V5MyI6ICJ2YWx1ZTMiCn0= response.json
- {
- "StatusCode": 202
- }
-
A
An AWS Lambda function has been invoked asynchronously and has not completed successfully
-
B
An AWS Lambda function has been invoked synchronously and has not completed successfully
-
C
An AWS Lambda function has been invoked synchronously and has completed successfully
-
D
An AWS Lambda function has been invoked asynchronously and has completed successfully
Xem giải thích
Đáp án
D — Hàm Lambda đã được gọi bất đồng bộ và đã hoàn tất thành công việc tiếp nhận.
Vì sao đúng
Hai manh mối trong lệnh và kết quả:
Manh mối 1 — --invocation-type Event. Đây là cờ quyết định kiểu gọi:
--invocation-type |
Kiểu | Ý nghĩa |
|---|---|---|
RequestResponse (mặc định) |
đồng bộ | chờ hàm chạy xong và trả kết quả |
Event |
bất đồng bộ | đưa vào hàng đợi rồi trả về ngay |
DryRun |
kiểm tra | chỉ xác thực quyền, không chạy |
Manh mối 2 — StatusCode: 202. Mã HTTP 202 là Accepted — "đã nhận yêu cầu, sẽ xử lý". Đây chính là mã trả về của lời gọi bất đồng bộ thành công.
Cần hiểu chính xác "thành công" ở đây nghĩa là gì: 202 chỉ xác nhận Lambda đã nhận và xếp sự kiện vào hàng đợi, không nói gì về việc mã trong hàm chạy đúng hay sai. Kết quả thật phải xem trong CloudWatch Logs, hoặc cấu hình destination / DLQ để bắt lỗi.
Vì sao các phương án khác sai
- A. "Bất đồng bộ và chưa hoàn tất thành công" — đúng kiểu gọi nhưng sai kết luận: 202 là mã thành công. Nếu lời gọi bị từ chối thì sẽ là 4xx (
403thiếu quyền,429bị throttle) hoặc 5xx. - B và C. "Đồng bộ…" — sai kiểu gọi. Cờ
--invocation-type Eventnói rõ đây là bất đồng bộ; lời gọi đồng bộ trả về 200, không phải 202.
Ghi nhớ
| Mã | Kiểu gọi | Nghĩa |
|---|---|---|
| 200 | đồng bộ | hàm chạy xong, kết quả nằm trong tệp output |
| 202 | bất đồng bộ | đã nhận và xếp hàng |
| 204 | DryRun | chỉ kiểm tra quyền |
| 4xx / 5xx | — | lỗi ở tầng lời gọi |
Và nhớ hai đặc điểm chỉ có ở lời gọi bất đồng bộ: Lambda tự thử lại 2 lần khi hàm lỗi, và có thể cấu hình DLQ hoặc on-failure destination để giữ lại sự kiện hỏng.
A Developer recently created an Amazon DynamoDB table. The table has the following configuration:

The Developer attempted to add two items for userid “user0001” with unique timestamps and received an error for the second item stating: “The conditional request failed”.
What MUST the Developer do to resolve the issue?
-
A
Use the SDK to add the items
-
B
Update the table with a primary sort key for the timestamp attribute
-
C
Recreate the table with a composite key consisting of userid and timestamp
-
D
Add a local secondary index (LSI) for the timestamp attribute
Xem giải thích
Đáp án
C — Tạo lại bảng với khoá phức hợp (composite key) gồm userid và timestamp.
Vì sao đúng
Cấu hình bảng (nhìn thấy trong ảnh) cho biết:
- Primary partition key:
userid(String) - Primary sort key:
-(không có)
Đây là khoá đơn giản (simple primary key), và với loại khoá này DynamoDB có một quy tắc cứng: partition key phải là duy nhất trên toàn bảng. Ghi item thứ hai với userid = "user0001" sẽ ghi đè item cũ, hoặc — nếu dùng ConditionExpression: attribute_not_exists(userid) — trả về đúng lỗi trong đề: "The conditional request failed".
Muốn nhiều item cùng một userid thì bắt buộc phải có khoá phức hợp:
| Khoá đơn giản | Khoá phức hợp | |
|---|---|---|
| Thành phần | partition key | partition key + sort key |
| Ràng buộc duy nhất | userid |
cặp (userid, timestamp) |
Nhiều item cùng userid |
❌ | ✅ |
Và điểm đau đớn: không đổi được lược đồ khoá của bảng đã tồn tại. Partition key và sort key là bất biến. Phải tạo bảng mới rồi di trú dữ liệu sang.
Vì sao các phương án khác sai
- B. "Cập nhật bảng để thêm primary sort key" — bẫy chính. Nghe rất hợp lý, nhưng DynamoDB không cho sửa lược đồ khoá sau khi tạo bảng.
UpdateTableđổi được throughput, thêm/bớt GSI, bật stream — nhưng không đổi được khoá chính. - D. Thêm LSI cho
timestamp— hai lỗi. Thứ nhất, LSI chỉ tạo được lúc tạo bảng. Thứ hai, và quan trọng hơn: index không thay đổi ràng buộc duy nhất của bảng gốc —useridvẫn phải duy nhất, nên item thứ hai vẫn bị từ chối. - A. "Dùng SDK thay vì Console" — công cụ không liên quan gì. Ràng buộc duy nhất của khoá chính được thực thi ở tầng dịch vụ; SDK, CLI hay Console đều nhận cùng một lỗi.
Ghi nhớ
| Thay đổi được sau khi tạo bảng | Không thay đổi được |
|---|---|
| Throughput / billing mode | Partition key |
| Thêm hoặc xoá GSI | Sort key |
| Bật/tắt stream, TTL, PITR | LSI (chỉ tạo lúc đầu) |
Bài học lớn hơn: thiết kế khoá trong DynamoDB là quyết định gần như không thể đảo ngược. Nếu có bất kỳ khả năng nào cần nhiều item cho cùng một thực thể, hãy khai sort key ngay từ đầu.
A Developer needs to access AWS CodeCommit over SSH. The SSH keys configured to access AWS CodeCommit are tied to a user with the following permissions:
- {
- "version": "2012-10-17"
- "Statement": [
- {
- "Effect": "Allow",
- "Action": [
- "codecommit:BatchGetRepositories",
- "codecommit:Get*"
- "codecommit:List*",
- "codecommit:GitPull"
- ],
- "Resource": "*"
- }
- ]
- }
The Developer needs to create/delete branches.
Which specific IAM permissions need to be added based on the principle of least privilege?
-
A
“
codecommit:Put*:” -
B
“
codecommit:*” -
C
“
codecommit:CreateBranch” and “codecommit:DeleteBranch” -
D
“
codecommit:Update*”
Xem giải thích
Đáp án
C — Thêm đúng hai quyền codecommit:CreateBranch và codecommit:DeleteBranch.
Vì sao đúng
Đề nói rõ tiêu chí: nguyên tắc đặc quyền tối thiểu. Nghĩa là cấp chính xác những gì cần, không hơn.
Policy hiện tại có:
"Action": ["codecommit:BatchGetRepositories", "codecommit:Get*",
"codecommit:List*", "codecommit:GitPull"]
Toàn bộ là quyền đọc. Việc cần thêm là tạo và xoá nhánh, và AWS có sẵn đúng hai hành động mang tên đó — nên đáp án tối thiểu chính là hai hành động đó, không gì khác.
Vì sao các phương án khác sai
- B.
codecommit:*— cấp toàn quyền trên CodeCommit, bao gồm cảDeleteRepository,PutRepositoryTriggers,UpdateDefaultBranch, quản lý pull request… Vi phạm đặc quyền tối thiểu ở mức nặng nhất trong bốn phương án. - A.
codecommit:Put*— khớpPutFile,PutRepositoryTriggers,PutCommentReactionvà nhiều hành động khác, nhưng không khớpCreateBranchhayDeleteBranch(chúng bắt đầu bằngCreatevàDelete). Vừa cấp thừa quyền, vừa không giải quyết được việc cần làm. - D.
codecommit:Update*— khớpUpdateRepositoryDescription,UpdateDefaultBranch,UpdatePullRequestTitle… nhưng cũng không khớpCreateBranchvàDeleteBranch. Cùng lỗi với A.
Ghi nhớ
Vài lưu ý thực dụng khi làm việc với quyền CodeCommit:
- Truy cập qua SSH hay HTTPS đều dùng cùng bộ quyền IAM; khoá SSH chỉ thay cho mật khẩu ở khâu xác thực.
codecommit:GitPullvàcodecommit:GitPushlà hai quyền riêng, kiểm soát thao tác Git thật; các quyềnGet*/List*là cho API.- Muốn chặt hơn nữa, dùng điều kiện
codecommit:Referencesđể giới hạn theo tên nhánh:{"Effect": "Deny", "Action": "codecommit:GitPush", "Resource": "*", "Condition": {"StringEqualsIfExists": {"codecommit:References": ["refs/heads/main"]}}}
Nguyên tắc chung khi đề hỏi "least privilege": luôn chọn phương án liệt kê đúng tên hành động cần dùng, không bao giờ chọn phương án có ký tự đại diện.
A Developer has created a task definition that includes the following JSON code:
- "placementConstraints": [
- {
- "expression": "task:group == databases",
- "type": "memberOf"
- }
- ]
What will be the effect for tasks using this task definition?
-
A
They will be placed on container instances in the “databases” task group
-
B
They will become members of a task group called “databases”
-
C
They will not be placed on container instances in the “databases” task group
-
D
They will not be allowed to run unless they have the “databases” tag assigned
Xem giải thích
Đáp án
A — Task sẽ được đặt trên các container instance thuộc task group "databases".
Vì sao đúng
Phân tích biểu thức:
"placementConstraints": [
{ "expression": "task:group == databases", "type": "memberOf" }
]
| Phần | Ý nghĩa |
|---|---|
type: memberOf |
chỉ đặt task ở nơi thoả biểu thức |
task:group |
thuộc tính task group |
== databases |
bằng chuỗi "databases" |
Đọc trọn vẹn: chỉ đặt task này lên container instance đang chạy task thuộc group "databases".
Đây là cách gom các task liên quan lại gần nhau — hữu ích khi chúng cần chia sẻ dữ liệu cục bộ hoặc cần độ trễ mạng giữa các task ở mức thấp nhất.
Task group là gì: một nhãn tuỳ ý bạn gán cho task khi chạy nó (--group databases). Mặc định, task chạy như một phần của service thuộc group service:<ten-service>.
Vì sao các phương án khác sai
- B. "Chúng sẽ trở thành thành viên của task group
databases" — nhầm chiều hoàn toàn. Constraint là điều kiện lọc nơi đặt, không phải lệnh gán nhãn. Muốn task thuộc một group thì khai--grouplúcrun-task, không khai trongplacementConstraints. - C. "Chúng sẽ KHÔNG được đặt trên instance thuộc group
databases" — đảo ngược ý nghĩa củamemberOf. Muốn diễn đạt phủ định thì viếttask:group != databases. - D. "Không được chạy trừ khi có tag
databases" — nhầmtask:groupvới tag của tài nguyên. Tag của instance được tham chiếu bằng cú phápattribute:<ten>;task:grouplà một thuộc tính riêng của ECS, chỉ về task group.
Ghi nhớ
Hai loại placement constraint của ECS: | Type | Nghĩa | |---|---| | memberOf | chỉ đặt ở nơi thoả biểu thức | | distinctInstance | mỗi instance tối đa một task của task này |
Các toán tử trong biểu thức: ==, !=, >, <, in, not_in, =~ (khớp biểu thức chính quy), và các toán tử logic and, or.
Và nhớ phân biệt: constraint = bắt buộc/cấm; strategy = ưu tiên. Constraint không thoả được thì task không chạy; strategy chỉ ảnh hưởng thứ tự ưu tiên.
Based on the following AWS CLI command the resulting output, what has happened here?
- $ aws lambda invoke --function-name MyFunction --payload ewogICJrZXkxIjogInZhbHVlMSIsCiAgImtleTIiOiAidmFsdWUyIiwKICAia2V5MyI6ICJ2YWx1ZTMiCn0= response.json
- {
- "StatusCode": 200
- }
-
A
An AWS Lambda function has been invoked asynchronously and has completed successfully
-
B
An AWS Lambda function has been invoked asynchronously and has not completed successfully
-
C
An AWS Lambda function has been invoked synchronously and has completed successfully
-
D
An AWS Lambda function has been invoked synchronously and has not completed successfully
Xem giải thích
Đáp án
C — Hàm Lambda được gọi đồng bộ và đã hoàn tất thành công.
Vì sao đúng
Hai manh mối:
Manh mối 1 — không có --invocation-type. Khi bỏ trống, AWS CLI dùng giá trị mặc định là RequestResponse, tức là gọi đồng bộ: CLI chờ hàm chạy xong và nhận kết quả trả về.
Manh mối 2 — StatusCode: 200. Với lời gọi đồng bộ, 200 = OK: hàm đã chạy và trả về phản hồi. Nội dung phản hồi nằm trong tệp response.json.
Một điểm tinh tế cần biết: 200 nghĩa là lời gọi thành công, không hẳn nghĩa là mã trong hàm chạy không lỗi. Nếu hàm ném ngoại lệ, bạn vẫn nhận 200 nhưng kèm trường FunctionError: "Unhandled" trong phản hồi, và chi tiết lỗi nằm trong tệp output. Đề chỉ hiển thị StatusCode, và với thông tin đó thì lời gọi là thành công.
So sánh trực tiếp với câu trước trong bộ đề này (#4991):
# Bất đồng bộ → 202
aws lambda invoke --function-name MyFunction --invocation-type Event --payload ... response.json
# Đồng bộ (mặc định) → 200
aws lambda invoke --function-name MyFunction --payload ... response.json
Vì sao các phương án khác sai
- A và B. "Bất đồng bộ…" — bất đồng bộ đòi cờ
--invocation-type Event, mà lệnh trong đề không có. Và bất đồng bộ trả về 202, không phải 200. - D. "Đồng bộ và chưa hoàn tất thành công" — đúng kiểu gọi nhưng sai kết luận: 200 là mã thành công. Lời gọi thất bại ở tầng dịch vụ sẽ trả 4xx hoặc 5xx.
Ghi nhớ
Đồng bộ (RequestResponse) |
Bất đồng bộ (Event) |
|
|---|---|---|
| Mã trả về | 200 | 202 |
| Chờ kết quả | có | không |
| Tự thử lại khi lỗi | không | 2 lần |
| DLQ / destination | không áp dụng | có |
| Ai dùng | API Gateway, ALB, gọi trực tiếp | S3, SNS, EventBridge |
Và nhớ: FunctionError mới là trường cho biết mã trong hàm có lỗi hay không — StatusCode chỉ nói về lời gọi.