From ccf816332d23f2381964db77e1be888b1bd91077 Mon Sep 17 00:00:00 2001 From: Van Hoang Kha Date: Wed, 9 Feb 2022 18:22:04 +0700 Subject: [PATCH] Update README.md --- README.md | 1266 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1266 insertions(+) diff --git a/README.md b/README.md index ae8c169..a9245e4 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,1269 @@

III.BẮT ĐẦU VỚI AWS SDK

IV.DỌN DẸP TÀI NGUYÊN

+ +

I.GIỚI THIỆU

+ +Amazon DynamoDB là một dịch vụ cơ sở dữ liệu NoSQL được quản lý hoàn toàn, cung cấp hiệu suất nhanh và có thể dự đoán được với khả năng mở rộng liền mạch. DynamoDB cho phép giảm bớt gánh nặng quản trị của việc vận hành và mở rộng cơ sở dữ liệu phân tán, cung cấp phần cứng, thiết lập và cấu hình, sao chép, vá lỗi phần mềm hoặc mở rộng cụm. DynamoDB cũng cung cấp mã hóa ở trạng thái nghỉ. + +- DynamoDB tạo các bảng cơ sở dữ liệu có thể lưu trữ và truy xuất bất kỳ lượng dữ liệu nào và phục vụ bất kỳ mức lưu lượng yêu cầu nào. Có thể tăng hoặc giảm quy mô công suất thông qua bảng của mình mà không có thời gian chết hoặc giảm hiệu suất. + +- DynamoDB cung cấp khả năng sao lưu theo yêu cầu. Nó cho phép bạn tạo bản sao lưu đầy đủ các bảng để lưu giữ và lưu trữ lâu dài cho các nhu cầu tuân thủ quy định. + +- Có thể tạo bản sao lưu theo yêu cầu và bật khôi phục tại thời điểm cho các bảng Amazon DynamoDB. Khôi phục theo thời gian giúp bảo vệ bảng khỏi các thao tác ghi hoặc xóa ngẫu nhiên. Với khôi phục theo thời gian, có thể khôi phục bảng về bất kỳ thời điểm nào trong 35 ngày qua. + +- DynamoDB cho phép tự động xóa các mục đã hết hạn khỏi bảng giúp giảm mức sử dụng bộ nhớ và chi phí lưu trữ dữ liệu không còn phù hợp. + +

1.1 Các thành phần cốt lõi của Amazon DynamoDB

+ + +- Tables - Tương tự như các hệ thống cơ sở dữ liệu khác, DynamoDB lưu trữ dữ liệu trong bảng. Table là một tập hợp dữ liệu. + +- Items - Mỗi bảng chứa không hoặc nhiều mục. Các mục trong DynamoDB theo nhiều cách tương tự với hàng, bản ghi hoặc bộ dữ liệu trong các hệ thống cơ sở dữ liệu khác. Trong DynamoDB, không có giới hạn về số lượng mục bạn có thể lưu trữ trong một bảng. + +- Attributes - Mỗi mục bao gồm một hoặc nhiều thuộc tính. Attributes là một phần tử dữ liệu cơ bản, không cần phải chia nhỏ thêm nữa. Các thuộc tính trong DynamoDB theo nhiều cách tương tự với các trường hoặc cột trong các hệ thống cơ sở dữ liệu khác. + +

1.2 Primary Key

+ +- Khi bạn tạo một bảng, ngoài tên bảng, bạn phải chỉ định primary key của bảng. + +- Primary key xác định duy nhất từng mục trong bảng, do đó không có hai mục nào có thể có cùng một khóa. + +- DynamoDB hỗ trợ hai loại primary key khác nhau: + - Partition key + - Composite primary key + +

1.2 a. Partition key

+ +- Một khóa chính đơn giản, bao gồm một thuộc tính được gọi là khóa phân vùng. + +- DynamoDB sử dụng giá trị của khóa phân vùng làm đầu vào cho hàm băm bên trong. Đầu ra từ hàm băm xác định phân vùng (bộ nhớ vật lý bên trong DynamoDB) mà mục sẽ được lưu trữ. + +- Trong bảng chỉ có khóa phân vùng, không có hai mục nào có thể có cùng giá trị khóa phân vùng. + +

1.2.b Composite primary key

+ +- Thuộc tính đầu tiên là partition key và thuộc tính thứ hai là sort key. + +- DynamoDB sử dụng giá trị partition key làm đầu vào cho hàm băm bên trong. Đầu ra từ hàm băm xác định phân vùng (bộ nhớ vật lý bên trong DynamoDB) mà mục sẽ được lưu trữ. Tất cả các mục có cùng giá trị partition key được lưu trữ cùng nhau, theo thứ tự được sắp xếp theo giá trị sort key. + +- Trong bảng có khóa phân vùng và khóa sắp xếp, nhiều mục có thể có cùng giá trị partition key. Tuy nhiên, các mục đó phải có các giá trị sort key khác nhau. + +- Composite primary key giúp bạn linh hoạt hơn khi truy vấn dữ liệu. + +

1.3 Secondary Indexes

+ +- Bạn có thể tạo một hoặc nhiều secondary index trên một bảng. + +- Secondary index cho phép truy vấn dữ liệu trong bảng bằng khóa thay thế, ngoài các truy vấn đối với khóa chính. DynamoDB không yêu cầu sử dụng các chỉ mục, nhưng chúng giúp các ứng dụng của bạn linh hoạt hơn khi truy vấn dữ liệu. Sau khi tạo secondary index trên bảng, bạn có thể đọc dữ liệu từ chỉ mục theo cách giống như cách bạn làm từ bảng. + +- DynamoDB hỗ trợ hai loại chỉ mục: + - Global secondary index
- Chỉ mục có khóa phân vùng và khóa sắp xếp có thể khác với các chỉ mục trên bảng. + + - Local secondary index
- Chỉ mục có cùng khóa phân vùng với bảng nhưng có khóa sắp xếp khác. + +- Mỗi bảng trong DynamoDB có hạn ngạch 20 chỉ mục phụ toàn cục (hạn ngạch mặc định) và 5 chỉ mục phụ cục bộ. + +

1.4 Quy tắc đặt tên và kiểu dữ liệu

+ +

1.4.a Quy tắc đặt tên

