Triển khai Lambda function bằng AWS Controller cho Kubernetes

Link gốc: https://aws.amazon.com/blogs/compute/deploying-aws-lambda-functions-using-aws-controllers-for-kubernetes-ack/

Bài post này được viết bởi Rajdeep Saha, Sr. SSA, Containers/Serverless.

AWS Controller for Kubernetes (ACK) cho phép bạn quản lý các dịch vụ AWS trực tiếp từ Kubernetes. Với ACK cho AWS Lambda, bạn có thể cung cấp và quản lý các hàm Lambda bằng kubectl tài nguyên tùy chỉnh. Với ACK, bạn có thể có một cách tiếp cận hợp nhất duy nhất để quản lý khối lượng công việc và các dịch vụ AWS khác, chẳng hạn như Lambda, trực tiếp từ Kubernetes mà không cần thêm các công cụ tự động hóa cơ sở hạ tầng.

Bài đăng này hướng dẫn bạn cách triển khai Lambda mẫu từ cụm Kubernetes do Amazon EKS cung cấp.

Trường hợp sử dụng

Một số trường hợp sử dụng để cung cấp Lambda từ ACK bao gồm:

  • Tổ chức của bạn đã có quy trình DevOps để triển khai tài nguyên vào cụm Amazon EKS bằng cách sử dụng YAML khai báo Kubernetes (được gọi là manifest file). Với ACK cho AWS Lambda, giờ đây bạn có thể sử dụng manifest file để cung cấp các hàm Lambda mà không cần tạo cơ sở hạ tầng riêng biệt từ template.
  • Dự án của bạn đã triển khai GitOps với Kubernetes. Với GitOps, git trở thành nguồn thông tin chính xác duy nhất và tất cả các thay đổi đều được thực hiện thông qua git repo. Trong mô hình này, Kubernetes liên tục điều hòa git repo (trạng thái mong muốn) với các tài nguyên chạy bên trong cụm (trạng thái hiện tại). Nếu tìm thấy bất kỳ sự khác biệt nào, quy trình GitOps sẽ tự động thực hiện các thay đổi đối với cụm từ git. Sử dụng ACK cho AWS Lambda, vì bạn đang tạo Lambda bằng tài nguyên tùy chỉnh Kubernetes nên mô hình GitOps sẽ được áp dụng cho Lambda
  • Tổ chức của bạn đã thiết lập ranh giới quyền cho những người dùng và nhóm khác nhau bằng cách sử dụng kiểm soát truy cập dựa trên vai trò (RBAC)vai trò IAM cho tài khoản dịch vụ (IRSA). Bạn có thể sử dụng lại mô hình bảo mật này cho Lambda mà không cần phải tạo người dùng và chính sách mới.

ACK cho Kubernetes hoạt động như thế nào

  1. Nhóm ‘Ops’ triển khai ACK service controller cho Lambda. Bộ điều khiển này chạy dưới dạng pod trong cụm Amazon EKS.
  2. Pod controller cần có quyền đọc Lambda code và tạo hàm Lambda. Lambda code được lưu trữ dưới dạng tệp zip trong vùng lưu trữ S3 cho ví dụ này. Các quyền được cấp cho nhóm bằng IRSA.
  3. Mỗi dịch vụ AWS có bộ điều khiển dịch vụ ACK riêng biệt. Bộ điều khiển cụ thể này dành cho AWS Lambda có thể hoạt động trên loại tài nguyên tùy chỉnh ‘Function’.
  4. Nhóm ‘Dev’ triển khai Kubernetes manifest file với loại tài nguyên tùy chỉnh ‘Function’. Các file này xác định các trường cần thiết cần thiết để tạo hàm, chẳng hạn như tên S3, tên tệp zip, IAM của Lambda, v.v.
  5. Bộ điều khiển dịch vụ ACK tạo hàm Lambda bằng cách sử dụng các giá trị từ file manifest

Điều kiện tiên quyết

Bạn cần một vài công cụ trước khi triển khai ứng dụng. Đảm bảo rằng bạn có những công cụ sau đây trong môi trường làm việc của mình:

Bài đăng này sử dụng các biến shell để giúp thay thế tên thực tế cho quá trình triển khai của bạn dễ dàng hơn

Khi bạn thấy các placeholder như NAME=<tên xyz của bạn>, hãy thay thế tên cho môi trường của bạn

Cài đặt Amazon EKS Cluster

  1. Chạy câu lệnh sau để tạo cụm Amazon EKS. Lệnh dưới đây tạo cụm Amazon EKS hai node có tên duy nhất.
eksctl create cluster
  1. Có thể mất 15–30 phút để cung cấp cụm Amazon EKS. Khi cụm đã sẵn sàng, hãy chạy:

eksctl get nodes

export EKS_CLUSTER_NAME=<provide the name from the previous command>

  1. Output được hiển thị như dưới đây:
  1. Để lấy tên cụm Amazon EKS để sử dụng, hãy chạy:
Bash
eksctl get cluster
export EKS_CLUSTER_NAME=<provide the name from the previous command>

Thiết lập bộ điều khiển ACK cho Lambda

Để thiết lập bộ điều khiển ACK cho Lambda:

  1. Cài đặt bộ điều khiển ACK với Helm bằng những chỉ dẫn dưới đây:
  • Thay đổi export SERVICE=s3 thành export SERVICE=lambda
  • Thay đổi export AWS_REGION=us-west-2 
  1. Để định cấu hình quyền IAM cho pod đang chạy Bộ điều khiển Lambda ACK để cho phép nhóm tạo các Lambda, làm theo chỉ dẫn sau:
  • Thay thế SERVICE=”s3 bằng SERVICE=”lambda

     3. Xác nhận ACK Lambda Controller đang chạy:

