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.

Sử dụng SAM để triển khai Serverless Application macos

2022-05-27 352 lượt xem

Giới thiệu

sam-aws

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 functionsAPIsdatabases 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

Tạo một dự án Lambda function vớiSAM và Cloudformation

Sử dụng terminal:

sam init

 

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.

sam build

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:

sam deploy --guided

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: 

sam local start-api

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.