+ +- Các bảng, thuộc tính và các đối tượng khác trong DynamoDB phải có tên. + +- Sau đây là các quy tắc đặt tên cho DynamoDB: + + - Tất cả các tên phải được mã hóa bằng UTF-8 và có phân biệt chữ hoa chữ thường. + + - Tên bảng và tên chỉ mục phải dài từ 3 đến 255 ký tự và chỉ được chứa các ký tự sau: + - a-z + - A-Z + - 0-9 + - _(gạch dưới) + - -(gạch ngang) + - . (dấu chấm) + +- Tên thuộc tính phải dài ít nhất một ký tự, nhưng không dài hơn 64 KB. + +- Sau đây là các trường hợp ngoại lệ. Các tên thuộc tính này không được dài quá 255 ký tự: + + - Tên khóa của phân vùng chỉ mục phụ. + + - Chỉ mục phụ sắp xếp các tên khóa. + + - Tên của bất kỳ thuộc tính dự kiến ​​nào do người dùng chỉ định (chỉ áp dụng cho các chỉ mục phụ cục bộ). + +

1.4.b Kiểu dữ liệu

+DynamoDB hỗ trợ nhiều kiểu dữ liệu khác nhau cho các thuộc tính trong bảng. Chúng có thể được phân loại như sau: + +- Các kiểu vô hướng
- Một kiểu vô hướng có thể biểu diễn chính xác một giá trị. Các kiểu vô hướng là số, chuỗi, nhị phân, Boolean và null. + +- Loại tài liệu
- Một loại tài liệu có thể đại diện cho một cấu trúc phức tạp với các thuộc tính lồng nhau, chẳng hạn như bạn sẽ tìm thấy trong tài liệu JSON. Các loại tài liệu là danh sách và bản đồ. + +- Loại tập hợp
- Một loại tập hợp có thể đại diện cho nhiều giá trị vô hướng. Các loại tập hợp là tập hợp chuỗi, tập hợp số và tập hợp nhị phân. + +

1.5 Read Consistency

+ +

1.5.a Eventually Consistent Reads

+ +- Khi bạn đọc dữ liệu từ bảng DynamoDB, phản hồi có thể không phản ánh kết quả của một thao tác ghi đã hoàn thành gần đây. + +- Phản hồi có thể bao gồm một số dữ liệu cũ. + +- Nếu bạn lặp lại yêu cầu đọc của mình sau một thời gian ngắn, phản hồi sẽ trả về dữ liệu mới nhất. + +

1.5.b Strongly Consistent Reads

+ +Khi bạn yêu cầu đọc nhất quán mạnh mẽ, DynamoDB trả về phản hồi với dữ liệu cập nhật nhất, phản ánh các cập nhật từ tất cả các hoạt động ghi trước đó đã thành công. Tuy nhiên, tính nhất quán này đi kèm với một số nhược điểm: + +- Việc đọc nhất quán mạnh có thể không khả dụng nếu có sự cố mạng hoặc ngừng hoạt động. Trong trường hợp này, DynamoDB có thể trả về lỗi máy chủ (HTTP 500). + +- Các lần đọc nhất quán mạnh có thể có độ trễ cao hơn các lần đọc nhất quán cuối cùng. + +- Các chỉ số phụ toàn cầu không được hỗ trợ đọc nhất quán. + +- Các lần đọc nhất quán mạnh sử dụng nhiều dung lượng thông lượng hơn so với các lần đọc nhất quán cuối cùng. + +

1.6 Read/Write Capacity Mode

+ +

1.6.a On-Demand Mode

+Amazon DynamoDB on-demand là một tùy chọn thanh toán linh hoạt có khả năng phục vụ hàng nghìn yêu cầu mỗi giây mà không cần lập kế hoạch dung lượng. DynamoDB theo yêu cầu cung cấp giá trả theo yêu cầu cho các yêu cầu đọc và ghi để bạn chỉ trả tiền cho những gì bạn sử dụng. + +Khi bạn chọn chế độ theo yêu cầu, DynamoDB ngay lập tức đáp ứng các khối lượng công việc của bạn khi chúng tăng hoặc giảm đến bất kỳ mức lưu lượng truy cập nào đã đạt được trước đó. Nếu mức lưu lượng của khối lượng công việc đạt đến đỉnh mới, DynamoDB sẽ thích ứng nhanh chóng để đáp ứng khối lượng công việc. Các bảng sử dụng chế độ theo yêu cầu cung cấp cùng độ trễ mili giây một chữ số, cam kết thỏa thuận mức dịch vụ (SLA) và bảo mật mà DynamoDB đã cung cấp. Bạn có thể chọn theo yêu cầu cho cả bảng mới và bảng hiện có và bạn có thể tiếp tục sử dụng các API DynamoDB hiện có mà không cần thay đổi mã. + +Chế độ theo yêu cầu là một lựa chọn tốt nếu bất kỳ điều nào sau đây là đúng: + +- Bạn tạo bảng mới với khối lượng công việc không xác định. + +- Bạn có lưu lượng ứng dụng không thể đoán trước. + +- Bạn chỉ thích dễ dàng thanh toán cho những gì bạn sử dụng. + +

1.6.b Provisioned Mode

+ +Nếu bạn chọn chế độ được cấp phép, bạn chỉ định số lần đọc và ghi mỗi giây mà bạn yêu cầu cho ứng dụng của mình. Bạn có thể sử dụng tính năng tự động chia tỷ lệ để tự động điều chỉnh dung lượng được cung cấp của bảng để đáp ứng với những thay đổi về lưu lượng truy cập. Điều này giúp bạn quản lý việc sử dụng DynamoDB của mình để duy trì bằng hoặc thấp hơn tỷ lệ yêu cầu xác định để có được khả năng dự đoán chi phí. + +Chế độ được cung cấp là một tùy chọn tốt nếu bất kỳ điều nào sau đây là đúng: + +- Bạn có lưu lượng ứng dụng có thể dự đoán được. + +- Bạn chạy các ứng dụng có lưu lượng truy cập nhất quán hoặc tăng dần. + +- Bạn có thể dự báo các yêu cầu về năng lực để kiểm soát chi phí. + + +

II. CHUẨN BỊ

+ +

1.Sử dụng AWS Management Console

