Hướng dẫn triển khai Lambda Function với Prisma và API Gateway

Mục tiêu :
  • Xây dựng và triển khai một Lambda function sử dụng Prisma để tương tác với cơ sở dữ liệu PostgreSQL.
  • Tạo API Gateway để cho phép truy cập vào Lambda function thông qua HTTP.
  • Triển khai một môi trường phát triển (dev) để thử nghiệm và xây dựng ứng dụng.
Yêu cầu tiên quyết:
  • Tài khoản AWS và quyền truy cập để tạo Lambda function, API Gateway, IAM roles và VPC.
  • Cài đặt AWS CLI và cấu hình với thông tin đăng nhập của bạn.
  • Node.js và npm đã được cài đặt.
  • Hiểu biết cơ bản về TypeScript, Lambda function, API Gateway, Prisma và cơ sở dữ liệu PostgreSQL.
  • Đã cài đặt OpenVPN Connect và cấu hình để kết nối đến VPN của OCC (nếu cần thiết).
  • Đã cài đặt Postman hoặc công cụ tương tự để kiểm tra API.
Bước 1: Cấu trúc thư mục dự án
project-root/
├── src/
│ └── lambda/
│ ├── dev/ # Môi trường phát triển
│ │ ├── lambda-lending-dev/ # Thư mục dự án Lambda
│ │ │ ├── lib/ # CDK stack definition
│ │ │ ├── src/ # Mã nguồn Lambda
│ │ │ │ ├── development/ # Môi trường phát triển (code lambda)
│ │ │ │ │ ├── lambda/ # Chứa index.ts, resources.ts, services/
│ │ │ │ │ │ ├── index.ts # Handler lambda
│ │ │ │ │ │ ├── resources.ts # Định nghĩa API paths và methods
│ │ │ │ │ │ ├── services/ # Logic nghiệp vụ (lending.ts)
│ │ │ │ │ │ ├── repositories/ # Thao tác với dữ liệu
│ │ │ │ │ │ └── utils/
│ │ │ │ └── production/ # Môi trường Production
│ │ │ ├── test/ # Tests
│ │ │ ├── tsconfig.json # Cấu hình TypeScript
│ │ │ └── package.json # Quản lý dependencies
│ │ ├── cdk.json
│ │ └── tsconfig.json
│ └── pro/ # Môi trường production
├── tsconfig.json # Cấu hình TypeScript gốc
└── README.md
Bước 2: Cấu hình TypeScript

Thêm loại trừ (exclude) cho thư mục Lambda: Trong tsconfig.json gốc của dự án, thêm “src/lambda/**/*” vào phần “exclude” để tránh xung đột khi biên dịch.

{
  "compilerOptions": {
    // ...
  },
  "exclude": [
    "node_modules",
    "cdk.out",
    "src/lambda/**/*" // Thêm dòng này
  ]
}
Bước 3: Khởi tạo dự án CDK cho Lambda
  • Di chuyển vào thư mục dev: cd src/lambda/dev
  • Khởi tạo dự án CDK: cdk init app –language=typescript
  • Cấu hình esModuleInterop: Mở src/lambda/dev/lambda-lending-dev/tsconfig.json và thêm “esModuleInterop”: true vào compilerOptions:
{
  "compilerOptions": {
    // ...
    "esModuleInterop": true,
    // ...
  }
}
Bước 4: Cài đặt các dependencies cần thiết
  • Di chuyển vào thư mục dự án Lambda: cd src/lambda/dev/lambda-lending-dev
  • Cài đặt dependencies:
npm install
npm install -D @types/aws-lambda
npm install dotenv
npm install uuid
npm install prisma --save-dev
npm install @prisma/client
npm install aws-cdk-lib constructs

Lưu ý:

  • Kiểm tra version AWS CDK và TypeScript: aws –version và tsc –version.
  • Đảm bảo đã cài đặt AWS CDK và TypeScript trên toàn cục nếu chưa cài: npm install -g aws-cdk typescript.
Bước 5: Định nghĩa Lambda Function trong CDK Stack
  • Mở file stack: Mở src/lambda/dev/lambda-lending-dev/lib/lambda-dự án của bạn-dev-stack.ts.
  • Thêm định nghĩa Lambda function:
import * as cdk from 'aws-cdk-lib';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import { Construct } from 'constructs';

export class LambdaDựÁnCủaBạnDevStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    /* lambda lending dev function */
    const lendingFunctionDev = new lambda.Function(this, "LendingFunction-Dev", {
      functionName: "LendingFunction-Dev",
      runtime: lambda.Runtime.NODEJS_22_X,
      handler: "index.handler",
      code: lambda.Code.fromAsset("src/development/lambda"),
      timeout: cdk.Duration.seconds(10), // Đặt timeout
      memorySize: 4096 // Đặt memory
    });
  }
}
Bước 6: Viết code cho Lambda Function
  • Tạo file index.ts: Tạo file src/lambda/dev/lambda-lending-dev/src/development/lambda/index.ts.
  • Thêm code handler:
