Giới thiệu
AWS Serverless Application Model (SAM) là một open-source framework để xây dựng và triển khai các ứng dụng Serverless trên AWS
SAM cung cấp các cú pháp đơn giản để mô tả các functions, APIs, databases và even source trên AWS bằng việc sử dụng YAML structure.
Trong quá trình triển khai ứng dụng, SAM sẽ chuyển đổi file YAML này sang AWS Cloudformation để xây dựng dịch vụ Serverless trên AWS
- SAM có thể tổ chức các AWS serverless service config lại thành một, và có thể triển khai nhanh chóng
- Bạn có thể test và debug trực tiếp thông qua SAM
- SAM build dựa trên CloudFormation, nên cú pháp hoàn toàn tương tự với CloudFormation, bạn có thể làm quen một cách nhanh chóng
- Có thể tích hợp với nhiều tools khác nhau cho quá trình Integration hoặc Delivery
Cài đặt SAM MAC OS
Bạn có thể cài SAM trên MAC OS thông qua Brew:
brew tap aws/tap
brew install aws-sam-cli
Sử dụng terminal:
Tại thời điểm viết bài thì aws vừa mới hộ trợ nodejs 16.x mà mình không tự tin với new feature lắm nên cứ dùng nodejs 14.x thôi nhé 😄
Cuối cùng bạn có folder thế này:
🗁 test
|--🗁 events
| `--🗎 event.json
|--🗁 hello-world
| |--🗁 tests
| | `--🗁 unit
| | | `--🗎 test-handler.test.ts
| |--🗎 .eslintignore
| |--🗎 .eslintrc.js
| |--🗎 .npmignore
| |--🗎 .prettierrc.js
| |--🗎 app.ts
| |--🗎 jest.config.ts
| |--🗎 package.json
| `--🗎 tsconfig.json
|--🗎 .gitignore
|--🗎 README.md
`--🗎 template.yaml
Giới thiệu cách sử dụng sam
Để build code -SAM build
Mặc định bạn sẽ có 1 file file template.yaml, nhiệm vụ của bạn đầu tiên là phải build SAM Application này trước, để tạo ra các packages và download các dependencies cần thiết.
Sau khi build xong, bạn sẽ thấy được thư mục .aws-sam được tạo ra. Bên trong đó chứa Lambda Function có trong application:
samconfig.toml file
Sau khi build xong, bạn có thể tạo ra file samconfig.toml để cấu hình một số thông tin cần thiết của SAM.
Bạn nên khởi tạo file này thông qua việc deploy lần đầu tiên với cú pháp:
Khi đó, SAM tạo guide để cho bạn có thể setup một số thông tin cần thiết. Bạn cứ chọn theo mặc định, sau này mình có thể sửa sau được. Sau khi hoàn thành guide thì sẽ tạo cho bạn một file samconfig.toml như sau:
Tham khảo thêm ở đây: https://thachanpy.com/su-dung-sam-de-trien-khai-serverless-application/#Tao_samconfigtoml_file
Thử invoke events locally
Bạn có thể check function lambda bạn đã viết hoạt động đúng như kỳ vọng không. Cái này nó sẽ giống việc thay vì bạn dùng postman để lưu 1 nùi các thông số và call api thì cái này không cần.
Bạn chỉ cần gọi invoke thì bạn thay cho việc call api và mọi thông số nếu bạn commit đều được lưu lại lịch sử rồi.
sam local invoke HelloWorldFunction --event events/event.json
Bạn sẽ thấy kết quả của api bạn đang được build ở đây. Đó là quá trình biên dịch những gì đã được build trong folder : .aws-sam/build/HelloWorldFunction/app.js
File build có dòng này:
Là hậu quả của dòng này:
LÀ kết quả của việc bạn test thử của invoke.
Start code local
Để start api local thì bạn có thể dùng lệnh sau:
Bạn được kết quả:
Gõ lên đường dẫn trình duyệt được:
Chạy và mounting code vào docker
Cái cùi bắp khi chúng ta làm việc với typescript và javascript là vầy. Thằng typescript cần biên dịch mà mình chưa thấy thằng sam có lệnh nào build runtime khi chúng ta edit code 😄
Vậy mình đang nghĩ là phải compile liên tục của typescript là ngon luôn đúng hem?
Vậy thì nhiệm vụ là tạo 1 file tsconfig.build.json khác rồi nạp config tương ứng vô cho nó auto build map đúng chỗ cái folder code của bạn vào đó.
Nội dung file ./hello-world/tsconfig.build.json như sau:
// ./hello-world/tsconfig.build.json
{
"compilerOptions": {
"noImplicitAny": false,
"noEmitOnError": true,
"removeComments": false,
"sourceMap": true,
"target": "es5",
// "compileOnSave": true,
"outDir": "./../.aws-sam/build/helloWorldFunction",
},
"exclude": [
"node_modules",
"dist",
"coverage",
"**/*.test.ts"
]
}
Bạn thêm đoạn : "watch": "tsc -w -p tsconfig.build.json", vào file ./hello-world/package.json
sau run dưới terminal cái lệnh:
cd ./hello-world
npm run watch
Bây giờ mỗi lần thay đổi của bạn nó sẽ build vào trong foler .aws-sam/build/helloWorldFunction.