+ +

1.1 Tạo Access key cho người dùng IAM

+ +Bước 1: Đăng nhập vào Bảng điều khiển quản lý AWS và mở bảng điều khiển IAM tại https://console.aws.amazon.com/iam/. + +Bước 2: Trong ngăn dẫn hướng, chọn Users. + +Bước 3: Chọn tên của người dùng có khóa truy cập bạn muốn tạo, sau đó chọn tab Security credentials. + +Bước 4: Trong phần Access keys, chọn Create access key. + +Bước 5: Để xem access key mới, hãy chọn Show. Thông tin đăng nhập của bạn sẽ trông giống như sau: + + Access key ID: AKIAIOSFODNN7EXAMPLE + Secret access key: wJalrXUtnFEMI / K7MDENG / bPxRfiCYEXAMPLEKEY`` + +Bước 6: Để tải xuống cặp khóa, hãy chọn Download .csv file. + +Bước 7: Sau khi bạn tải xuống tệp .csv, chọn Close . + +

1.2 Tạo bảng

+Trong bước này, bạn tạo một bảng Music trong Amazon DynamoDB. Bảng có các chi tiết sau: + +- Partition key — Artist + +- Sort key — SongTitle + +Bước 1: Đăng nhập vào Bảng điều khiển quản lý AWS và mở DynamoDB Console tại https://console.aws.amazon.com/dynamodb/. + +Bước 2: Trong ngăn điều hướng ở bên trái của bảng điều khiển, chọn Dashboard. + +Bước 3: Ở phía bên phải của bảng điều khiển, chọn Create Table. + +![Create Table Dashboard!](./images/CreateTableDashboard-1.png "CreateTableDashboard") + +Bước 4: Nhập chi tiết bảng như sau: + +- Đối với Table name, hãy nhập ```Music```. + +- Đối với Partition key, hãy nhập ```Artist```. + +- Nhập SongTitle làm Sort key. + +- Chọn Default settings. + +Bước 5: Chọn Create table để tạo bảng. + +![Create Table Dashboard!](./images/CreateTable-2.png "CreateTableDashboard") + +Kết quả: + +![Create Table Dashboard!](./images/CreateTable-3.png "CreateTableDashboard") + + +

1.3 Ghi dữ liệu

+ +Các bước ghi dữ liệu vào bảng Music(đã tạo ở mục 1.2): + +- Bước 1: Mở bảng DynamoDB console tại https://console.aws.amazon.com/dynamodb/ + +- Bước 2: Trong thanh điều hướng ở bên trái của bảng điều khiển, chọn Tables. + +- Bước 3: Trong danh sách bảng, hãy chọn bảng Music. + +![Write Data Dashboard!](./images/Writedata.png "WriteData") + +- Bước 4: Chọn Explore items + +![Write Data Dashboard!](./images/Writedata-1.png "WriteData") + +- Bước 5: Trong giao diện Items, chọn Create item + + +![Write Data Dashboard!](./images/WriteData-2.png "WriteData") + + +- Bước 6: Chọn Add new attribute, sau đó chọn Number. Tên trường: Awards. + +- Bước 7: Lặp lại bước 6 tạo AlbumTitle với kiểu String. + +- Bước 8: Nhập các giá trị cho các item: + + - Artist, nhập `No One You Know` + + - SongTitle, nhập `Call Me Today` + + - AlbumTitle, nhập `Somewhat Famous` + + - Awards, nhập `1`. + +- Bước 9: Chọn Create item. + +![Write Data Dashboard!](./images/Writedata-3.png "WriteData") + +- Bước 10: Lặp lại bước 8 và tạo một mục khác với các giá trị sau: + + - Artist, nhập `Acme Band`. + + - SongTitle nhập `Happy Day`. + + - AlbumTitle, nhập `Songs About Life`. + + - Awards, nhập `10`. + +- Bước 11: Thực hiện thao tác này một lần nữa để tạo một mục khác có cùng một Artist như bước trước, nhưng các giá trị khác nhau cho các thuộc tính khác: + - Artist, nhập `Acme Band`. + + - SongTitle nhập `PartiQL Rocks`. + + - AlbumTitle, nhập `Another Album Title`. + + - Awards, nhập `8`. + +- Bước 12: Kết quả: + +![Write Data Dashboard!](./images/Writedata-4.png "WriteData") + + +

1.4 Đọc dữ liệu

+ +Các bước đọc dữ liệu từ bảng Music bằng DynamoDB console: + +- Bước 1: Mở DynamoDB console tại https://console.aws.amazon.com/dynamodb/ + +- Bước 2: Trong thanh điều hướng ở bên trái của bảng điều khiển, chọn Tables + +- Bước 3: Chọn bảng Music từ danh sách bảng. + +- Bước 4: Chọn Actions, sau đó chọn Explore item. + +- Bước 5: Chọn Query , sau đó điền Artist (Partition key)`Acme Band` + +- Bước 6: Chọn Run và thu kết quả như hình: + + +![Read Data Dashboard!](./images/Readdata.png "ReadData") + + +

1.5 Cập nhật dữ liệu

+ +Các bước cập nhật dữ liệu bảng Music như sau: + +- Bước 1: Mở bảng DynamoDB console tại https://console.aws.amazon.com/dynamodb/ + +- Bước 2: Trong thanh điều hướng ở bên trái của bảng điều khiển, chọn Tables + +- Bước 3: Chọn bảng Music từ danh sách bảng. + +- Bước 4: Chọn Actions, sau đó chọn Explore item. + +- Bước 5: Chọn item có giá trị ArtistAcme Band và giá trị SongTitleHappy Day. + +- Bước 6: Cập nhật giá trị Album Title thành Album Title Updated, sau đó chọn Save changes . + +![Update Data Dashboard!](./images/update-data.png "UpdateData") + + +

1.6 Truy vấn dữ liệu

+ +Các bước truy vấn dữ liệu bảng Music như sau: + +- Bước 1: Mở bảng DynamoDB console tại https://console.aws.amazon.com/dynamodb/ + +- Bước 2: Trong thanh điều hướng ở bên trái của bảng điều khiển, chọn Tables + +- Bước 3: Chọn bảng Music từ danh sách bảng. + +- Bước 4: Chọn Actions, sau đó chọn Explore item. + +- Bước 5: Chọn Query + +- Bước 6: Nhập chi tiết các key: + + - Đối với Artist (Partition key), nhập Acme Band + + - Đối với SongTitle (Sort key), nhập PartiQL Rocks + +- Bước 7: Chọn Run + + + ![Query Data Dashboard!](./images/Querydata.png "UpdateData") + + + +