kubectl get pods -n ack-system

4. Output được hiển thị như hình:

Cung cấp hàm Lambda từ cụm Kubernetes

Trong phần này, bạn viết Lambda mẫu “Hello world”. Bạn nén mã và tải tệp zip lên vùng lưu trữ S3. Cuối cùng, bạn triển khai tệp zip đó vào Lambda bằng ACK Controller từ cụm EKS mà bạn đã tạo trước đó. Trong ví dụ này, hãy sử dụng Python3.9 làm ngôn ngữ runtime của bạn.

Cung cấp cho Lambda

  1. Chạy phần sau để tạo hàm Lambda mẫu “Hello world” rồi nén nó lại
mkdir my-helloworld-functioncd my-helloworld-functioncat << EOF > lambda_function.py import json
def lambda_handler(event, context):    # TODO implement    return {        ‘statusCode’: 200,        ‘body’: json.dumps(‘Hello from Lambda!’)    }EOF

zip my-deployment-package.zip lambda_function.py

  1. Tạo S3 bucket theo hướng dẫn tại đây. Ngoài ra, bạn có thể sử dụng bộ S3 bucket hiện có trong cùng region với cụm Amazon EKS
  2. Chạy phần sau để tải tệp zip lên vùng lưu trữ S3 từ bước 2

export BUCKET_NAME=<provide the bucket name from step 2>

aws s3 cp  my-deployment-package.zip s3://${BUCKET_NAME}

  1. Output hiển thị:

upload: ./my-deployment-package.zip to s3://<BUCKET_NAME>/my-deployment-package.zip

  1. Tạo Lambda của bạn bằng ACK Controller. Thông số đầy đủ với tất cả các trường có sẵn được liệt kê ở đây. Đầu tiên, đặt tên cho hàm
export FUNCTION_NAME=hello-world-s3-ack
  1. Tạo và triển khai tệp Kubernetes manifest. Lệnh ở cuối, kubectl create -f function.yaml gửi tệp kê khai, có loại là Function. ACK Controller cho Lambda xác định đối tượng Function tùy chỉnh này và triển khai hàm Lambda dựa trên tệp manifest
export AWS_ACCOUNT_ID=$(aws sts get-caller-identity –query “Account” –output text)export LAMBDA_ROLE=”arn:aws:iam::${AWS_ACCOUNT_ID}:role/lambda_basic_execution”
cat << EOF > lambdamanifest.yaml apiVersion: lambda.services.k8s.aws/v1alpha1kind: Functionmetadata: name: $FUNCTION_NAME annotations:   services.k8s.aws/region: $AWS_REGIONspec: name: $FUNCTION_NAME code:   s3Bucket: $BUCKET_NAME   s3Key: my-deployment-package.zip role: $LAMBDA_ROLE runtime: python3.9 handler: lambda_function.lambda_handler description: function created by ACK lambda-controller e2e testsEOF

kubectl create -f lambdamanifest.yaml

  1. Output hiển thị

function.lambda.services.k8s.aws/< FUNCTION_NAME> created

  1. Để truy xuất thông tin chi tiết của hàm bằng lệnh Kubernetes, hãy chạy:

kubectl describe function/$FUNCTION_NAME

  1. Hàm Lambda này trả về “Xin chào thế giới”. Để gọi hàm, hãy chạy

aws lambda invoke –function-name $FUNCTION_NAME  response.json

cat response.json

  1. Lambda trả ra output như sau:

{“statusCode”: 200, “body”: “\”Hello from Lambda!\””}

Xin chúc mừng. Bạn đã tạo được Lambda từ Kubernetes

Để tìm hiểu cách cung cấp Lambda bằng ACK Controller từ OCI container image thay vì tệp zip trong S3, hãy làm theo các hướng dẫn sau

Dọn dẹp

Phần này sẽ dọn sạch tất cả các tài nguyên mà bạn đã tạo. Để dọn dẹp:

  1. Xoá Lambda function

kubectl delete function $FUNCTION_NAME

  1. Nếu bạn tạo mới S3, xoá nó băng câu lệnh sau:

aws s3 rm s3://${BUCKET_NAME} –recursive

aws s3api delete-bucket –bucket ${BUCKET_NAME}

  1. Xoá EKS cluster:

eksctl delete cluster –name $EKS_CLUSTER_NAME

  1. Xoá IAM role cho ACK Controller. Lấy tên IAM bằng cách chạy lệnh sau, sau đó xóa vai trò khỏi bảng điều khiển IAM

echo $ACK_CONTROLLER_IAM_ROLE

Kết luận

Bài đăng trên blog này trình bày AWS Controller dành cho Kubernetes cho phép bạn triển khai Lambda trực tiếp từ môi trường Amazon EKS của bạn. AWS Controller dành cho Kubernetes cung cấp một cách thuận tiện để kết nối các ứng dụng Kubernetes của bạn với các dịch vụ AWS trực tiếp từ Kubernetes.

ACK là mã nguồn mở: bạn có thể yêu cầu các tính năng mới và báo cáo sự cố trên GitHub của cộng đồng ACK

Để biết thêm tài nguyên học tập Serverless, hãy truy cập Serverless Land.