import { Handler, APIGatewayEvent } from 'aws-lambda';
import { apiRequests, apiPaths } from './resources';

export const handler: Handler = async (event: APIGatewayEvent) => {
  console.log(event, 'event');

  if (event.path === apiPaths.lending_dev_test_api && event.httpMethod === apiRequests.get) {
    console.log('event testing api', event);
    return devBuildResponse(200, { status: 'success', message: 'api working ok update test.' });
  }

  // Thêm các logic API khác ở đây

  return devBuildResponse(200, { status: 'success', message: 'out of api!' });
};

// build response
export const devBuildResponse = (statusCode: number, body: object): object => {
  return {
    statusCode,
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify(body),
  };
};

Tạo file resources.ts: Tạo file src/lambda/dev/lambda-lending-dev/src/development/lambda/resources.ts.

export const apiRequests = {
  get: 'GET',
  post: 'POST',
  put: 'PUT',
  delete: 'DELETE',
};

export const apiPaths = {
  lending_dev_test_api: '/lending_dev_test_api',
  lending_dev_lending: '/lending_dev_lending',
  lending_dev_lendings: '/lending_dev_lendings',
  lending_dev_lending_status: '/lending_dev_lending_status',
  lending_pic_display: '/lending_pic_display',
  lending_pic_upload: '/lending_pic_upload',
};
Bước 7: Triển khai Lambda Function
  • Di chuyển vào thư mục dự án CDK: cd src/lambda/dev/lambda-lending-dev
  • Bootstrap CDK: cdk bootstrap (Chỉ cần chạy lần đầu tiên cho mỗi tài khoản/region)
  • Build dự án: npm run build
  • Triển khai CDK stack: cdk deploy
Bước 8: Cấu hình Lambda Function trên AWS Console
  1. Mở Lambda Function: Truy cập AWS Lambda Console và tìm Lambda function “LendingFunction-Dev”.
  2. Configuration -> General configuration -> Edit:
    • Memory: Đặt thành 4096 MB (hoặc giá trị phù hợp).
    • Timeout: Đặt thành 10 giây (hoặc giá trị phù hợp).
  3. Configuration -> Permissions: Click vào “Role name” để chuyển đến trang IAM Role.
  4. Attach Policies: Thêm các policies sau vào IAM Role:
    • AmazonAPIGatewayInvokeFullAccess
    • AmazonCognitoPowerUser
    • AmazonRDSFullAccess
    • AmazonS3FullAccess
    • AWSLambdaBasicExecutionRole
    • AWSLambdaVPCAccessExecutionRole
  5. Configuration -> VPC: (Nếu Lambda cần truy cập tài nguyên trong VPC)
    • VPC: Chọn vpc-0b1f0809ce48c56eb (10.40.0.0/16).
    • Subnets: Chọn:
    • subnet-007a27ff6ebb7baa2d (10.40.64.0/20)
    • subnet-03cf1913b6c999dd4 (10.40.16.0/20)
    • Security groups: Chọn sg-0054bb80d4d43433a1 (lambda-rds-access).
Bước 9: Cấu hình API Gateway
  1. Tạo API: Truy cập AWS API Gateway Console và chọn “Create API”.
    • Chọn “REST API” và chọn “Import from Open API 3”.
  2. API Details:
    • API name: lendingRecord.
  3. Create Resource:
    • Chọn “Create Resource” và tạo các resource path tương ứng với các đường dẫn trong apiPaths (ví dụ: lending_dev_test_api, lending_dev_lending, v.v.).
  4. Create Method:
    • Chọn một resource (ví dụ: lending_dev_test_api) và chọn “Create Method”.
    • Chọn HTTP method (ví dụ: GET).
  5. Method details:
    • Integration type: Lambda Function.
    • Lambda Proxy integration: Check.
    • Lambda Function: Chọn Region (ví dụ: ap-northeast-1) và chọn Lambda function “LendingFunction-Dev”.
  6. Deploy API:
    • Chọn “Deploy API”.
    • Chọn hoặc tạo một “Stage” (ví dụ: dev).
  7. Lấy URL API: Bây giờ bạn sẽ có một URL cho API của mình, ví dụ: https://10wvd3u8yl.execute-api.ap-northeast-1.amazonaws.com/dev/lending_pic_display.
Bước 10: Cấu hình Prisma
  1. Khởi tạo Prisma: npx prisma init (Nếu chưa khởi tạo trước đó)
  2. Cấu hình DATABASE_URL:
    • Tạo file .env trong src/lambda/dev/lambda-lending-dev/src/development/lambda/.
    • Thêm biến DATABASE_URL với URL kết nối đến cơ sở dữ liệu PostgreSQL của bạn:
DATABASE_URL="postgresql://dbadmin:Abc123Abc123@websso-serverless-test1-instance-1.cgdoweh05ij9.ap-northeast-1.rds.amazonaws.com:5432/lending_dev?schema=public"
  1. Kết nối VPN (nếu cần): Đảm bảo bạn đã kết nối đến VPN của OCC bằng OpenVPN Connect.
  2. Truy cập pgAdmin (nếu cần): Truy cập pgAdmin bằng URL: https://52.199.224.207/pgadmin4. (Lưu ý: IP này có thể thay đổi).
    • Tài khoản: wintun.mmocc@gmail.com
    • Mật khẩu: Abc123!@#
  3. Tạo Database: Tạo một database mới tên là lending_dev với owner là dbadmin.
  4. Cấu hình Prisma Schema:
    • Mở file prisma/schema.prisma.
    • Đảm bảo url trỏ đến biến môi trường DATABASE_URL.
    • Xác định các models tương ứng với các bảng trong cơ sở dữ liệu của bạn.
    • Cấu hình generator client để sử dụng binaryTargets:
generator client {
  provider      = "prisma-client-js"
  binaryTargets = ["native", "rhel-openssl-3.0.x"]
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

// Định nghĩa các model ở đây
  1. Chạy Prisma Migrations: npx prisma migrate dev
  2. Generate Prisma Client: npx prisma generate
Bước 11: Triển khai code Prisma và Logic nghiệp vụ
  1. Tạo thư mục services và file lending.ts: Tạo thư mục src/lambda/dev/lambda-lending-dev/src/development/lambda/services và file lending.ts.
  2. Thêm logic nghiệp vụ: Thêm code logic nghiệp vụ liên quan đến lending vào lending.ts. File này sẽ chứa các hàm sử dụng Prisma Client để truy vấn và thao tác với cơ sở dữ liệu.
  3. Thêm code truy cập dữ liệu: Tạo thư mục repositories để chứa code truy cập dữ liệu.
  4. Sử dụng Prisma Client trong Lambda Function: Import và sử dụng Prisma Client trong index.ts để gọi các hàm trong services/lending.ts để thực hiện các thao tác nghiệp vụ.
Bước 12: Tạo Lambda Layer cho Prisma và các Dependencies
  1. Tạo thư mục nodejs: Tạo một thư mục tên là nodejs ở bất kỳ vị trí nào bạn muốn (ví dụ: ngoài thư mục dự án).
  2. Cài đặt dependencies: Bên trong thư mục nodejs, chạy npm install.
  3. Cài đặt Prisma Client: Trong thư mục nodejs, chạy npm install prisma @prisma/client.
  4. Cấu hình Prisma Schema: Tạo file prisma/schema.prisma và cấu hình giống như trong dự án Lambda của bạn. Quan trọng: Phải có binaryTargets trong schema.prisma
  5. Generate Prisma Client: npx prisma generate trong thư mục nodejs.
  6. Cài đặt các dependencies khác: Bên trong thư mục nodejs, cài đặt tất cả các dependencies khác mà Lambda function của bạn sử dụng (ngoại trừ @prisma/client, vì nó đã được cài đặt ở bước trước). Ví dụ: npm install uuid dotenv aws-sdk.
  7. Nén thư mục nodejs: Nén thư mục nodejs thành một file zip.
  8. Tạo Lambda Layer:
    • Truy cập AWS Lambda Console và chọn “Layers”.
    • Chọn “Create layer”.
    • Name: Đặt tên cho layer (ví dụ: prisma-dependencies).
    • Upload a .zip file: Upload file zip bạn vừa tạo.
    • Compatible runtimes: Chọn “nodejs18.x” hoặc runtime phù hợp.
  9. Thêm Layer vào Lambda Function:
    • Mở Lambda function “LendingFunction-Dev”.
    • Chọn “Layers” và chọn “Add a layer”.
    • Chọn layer “prisma-dependencies” bạn vừa tạo.
Bước 13: Kiểm tra và Gỡ lỗi

Kiểm tra API: Sử dụng Postman hoặc công cụ tương tự để gửi các HTTP requests đến API Gateway URL của bạn và kiểm tra xem Lambda function có hoạt động đúng như mong đợi hay không.

Gỡ lỗi: Xem log của Lambda function trong AWS CloudWatch Logs để xác định và sửa các lỗi.

Lưu ý quan trọng:
Phiên bản Prisma: Đảm bảo phiên bản Prisma Client trong layer và trong dự án Lambda của bạn là giống nhau.

Binary Targets: binaryTargets trong schema.prisma phải phù hợp với môi trường Lambda của bạn. rhel-openssl-1.0.x là một lựa chọn phổ biến cho Lambda. Nếu sử dụng phiên bản Node.js mới hơn, bạn có thể cần rhel-openssl-3.0.x.

Cold Starts: Lambda function có thể gặp phải "cold starts." Sử dụng provisioned concurrency có thể giúp giảm thiểu vấn đề này.

Quản lý Secrets: Không lưu trữ thông tin bí mật trực tiếp trong code. Sử dụng AWS Secrets Manager hoặc AWS Systems Manager Parameter Store.

Logging và Monitoring: Sử dụng logging và monitoring để theo dõi hiệu suất và phát hiện các vấn đề.

Total
0
Shares
Để lại một bình luận
Previous Post
Expo SDK 52

Expo SDK 52: Progress and Challenges