1.7 Tạo Global Secondary Index

+ +- Bước 1: Mở bảng DynamoDB console tại https://console.aws.amazon.com/dynamodb/ + +- Bước 2: Trong thanh điều hướng ở bên trái của bảng điều khiển, chọn Tables + +- Bước 3: Chọn bảng Music từ danh sách bảng. + +- Bước 4: Chọn tab Indexes từ bảng Music. + +- Bước 5: Chọn Create index + + ![Create Global Secondary Index!](./images/create-index.png "Create Global Secondary Index") + +- Bước 6: Đối với Partition key , nhập `AlbumTitle`. + +- Bước 7: Đối với Index name, nhập `AlbumTitle-index`. + +- Bước 8: Các mục khác để mặc định và chọn Create index + + ![Create Global Secondary Index!](./images/create-index-2.png "Create Global Secondary Index") + + Kết quả + + ![Create Global Secondary Index!](./images/create-index-3.png "Create Global Secondary Index") + + +

1.8 Truy vấn Global Secondary Index

+ +- Bước 1: Mở bảng DynamoDB console tại https://console.aws.amazon.com/dynamodb/ + +- Bước 2: Trong thanh điều hướng ở bên trái của bảng điều khiển, chọn Tables + +- Bước 3: Chọn bảng Music từ danh sách bảng. + +- Bước 4: Chọn Actions, sau đó chọn Explore item. + +- Bước 5: Chọn Query + +- Bước 6: Trong danh sách thả xuống bên dưới Query, chọn AlbumTitle-index + +- Bước 7: Đối với AlbumTitle , nhập `Somewhat Famous`, rồi chọn Run. + +![Query Global Secondary Index!](./images/query-index.png "Query Global Secondary Index") + +

2.SỬ DỤNG AWS CLOUDSHELL

+ +

2.1 Tạo bảng

+ +Bước 1: Khởi động AWS CloudShell tại https://console.aws.amazon.com/cloudshell/home?region=us-east-1 + +Bước 2: Gõ lệnh ```aws configure``` + +Bước 3: Nhập chi tiết thông tin từ file csv ở phần 2.1: + - AWS Access Key ID + - AWS Secret Access Key + - Default region name + - Default output format: bỏ trống + +![Create Table Dashboard!](./images/CreateTable-4.png "CreateTableDashboard") + + +Bước 4: Để tạo bảng, ta sử dụng lệnh `create-table` . Gõ lệnh: +``` +aws dynamodb create-table \ + --table-name Music \ + --attribute-definitions \ + AttributeName=Artist,AttributeType=S \ + AttributeName=SongTitle,AttributeType=S \ + --key-schema \ + AttributeName=Artist,KeyType=HASH \ + AttributeName=SongTitle,KeyType=RANGE \ + --provisioned-throughput \ + ReadCapacityUnits=10,WriteCapacityUnits=5 \ + --table-class STANDARD + ``` + + + +![Create Table Dashboard!](./images/CreateTable-5.png "CreateTableDashboard") + +Kết quả: +``` +{ + "TableDescription": { + "AttributeDefinitions": [ + { + "AttributeName": "Artist", + "AttributeType": "S" + }, + { + "AttributeName": "SongTitle", + "AttributeType": "S" + } + ], + "TableName": "Music", + "KeySchema": [ + { + "AttributeName": "Artist", + "KeyType": "HASH" + }, + { + "AttributeName": "SongTitle", + "KeyType": "RANGE" + } + ], + "TableStatus": "CREATING", + "CreationDateTime": "2022-02-08T06:15:18.343000+00:00", + "ProvisionedThroughput": { + "NumberOfDecreasesToday": 0, + "ReadCapacityUnits": 10, + "WriteCapacityUnits": 5 + }, + "TableSizeBytes": 0, + "ItemCount": 0, + "TableArn": "arn:aws:dynamodb:us-east-2:089359461550:table/Music", + "TableId": "4b2a1e9a-c223-4b07-a536-c4b85a67df96", + "TableClassSummary": { + "TableClass": "STANDARD" + } + } +} +``` + +Bước 5: Kiểm tra trạng thái bảng: + +- Gõ lệnh: +``` +aws dynamodb describe-table --table-name Music | grep TableStatus +``` + +- Khi DynamoDB hoàn thành việc tạo bảng, giá trị của TableStatus là ACTIVE: `"TableStatus": "ACTIVE",` + +

2.2 Ghi dữ liệu

+ +- Để ghi dữ liệu, sử dụng lệnh `put-item` + +- Sau khi tạo bảng ở bước 2.1, tiếp tục gõ lệnh: + +``` +aws dynamodb put-item \ + --table-name Music \ + --item \ + '{"Artist": {"S": "No One You Know"}, "SongTitle": {"S": "Call Me Today"}, "AlbumTitle": {"S": "Somewhat Famous"}, "Awards": {"N": "1"}}' + +aws dynamodb put-item \ + --table-name Music \ + --item \ + '{"Artist": {"S": "No One You Know"}, "SongTitle": {"S": "Howdy"}, "AlbumTitle": {"S": "Somewhat Famous"}, "Awards": {"N": "2"}}' + +aws dynamodb put-item \ + --table-name Music \ + --item \ + '{"Artist": {"S": "Acme Band"}, "SongTitle": {"S": "Happy Day"}, "AlbumTitle": {"S": "Songs About Life"}, "Awards": {"N": "10"} }' + +aws dynamodb put-item \ + --table-name Music \ + --item \ + '{"Artist": {"S": "Acme Band"}, "SongTitle": {"S": "PartiQL Rocks"}, "AlbumTitle": {"S": "Another Album Title"}, "Awards": {"N": "8"} }' +``` +

2.3 Đọc dữ liệu

+ +- Để đọc dữ liệu, sử dụng lệnh `get-item` và tham số `consistent-read` thể hiện strongly consistent reads. + +- Mặc định của AWS DynamoDB là eventually consistent reads. + +- Gõ lệnh: +``` +aws dynamodb get-item --consistent-read \ + --table-name Music \ + --key '{ "Artist": {"S": "Acme Band"}, "SongTitle": {"S": "Happy Day"}}' +``` + +

2.4 Cập nhật dữ liệu

+ +- Để cập nhật dữ liệu, sử dụng lệnh `update-item` + +- Gõ lệnh: +``` +aws dynamodb update-item \ + --table-name Music \ + --key '{ "Artist": {"S": "Acme Band"}, "SongTitle": {"S": "Happy Day"}}' \ + --update-expression "SET AlbumTitle = :newval" \ + --expression-attribute-values '{":newval":{"S":"Updated Album Title"}}' \ + --return-values ALL_NEW + ``` + +

2.5 Truy vấn dữ liệu

+ +- Để truy vấn dữ liệu từ bảng, sử dụng lệnh `query` và cung cấp partition key. + +- Gõ lệnh: +``` +aws dynamodb query \ + --table-name Music \ + --key-condition-expression "Artist = :name" \ + --expression-attribute-values '{":name":{"S":"Acme Band"}}' + ``` + +

2.6 Tạo Global Secondary Index

+ +- Để tạo Global Secondary Index, sử dụng lệnh `update-table` + +- Gõ lệnh: +``` +aws dynamodb update-table \ + --table-name Music \ + --attribute-definitions AttributeName=AlbumTitle,AttributeType=S \ + --global-secondary-index-updates \ + "[{\"Create\":{\"IndexName\": \"AlbumTitle-index\",\"KeySchema\":[{\"AttributeName\":\"AlbumTitle\",\"KeyType\":\"HASH\"}], \ + \"ProvisionedThroughput\": {\"ReadCapacityUnits\": 10, \"WriteCapacityUnits\": 5 },\"Projection\":{\"ProjectionType\":\"ALL\"}}}]" +``` + +

2.7 Truy vấn Global Secondary Index

+ +- Để truy vấn Global Secondary Index, sử dụng lệnh `query` + +- Gõ lệnh: +``` +aws dynamodb query \ + --table-name Music \ + --index-name AlbumTitle-index \ + --key-condition-expression "AlbumTitle = :name" \ + --expression-attribute-values '{":name":{"S":"Somewhat Famous"}}' + ``` +

III. BẮT ĐẦU VỚI AWS SDK

+ +

1. CHUẨN BỊ

+ +Sử dụng AWS SDK cho Python (Boto3) để viết các chương trình đơn giản nhằm thực hiện các hoạt động Amazon DynamoDB sau: + +- Tạo một bảng được gọi Moviesvà tải dữ liệu mẫu ở định dạng JSON. + +- Thực hiện các thao tác tạo, đọc, cập nhật và xóa trên bảng. + +- Chạy các truy vấn đơn giản. + +

1.1 Cấu hình AWS CLI

+ +- Bước 1: Mở Window Command Prompt, chọn chế độ `Run as administrator` + +- Bước 2: Gõ lệnh `aws configure` + +- Bước 3: Nhập chi tiết thông tin từ file csv ở phần 2.1: + + - AWS Access Key ID + + - AWS Secret Access Key + + - Default region name + + - Default output format: bỏ trống + +- Bước 4: Cài đặt Python 2.6 trở lên. + +- Bước 5: Kiểm tra version python để xác định đã cài đặt thành công bằng lệnh `python --version` + +- Bước 5: Cài đặt thư viện Boto3 bằng lệnh `pip install boto3` + +

1.2 Boto 3: Resource vs Client

+ +

1.2.a Resource

+ +Resource là một phần trừu tượng cấp cao hơn so với các máy khách. Chúng được tạo từ mô tả tài nguyên JSON có trong chính thư viện boto. Ví dụ: đây là định nghĩa tài nguyên cho S3 . + +Tài nguyên cung cấp giao diện hướng đối tượng để tương tác với các dịch vụ AWS khác nhau. Các tài nguyên có thể được khởi tạo như sau: +``` +import boto3 + +s3 = boto3.resource("s3") + +``` + +

1.2.b Client

+ +Client cung cấp giao diện cấp thấp cho dịch vụ AWS. Định nghĩa của chúng được tạo bởi mô tả dịch vụ JSON có trong thư viện botocore . Gói botocore được chia sẻ giữa boto3 cũng như AWS CLI . + +Định nghĩa dịch vụ cho AWS S3 được lưu trữ dưới dạng JSON trong gói botocore . + +Lợi ích chính của việc sử dụng ứng dụng Boto3 Client là: + +- Nó ánh xạ 1: 1 với API dịch vụ AWS thực tế. +- Tất cả các hoạt động dịch vụ AWS được hỗ trợ bởi Client + +Ví dụ: nếu bạn muốn liệt kê tất cả các nhóm S3 trong tài khoản AWS của mình, bạn có thể sử dụng ứng dụng khách S3 như sau: + +``` +import boto3 + +# Retrieve the list of existing buckets +s3 = boto3.client("s3") +response = s3.list_buckets() + +# Output the bucket names +print("Existing buckets:") +for bucket in response['Buckets']: + print(f'{bucket["Name"]}') + +``` + +

2. Bắt đầu phát triển với Python và DynamoDB

+ +

2.1 Tạo bảng

+ +Tạo một bảng có tên Movies. Khóa chính cho bảng bao gồm các thuộc tính sau: + +year – The partition key. AttributeType là N(number). + +title – The sort key. AttributeType là S(string). + +- Bước 1: Tạo file có tên `MoviesCreateTable.py` + +- Bước 2: Sao chép đoạn mã sau và dán vào file `MoviesCreateTable.py` + +``` +import boto3 + + +def create_movie_table(dynamodb=None): + dynamodb = boto3.resource('dynamodb') + table = dynamodb.create_table( + TableName='Movies', + KeySchema=[ + { + 'AttributeName': 'year', + 'KeyType': 'HASH' # Partition key + }, + { + 'AttributeName': 'title', + 'KeyType': 'RANGE' # Sort key + } + ], + AttributeDefinitions=[ + { + 'AttributeName': 'year', + 'AttributeType': 'N' + }, + { + 'AttributeName': 'title', + 'AttributeType': 'S' + }, + + ], + ProvisionedThroughput={ + 'ReadCapacityUnits': 10, + 'WriteCapacityUnits': 10 + } + ) + return table + + +if __name__ == '__main__': + movie_table = create_movie_table() + print("Table status:", movie_table.table_status) + +``` + +- Bước 3: Chạy chương trình bằng Window Command Prompt đã được xác thực và cấu hình ở bước 1.1. Gõ lệnh: +``` +python MoviesCreateTable.py +``` +Trường hợp khác: sử dụng `python "đường dẫn file MoviesCreateTable.py"` + +- Bước 4: Sau khi chạy chương trình trả về `Table status: CREATING` là tạo bảng thành công. +

2.2 Ghi dữ liệu

+ +Thực hiện thêm item vào bảng Movies vừa tạo ở bước 2.1 + +- Bước 1: Tạo file có tên `MoviesItemOps01.py` + +- Bước 2: Sao chép chương trình sau và dán vào file `MoviesItemOps01.py` + +``` +from pprint import pprint +import boto3 + + +def put_movie(title, year, plot, rating, dynamodb=None): + dynamodb = boto3.resource('dynamodb') + table = dynamodb.Table('Movies') + response = table.put_item( + Item={ + 'year': year, + 'title': title, + 'info': { + 'plot': plot, + 'rating': rating + } + } + ) + return response + + +if __name__ == '__main__': + movie_resp = put_movie("The Big New Movie", 2015, + "Nothing happens at all.", 0) + print("Put movie succeeded:") + pprint(movie_resp, sort_dicts=False) + +``` + +- Bước 3: Chạy chương trình bằng Window Command Prompt đã được xác thực và cấu hình ở bước 1.1. Gõ lệnh: + +``` +python MoviesItemOps01.py +``` +Trường hợp khác: sử dụng `python "đường dẫn file MoviesItemOps01.py"` + +- Bước 4: Sau khi chạy chương trình, thu được kết quả: + +``` +Put movie succeeded: +{'ResponseMetadata': {'RequestId': 'U9PQSVRR5PKKDD7NPV0NH91JD7VV4KQNSO5AEMVJF66Q9ASUAAJG', + 'HTTPStatusCode': 200, + 'HTTPHeaders': {'server': 'Server', + 'date': 'Wed, 09 Feb 2022 03:11:45 GMT', + 'content-type': 'application/x-amz-json-1.0', + 'content-length': '2', + 'connection': 'keep-alive', + 'x-amzn-requestid': 'U9PQSVRR5PKKDD7NPV0NH91JD7VV4KQNSO5AEMVJF66Q9ASUAAJG', + 'x-amz-crc32': '2745614147'}, + 'RetryAttempts': 0}} + +``` + +

2.3 Đọc dữ liệu

+ +- Bước 1: Tạo file có tên `MoviesItemOps02.py` + +- Bước 2: Sao chép đoạn mã sau và dán vào file `MoviesItemOps02.py` + +``` +from pprint import pprint +import boto3 +from botocore.exceptions import ClientError + + +def get_movie(title, year, dynamodb=None): + dynamodb = boto3.resource('dynamodb') + table = dynamodb.Table('Movies') + + try: + response = table.get_item(Key={'year': year, 'title': title}) + except ClientError as e: + print(e.response['Error']['Message']) + else: + return response['Item'] + + +if __name__ == '__main__': + movie = get_movie("The Big New Movie", 2015,) + if movie: + print("Get movie succeeded:") + pprint(movie, sort_dicts=False) + +``` +- Bước 3: Chạy chương trình bằng Window Command Prompt đã được xác thực và cấu hình ở bước 1.1. Gõ lệnh: + +``` +python MoviesItemOps02.py +``` +Trường hợp khác: sử dụng `python "đường dẫn file MoviesItemOps02.py"` + +- Bước 4: Sau khi chạy chương trình, thu được kết quả: + +``` +Get movie succeeded: +{'year': Decimal('2015'), + 'info': {'rating': Decimal('0'), 'plot': 'Nothing happens at all.'}, + 'title': 'The Big New Movie'} +``` + +

2.4 Cập nhật dữ liệu

+ +- Bước 1: Tạo file có tên `MoviesItemOps03.py` + +- Bước 2: Sao chép đoạn mã sau và dán vào file `MoviesItemOps03.py` + +``` +from decimal import Decimal +from pprint import pprint +import boto3 + + +def update_movie(title, year, rating, plot, actors, dynamodb=None): + dynamodb = boto3.resource('dynamodb') + table = dynamodb.Table('Movies') + + response = table.update_item( + Key={ + 'year': year, + 'title': title + }, + UpdateExpression="set info.rating=:r, info.plot=:p, info.actors=:a", + ExpressionAttributeValues={ + ':r': Decimal(rating), + ':p': plot, + ':a': actors + }, + ReturnValues="UPDATED_NEW" + ) + return response + + +if __name__ == '__main__': + update_response = update_movie( + "The Big New Movie", 2015, 5.5, "Everything happens all at once.", + ["Larry", "Moe", "Curly"]) + print("Update movie succeeded:") + pprint(update_response, sort_dicts=False) + +``` + +- Bước 3: Chạy chương trình bằng Window Command Prompt đã được xác thực và cấu hình ở bước 1.1. Gõ lệnh: + +``` +python MoviesItemOps03.py +``` +Trường hợp khác: sử dụng `python "đường dẫn file MoviesItemOps03.py"` + +- Bước 4: Sau khi chạy chương trình, thu được kết quả: + +``` +Update movie succeeded: +{'Attributes': {'info': {'actors': ['Larry', 'Moe', 'Curly'], + 'plot': 'Everything happens all at once.', + 'rating': Decimal('5.5')}}, + 'ResponseMetadata': {'RequestId': 'RFMTVB72A6E2J39HBPIK8SHBN7VV4KQNSO5AEMVJF66Q9ASUAAJG', + 'HTTPStatusCode': 200, + 'HTTPHeaders': {'server': 'Server', + 'date': 'Wed, 09 Feb 2022 03:29:15 GMT', + 'content-type': 'application/x-amz-json-1.0', + 'content-length': '156', + 'connection': 'keep-alive', + 'x-amzn-requestid': 'RFMTVB72A6E2J39HBPIK8SHBN7VV4KQNSO5AEMVJF66Q9ASUAAJG', + 'x-amz-crc32': '3767510606'}, + 'RetryAttempts': 0}} + +``` + + +

2.5 Xóa dữ liệu

+ +- Bước 1: Tạo file có tên `MoviesItemOps04.py` + +- Bước 2: Sao chép đoạn mã sau và dán vào file `MoviesItemOps04.py` + +``` +from decimal import Decimal +from pprint import pprint +import boto3 +from botocore.exceptions import ClientError + + +def delete_underrated_movie(title, year, rating, dynamodb=None): + dynamodb = boto3.resource('dynamodb') + table = dynamodb.Table('Movies') + + try: + response = table.delete_item( + Key={ + 'year': year, + 'title': title + } + ) + except ClientError as e: + if e.response['Error']['Code'] == "ConditionalCheckFailedException": + print(e.response['Error']['Message']) + else: + raise + else: + return response + + +if __name__ == '__main__': + print("Attempting a conditional delete...") + delete_response = delete_underrated_movie("The Big New Movie", 2015, 5) + if delete_response: + print("Delete movie succeeded:") + pprint(delete_response, sort_dicts=False) + +``` +- Bước 3: Chạy chương trình bằng Window Command Prompt đã được xác thực và cấu hình ở bước 1.1. Gõ lệnh: + +``` +python MoviesItemOps03.py +``` +Trường hợp khác: sử dụng `python "đường dẫn file MoviesItemOps03.py"` + +- Bước 4: Sau khi chạy chương trình, thu được kết quả: + +``` +Attempting a conditional delete... +Delete movie succeeded: +{'ResponseMetadata': {'RequestId': 'HHA9MQ2U0UP1CL7CECBAAQRMMVVV4KQNSO5AEMVJF66Q9ASUAAJG', + 'HTTPStatusCode': 200, + 'HTTPHeaders': {'server': 'Server', + 'date': 'Wed, 09 Feb 2022 03:39:32 GMT', + 'content-type': 'application/x-amz-json-1.0', + 'content-length': '2', + 'connection': 'keep-alive', + 'x-amzn-requestid': 'HHA9MQ2U0UP1CL7CECBAAQRMMVVV4KQNSO5AEMVJF66Q9ASUAAJG', + 'x-amz-crc32': '2745614147'}, + 'RetryAttempts': 0}} +``` + + +

2.6 Tải dữ liệu mẫu

+ +- Bước 1: Tải xuống dữ liệu mẫu moviedata.zip + +- Bước 2: Giải nén tệp dữ liệu ( moviedata.json) từ kho lưu trữ. + +- Bước 3: Sao chép tệp moviedata.json vào thư mục hiện tại của bạn. + +- Bước 4: Tạo file có tên `MoviesLoadData.py` + +- Bước 5: Sao chép đoạn mã sau và dán vào file `MoviesLoadData.py` + +``` +from decimal import Decimal +import json +import boto3 + + +def load_movies(movies, dynamodb=None): + dynamodb = boto3.resource('dynamodb') + table = dynamodb.Table('Movies') + for movie in movies: + year = int(movie['year']) + title = movie['title'] + print("Adding movie:", year, title) + table.put_item(Item=movie) + + +if __name__ == '__main__': + with open("moviedata.json") as json_file: + movie_list = json.load(json_file, parse_float=Decimal) + load_movies(movie_list) + +``` +- Bước 3: Chạy chương trình bằng Window Command Prompt đã được xác thực và cấu hình ở bước 1.1. Gõ lệnh: + +``` +python MoviesLoadData.py +``` +Trường hợp khác: sử dụng `python "đường dẫn file MoviesLoadData.py"` + +- Bước 4: Sau khi chạy chương trình, thu được kết quả: +``` +Adding movie: 2013 Insidious: Chapter 2 +Adding movie: 2013 World War Z +Adding movie: 2014 X-Men: Days of Future Past +Adding movie: 2014 Transformers: Age of Extinction +Adding movie: 2013 Now You See Me +Adding movie: 2013 Gravity +Adding movie: 2013 We're the Millers +Adding movie: 2013 Riddick +Adding movie: 2013 The Family +Adding movie: 2013 Star Trek Into Darkness +Adding movie: 2013 After Earth +Adding movie: 2013 The Great Gatsby +Adding movie: 2014 Divergent +Adding movie: 2013 We Are What We Are +Adding movie: 2013 Iron Man 3 +Adding movie: 2014 The Amazing Spider-Man 2 +Adding movie: 2013 Curse of Chucky +Adding movie: 2013 The Conjuring +Adding movie: 2013 Oldboy +Adding movie: 2013 Escape Plan +Adding movie: 2013 Elysium +Adding movie: 2013 Cloudy with a +``` +Lưu ý: Đúng đường dẫn file `moviedata.json` + + +

2.7 Truy vấn dữ liệu

+ +Truy xuất tất cả các phim được phát hành vào năm 1985 từ dữ liệu mẫu được tải lên ở mục 2.6 + + +- Bước 1: Tạo file có tên `MoviesQuery01.py` + +- Bước 2: Sao chép đoạn mã sau và dán vào file `MoviesQuery01.py` +``` +import boto3 +from boto3.dynamodb.conditions import Key + + +def query_movies(year, dynamodb=None): + dynamodb = boto3.resource('dynamodb') + table = dynamodb.Table('Movies') + response = table.query( + KeyConditionExpression=Key('year').eq(year) + ) + return response['Items'] + + +if __name__ == '__main__': + query_year = 1985 + print(f"Movies from {query_year}") + movies = query_movies(query_year) + for movie in movies: + print(movie['year'], ":", movie['title']) + +``` +- Bước 3: Chạy chương trình bằng Window Command Prompt đã được xác thực và cấu hình ở bước 1.1. Gõ lệnh: + +``` +python MoviesQuery01.py +``` +Trường hợp khác: sử dụng `python "đường dẫn file MoviesQuery01.py"` + +- Bước 4: Sau khi chạy chương trình, thu được kết quả: + +``` +Movies from 1985 +1985 : A Nightmare on Elm Street Part 2: Freddy's Revenge +1985 : A Room with a View +1985 : A View to a Kill +1985 : Back to the Future +1985 : Better Off Dead... +1985 : Brazil +1985 : Clue +1985 : Cocoon +1985 : Commando +1985 : Day of the Dead +1985 : Flesh+Blood +1985 : Friday the 13th: A New Beginning +1985 : Fright Night +1985 : Girls Just Want to Have Fun +1985 : Just One of the Guys +1985 : Legend +1985 : Mad Max Beyond Thunderdome +1985 : Mask +1985 : Pale Rider +1985 : Pee-wee's Big Adventure +1985 : Police Academy 2: Their First Assignment +1985 : Rambo: First Blood Part II +1985 : Real Genius +1985 : Return to Oz +1985 : Rocky IV +1985 : Silverado +1985 : St. Elmo's Fire +1985 : Teen Wolf +1985 : The Breakfast Club +1985 : The Color Purple +1985 : The Goonies +1985 : The Last Dragon +1985 : The Return of the Living Dead +1985 : Weird Science +1985 : Witness + +``` + +

2.8 Quét dữ liệu

+ +Phương thức scan đọc mọi mục trong toàn bộ bảng và trả về tất cả dữ liệu trong bảng. Bạn có thể cung cấp một tùy chọn `filter_expression` để chỉ những mặt hàng phù hợp với tiêu chí của bạn mới được trả lại. Tuy nhiên, bộ lọc chỉ được áp dụng sau khi toàn bộ bảng đã được quét. + +Chương trình sau quét toàn bộ bảng Movies, trong đó có khoảng 5.000 mục. Quá trình quét chỉ định bộ lọc tùy chọn để chỉ lấy các phim từ những năm 1950 (khoảng 100 mục) và loại bỏ tất cả các phim khác. + +- Bước 1: Tạo file có tên `MoviesScan.py` + +- Bước 2: Sao chép đoạn mã sau và dán vào file `MoviesScan.py` + +``` +from pprint import pprint +import boto3 +from boto3.dynamodb.conditions import Key + + +def scan_movies(year_range, display_movies, dynamodb=None): + dynamodb = boto3.resource('dynamodb') + + table = dynamodb.Table('Movies') + scan_kwargs = { + 'FilterExpression': Key('year').between(*year_range), + 'ProjectionExpression': "#yr, title, info.rating", + 'ExpressionAttributeNames': {"#yr": "year"} + } + + done = False + start_key = None + while not done: + if start_key: + scan_kwargs['ExclusiveStartKey'] = start_key + response = table.scan(**scan_kwargs) + display_movies(response.get('Items', [])) + start_key = response.get('LastEvaluatedKey', None) + done = start_key is None + + +if __name__ == '__main__': + def print_movies(movies): + for movie in movies: + print(f"\n{movie['year']} : {movie['title']}") + pprint(movie['info']) + + query_range = (1950, 1959) + print( + f"Scanning for movies released from {query_range[0]} to {query_range[1]}...") + scan_movies(query_range, print_movies) +``` +Chú thích: + + ProjectionExpression chỉ định các thuộc tính bạn muốn trong kết quả quét. + + FilterExpression chỉ định một điều kiện chỉ trả về các mục thỏa mãn điều kiện. Tất cả các mục khác đều bị loại bỏ. + +- Bước 3 Chạy chương trình bằng Window Command Prompt đã được xác thực và cấu hình ở bước 1.1. Gõ lệnh: + +``` +python MoviesScan.py +``` +Trường hợp khác: sử dụng `python "đường dẫn file MoviesScan.py"` + +- Bước 4: Sau khi chạy chương trình, thu được kết quả + +``` + +1958 : Cat on a Hot Tin Roof +{'rating': Decimal('8')} + +1958 : Monster on the Campus +{'rating': Decimal('5.7')} + +1958 : No Time for Sergeants +{'rating': Decimal('7.5')} + +1958 : Teacher's Pet +{'rating': Decimal('7')} + +1958 : Touch of Evil +{'rating': Decimal('8.2')} + +1958 : Vertigo +{'rating': Decimal('8.5')} + +1951 : A Streetcar Named Desire +{'rating': Decimal('8')} + +1951 : Alice in Wonderland +{'rating': Decimal('7.4')} + +1951 : An American in Paris +{'rating': Decimal('7.2')} + +1951 : Operation Pacific +{'rating': Decimal('6.5')} + +1951 : Storm Warning +{'rating': Decimal('7')} + +1951 : Strangers on a Train +{'rating': Decimal('8.2')} + +1951 : The African Queen +{'rating': Decimal('8')} + +``` + +

2.9 Xóa dữ liệu bảng

+ +- Bước 1: Tạo file có tên `MoviesDeleteTable.py` + +- Bước 2: Sao chép đoạn mã sau và dán vào file `MoviesDeleteTable.py` +``` +import boto3 + + +def delete_movie_table(dynamodb=None): + dynamodb = boto3.resource('dynamodb') + table = dynamodb.Table('Movies') + table.delete() + + +if __name__ == '__main__': + delete_movie_table() + print("Movies table deleted.") +``` +- Bước 3 Chạy chương trình bằng Window Command Prompt đã được xác thực và cấu hình ở bước 1.1. Gõ lệnh: + +``` +python MoviesDeleteTable.py +``` +Trường hợp khác: sử dụng `python "đường dẫn file MoviesDeleteTable.py"` + +- Bước 4: Sau khi chạy chương trình, thu được kết quả + +``` +Movies table deleted. +``` + +

IV.DỌN DẸP TÀI NGUYÊN

+ +

1.1 Sử dụng AWS Management Console

+ +- Bước 1: Mở bảng DynamoDB console tại https://console.aws.amazon.com/dynamodb/ + +- Bước 2: Trong thanh điều hướng ở bên trái của bảng điều khiển, chọn Tables + +- Bước 3: Chọn bảng Music từ danh sách bảng. + +- Bước 4: Chọn Actions, sau đó chọn Delete table. + + + +![Delete Table!](./images/delete-table.png "Delete Table") + + +

1.2 Sử dụng AWS CloudShell

+ +- Để xóa bảng, sử dụng lệnh `delete-table` + +- Gõ lệnh: +``` +aws dynamodb delete-table --table-name Music +``` + + + + + + + + + + +