[{"data":1,"prerenderedAt":426},["ShallowReactive",2],{"news-item-\u002Fvi\u002Fnews\u002Fdebugging-aws-lambda-voi-localstack":3},{"id":4,"title":5,"body":6,"category":414,"created by":415,"date":416,"description":20,"extension":417,"meta":418,"navigation":419,"path":420,"sections":421,"seo":422,"stem":423,"thumbnail":424,"__hash__":425},"content_vi\u002Fvi\u002Fnews\u002Fdebugging-aws-lambda-voi-localstack.md","Debugging AWS Lambda với LocalStack",{"type":7,"value":8,"toc":385},"minimark",[9,17,21,25,32,35,43,49,52,58,64,67,73,77,81,84,95,98,104,108,111,117,120,128,131,135,139,143,146,152,156,159,165,168,171,177,180,186,190,193,199,203,206,212,215,219,223,226,230,233,239,242,246,250,254,257,263,266,276,280,283,289,291,310,314,316,320,323,327,330,334,338,344,350,356,362,368,372,375,379],[10,11,13],"h2",{"id":12},"localstack-là-gì",[14,15,16],"strong",{},"LocalStack là gì?",[18,19,20],"p",{},"LocalStack là một công cụ phát triển phần mềm mã nguồn mở giúp bạn triển khai và chạy ứng dụng trên môi trường đám mây giả lập trên máy tính cá nhân hoặc máy chủ của bạn. Nó cung cấp một bản sao của nhiều dịch vụ đám mây phổ biến, chẳng hạn như Amazon S3, AWS Lambda, DynamoDB, và nhiều dịch vụ khác. Điều này cho phép bạn phát triển, kiểm tra và debug ứng dụng của bạn mà không cần phải kết nối đến một môi trường đám mây thực sự.",[10,22,24],{"id":23},"cài-đặt","Cài đặt",[26,27,29],"h3",{"id":28},"cài-đặt-localstack",[14,30,31],{},"Cài đặt LocalStack",[18,33,34],{},"Làm theo hướng dẫn ở link sau để cài đặt LocalStack:",[18,36,37],{},[38,39,40],"a",{"href":40,"rel":41},"https:\u002F\u002Fdocs.localstack.cloud\u002Fgetting-started\u002Finstallation\u002F",[42],"nofollow",[26,44,46],{"id":45},"cài-đặt-docker",[14,47,48],{},"Cài đặt Docker",[18,50,51],{},"Làm theo hướng dẫn ở link sau để cài đặt Docker:",[18,53,54],{},[38,55,56],{"href":56,"rel":57},"https:\u002F\u002Fdocs.docker.com\u002Fengine\u002Finstall\u002F",[42],[26,59,61],{"id":60},"cài-đặt-aws-cli",[14,62,63],{},"Cài đặt AWS CLI",[18,65,66],{},"Làm theo hướng dẫn ở link sau để cài đặt AWS CLI và cấu hình profile cho môi trường local:",[18,68,69],{},[38,70,71],{"href":71,"rel":72},"https:\u002F\u002Fdocs.localstack.cloud\u002Fuser-guide\u002Fintegrations\u002Faws-cli\u002F#aws-cli",[42],[10,74,76],{"id":75},"thiết-lập-localstack","Thiết lập LocalStack",[26,78,80],{"id":79},"tạo-file-docker-composeyml","Tạo file docker-compose.yml",[18,82,83],{},"Chúng ta sẽ bắt đầu LocalStack với thiết lập Docker-Compose. Tạo một file mới có tên docker-compose.yml và thêm cấu hình sau:",[85,86,91],"pre",{"className":87,"code":89,"language":90},[88],"language-text","version: \"3.8\"\n\nservices:\n  localstack:\n    container_name: \"${LOCALSTACK_DOCKER_NAME-localstack_main}\"  # Name of the container to be used\n    image: localstack\u002Flocalstack:latest  # Docker image for LocalStack, latest version\n    ports:\n      - \"127.0.0.1:4566:4566\"            # Port for accessing LocalStack Gateway from the local machine\n      - \"127.0.0.1:4510-4559:4510-4559\"  # Port range for external services\n    environment:\n      - DEBUG=1  # Enable Debug mode in LocalStack\n      - LAMBDA_REMOTE_DOCKER=0  # Turn off remote Docker usage for Lambda\n      - LAMBDA_DOCKER_FLAGS=-e NODE_OPTIONS=--inspect-brk=0.0.0.0:9229 -p 9229:9229  # Exposes port 9229 for debugging the Lambda handler code.\n      - LAMBDA_EXECUTOR=${LAMBDA_EXECUTOR-}  # Lambda execution type (if defined)\n      - DOCKER_HOST=unix:\u002F\u002F\u002Fvar\u002Frun\u002Fdocker.sock  # Link to Docker via Docker socket\n    volumes:\n      - \"${LOCALSTACK_VOLUME_DIR:-.\u002Fvolume}:\u002Fvar\u002Flib\u002Flocalstack\"  # Mount point for LocalStack data directory\n      - \"\u002Fvar\u002Frun\u002Fdocker.sock:\u002Fvar\u002Frun\u002Fdocker.sock\"  # Mount Docker socket to access Docker from the LocalStack container\n","text",[92,93,89],"code",{"__ignoreMap":94},"",[18,96,97],{},"Ngoài ra để xem thêm các cấu hình khác của LocalStack bạn có thể tham khảo link sau:",[18,99,100],{},[38,101,102],{"href":102,"rel":103},"https:\u002F\u002Fdocs.localstack.cloud\u002Freferences\u002Fconfiguration\u002F",[42],[26,105,107],{"id":106},"khởi-động-localstack-với-docker","Khởi động LocalStack với Docker",[18,109,110],{},"Chúng ta sẽ chạy lệnh sau để khởi động LocalStack:",[85,112,115],{"className":113,"code":114,"language":90},[88],"docker compose up -d\n",[92,116,114],{"__ignoreMap":94},[18,118,119],{},"Sau khi chạy lệnh trên thì chúng ta thấy Docker Container đã được Running",[121,122],"img",{"className":123,"alt":94,"src":126,"style":127},[124,125],"block","mx-auto","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002F12132634\u002Fdocker-container-start.png","width: 100%;",[18,129,130],{},"Và đã khởi động thành công LocalStack",[121,132],{"className":133,"alt":94,"src":134,"style":127},[124,125],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002F12134424\u002Flocalstack-start-success.png",[10,136,138],{"id":137},"thiết-lập-lambda-function-debugging","Thiết lập Lambda Function Debugging",[26,140,142],{"id":141},"tạo-file-launchjson","Tạo file launch.json",[18,144,145],{},"Chúng ta tạo một file .vscode\u002Flaunch.json và thêm cấu hình sau:",[85,147,150],{"className":148,"code":149,"language":90},[88],"{\n  \"version\": \"0.2.0\",\n  \"configurations\": [\n    {\n      \"address\": \"127.0.0.1\",\n      \"localRoot\": \"${workspaceFolder}\",\n      \"name\": \"Attach to Remote Node.js\",\n      \"port\": 9229,\n      \"remoteRoot\": \"\u002Fvar\u002Ftask\u002F\",\n      \"request\": \"attach\",\n      \"type\": \"node\",\n      \"preLaunchTask\": \"Wait Remote Debugger Server\"\n    },\n  ]\n}\n",[92,151,149],{"__ignoreMap":94},[26,153,155],{"id":154},"tạo-file-tasksjson","Tạo file tasks.json",[18,157,158],{},"Chúng ta tạo một file .vscode\u002Ftasks.json và thêm cấu hình sau:",[85,160,163],{"className":161,"code":162,"language":90},[88],"{\n  \"version\": \"2.0.0\",\n  \"tasks\": [\n    {\n      \"label\": \"Wait Remote Debugger Server\",\n      \"type\": \"shell\",\n      \"command\": \"while [[ -z $(docker ps | grep :9229) ]]; do sleep 1; done; sleep 1;\"\n    }\n  ]\n}\n",[92,164,162],{"__ignoreMap":94},[18,166,167],{},"Lưu ý: Đoạn code trên chỉ thực thi trên Linux và macOS. Nếu bạn đang dùng Windows thì sẽ thực hiện như sau:",[18,169,170],{},"Tạo file .vscode\u002Ftasks.json:",[85,172,175],{"className":173,"code":174,"language":90},[88],"{\n  \"version\": \"2.0.0\",\n  \"tasks\": [\n    {\n      \"label\": \"Wait Remote Debugger Server\",\n      \"type\": \"shell\",\n      \"command\": \"powershell\",\n      \"args\": [\n        \".\\\\.vscode\\\\wait-debugger.ps1\"\n      ]\n    }\n  ]\n}\n",[92,176,174],{"__ignoreMap":94},[18,178,179],{},"Tạo file .vscode\u002Fwait-debugger.ps1:",[85,181,184],{"className":182,"code":183,"language":90},[88],"while (-not (docker ps | Select-String \":9229\")) {\n  Start-Sleep -Seconds 1\n}\nStart-Sleep -Seconds 1\n",[92,185,183],{"__ignoreMap":94},[26,187,189],{"id":188},"tạo-file-functionts","Tạo file function.ts",[18,191,192],{},"Trong ví dụ này, chúng ta sẽ tạo file function.ts chứa code hàm Lambda bằng Node.js và TypeScript để kiểm tra debug:",[85,194,197],{"className":195,"code":196,"language":90},[88],"export const  handler = async (event: any) =>  {\n  const response = {\n    statusCode: 200,\n    body: \"hello word\",\n  };\n  return response;\n};\n",[92,198,196],{"__ignoreMap":94},[10,200,202],{"id":201},"tạo-lambda-function-trên-localstack","Tạo Lambda Function trên LocalStack",[18,204,205],{},"Để tạo Lambda Function trên LocalStack chúng ta sử dụng câu lệnh sau:",[85,207,210],{"className":208,"code":209,"language":90},[88],"aws --endpoint-url=http:\u002F\u002Flocalhost:4566 lambda create-function \\\n--function-name localstack-lambda-function \\\n--code S3Bucket=\"hot-reload\",S3Key=\"$(pwd)\u002F\" \\\n--handler function.handler \\\n--runtime nodejs18.x \\\n--timeout 120 \\\n--role arn:aws:iam::000000000000:role\u002Flambda-role\n",[92,211,209],{"__ignoreMap":94},[18,213,214],{},"Sau khi chạy lệnh trên thì Lambda Function đã được tạo thành công trên LocalStack",[121,216],{"className":217,"alt":94,"src":218,"style":127},[124,125],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002F13084745\u002Fcreate-lambda-function-on-localstack-1024x495.png",[10,220,222],{"id":221},"thực-hiện-debugging-lambda-function","Thực hiện Debugging Lambda Function",[18,224,225],{},"Trong VS Code bạn có thể debug bằng cách đặt các breakpoint chỗ đoạn code cần debug và nhấn F5 để chạy",[121,227],{"className":228,"alt":94,"src":229,"style":127},[124,125],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002F13091141\u002Fstart-debug-lambda-local-1024x532.png",[18,231,232],{},"Sau đó thực thi Lambda Function bằng câu lệnh sau:",[85,234,237],{"className":235,"code":236,"language":90},[88],"aws --endpoint-url=http:\u002F\u002Flocalhost:4566 lambda invoke \\\n--function-name localstack-lambda-function lambda.log \\\n--cli-binary-format raw-in-base64-out \\\n--payload '{\"hello\":\"world\"}'\n",[92,238,236],{"__ignoreMap":94},[18,240,241],{},"Sau khi chạy lệnh trên thì bạn đã debug thành công",[121,243],{"className":244,"alt":94,"src":245,"style":127},[124,125],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002F13091644\u002Fdebug-success-1024x526.png",[10,247,249],{"id":248},"thực-hiện-debugging-lambda-function-với-amazon-s3-để-trigger-aws-lambda-khi-upload-file","Thực hiện Debugging Lambda Function với Amazon S3 để trigger AWS Lambda khi upload file",[26,251,253],{"id":252},"tạo-bucket-trên-amazon-s3","Tạo bucket trên Amazon S3",[18,255,256],{},"Để tạo bucket trên Amazon S3 chúng ta sử dụng câu lệnh sau:",[85,258,261],{"className":259,"code":260,"language":90},[88],"aws s3api create-bucket --bucket local-stack-bucket --create-bucket-configuration LocationConstraint=ap-northeast-1 --endpoint-url=http:\u002F\u002Flocalhost:4566\n",[92,262,260],{"__ignoreMap":94},[18,264,265],{},"Trong đó:",[267,268,269],"ul",{},[270,271,272,275],"li",{},[14,273,274],{},"local-stack-bucket:"," là tên của bucket",[26,277,279],{"id":278},"cấu-hình-amazon-s3-trigger-đến-lambda-function","Cấu hình Amazon S3 trigger đến Lambda Function",[18,281,282],{},"Để trigger Lambda Function khi upload file lên Amazon S3 chúng ta sử dụng câu lệnh sau:",[85,284,287],{"className":285,"code":286,"language":90},[88],"aws --endpoint-url=http:\u002F\u002Flocalhost:4566 s3api put-bucket-notification-configuration \\\n    --bucket local-stack-bucket \\\n    --notification-configuration '{\n        \"LambdaFunctionConfigurations\": [\n          {\n            \"Id\": \"1\", \n            \"LambdaFunctionArn\": \"arn:aws:lambda:ap-northeast-1:000000000000:function:localstack-lambda-function\",\n            \"Events\": [\"s3:ObjectCreated:*\"]\n          }\n        ]\n    }'\n",[92,288,286],{"__ignoreMap":94},[18,290,265],{},[267,292,293,298,304],{},[270,294,295,297],{},[14,296,274],{}," là tên của bucket cần cấu hình",[270,299,300,303],{},[14,301,302],{},"LambdaFunctionArn:"," là Arn của Lambda Function cần trigger",[270,305,306,309],{},[14,307,308],{},"Events:"," là sự kiện trên Amazon S3 để trigger Lambda Function",[26,311,313],{"id":312},"tiến-hành-debug-lambda-function","Tiến hành debug Lambda Function",[18,315,225],{},[121,317],{"className":318,"alt":94,"src":319,"style":127},[124,125],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F05135231\u002Fcode-debug-1-1024x520.png",[18,321,322],{},"Sau đó tiến hành upload file lên Amazon S3 bucket trên LocalStack cloud",[121,324],{"className":325,"alt":94,"src":326,"style":127},[124,125],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F05145618\u002Fapp-localstack-1024x369.png",[18,328,329],{},"Sau khi upload file thì bạn đã debug thành công",[121,331],{"className":332,"alt":94,"src":333,"style":127},[124,125],"https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2024\u002F02\u002F05145927\u002Fresult-debug-1024x522.png",[10,335,337],{"id":336},"các-mặt-hạn-chế-của-localstack","Các mặt hạn chế của LocalStack",[18,339,340,343],{},[14,341,342],{},"Hỗ Trợ Giới Hạn Cho Dịch Vụ AWS:"," LocalStack cung cấp giả lập cho một số dịch vụ quan trọng như S3, DynamoDB, Lambda, và SQS. Tuy nhiên, không phải tất cả các dịch vụ AWS đều được hỗ trợ, và một số dịch vụ có thể không có hoặc chỉ được triển khai với một số tính năng cơ bản. Điều này có thể là một rắc rối nếu ứng dụng của bạn phụ thuộc vào các dịch vụ không được hỗ trợ.",[18,345,346,349],{},[14,347,348],{},"Thiếu Tính Năng:"," Mặc dù LocalStack giúp mô phỏng các dịch vụ, nhưng không phải tất cả các tính năng của chúng được triển khai. Các tùy chọn cấu hình có thể bị giới hạn, làm giảm sự tương thích giữa môi trường phát triển local và môi trường thực tế trên AWS.",[18,351,352,355],{},[14,353,354],{},"Khả Năng Mở Rộng Hạn Chế:"," LocalStack không thiết kế để mở rộng mạnh mẽ như môi trường AWS. Nếu bạn đang làm việc trên các dự án lớn với quy mô lớn, việc kiểm thử và phát triển trong môi trường local có thể không phản ánh đúng thực tế trên AWS.",[18,357,358,361],{},[14,359,360],{},"Sự Chậm Trễ:"," Do sự giả lập và cố gắng sao chép các dịch vụ AWS, LocalStack có thể có sự chậm trễ so với việc sử dụng các dịch vụ thực tế. Điều này có thể làm giảm hiệu suất và làm chậm quá trình phát triển và kiểm thử.",[18,363,364,367],{},[14,365,366],{},"Cập Nhật Chậm:"," LocalStack có thể không cập nhật nhanh chóng theo các phiên bản mới của dịch vụ AWS. Điều này có thể tạo ra sự không đồng bộ khi cần sử dụng các tính năng mới hoặc khi có sự thay đổi trong API của AWS.",[10,369,371],{"id":370},"kết-luận","Kết luận",[18,373,374],{},"Về việc sử dụng LocalStack giúp chúng ta phát triển và debug Lambda Function, cũng như các dịch vụ AWS khác một cách hiệu quả trên môi trường local. Nó giúp đảm bảo tích hợp và hoạt động đúng trước khi triển khai lên AWS thực tế, tiết kiệm thời gian, chi phí và giảm tác động đến tài khoản AWS thực tế của bạn trong quá trình phát triển.",[10,376,378],{"id":377},"tài-liệu-tham-khảo","Tài liệu tham khảo",[18,380,381],{},[38,382,383],{"href":383,"rel":384},"https:\u002F\u002Fdocs.localstack.cloud\u002F",[42],{"title":94,"searchDepth":386,"depth":386,"links":387},2,[388,389,395,399,404,405,406,411,412,413],{"id":12,"depth":386,"text":16},{"id":23,"depth":386,"text":24,"children":390},[391,393,394],{"id":28,"depth":392,"text":31},3,{"id":45,"depth":392,"text":48},{"id":60,"depth":392,"text":63},{"id":75,"depth":386,"text":76,"children":396},[397,398],{"id":79,"depth":392,"text":80},{"id":106,"depth":392,"text":107},{"id":137,"depth":386,"text":138,"children":400},[401,402,403],{"id":141,"depth":392,"text":142},{"id":154,"depth":392,"text":155},{"id":188,"depth":392,"text":189},{"id":201,"depth":386,"text":202},{"id":221,"depth":386,"text":222},{"id":248,"depth":386,"text":249,"children":407},[408,409,410],{"id":252,"depth":392,"text":253},{"id":278,"depth":392,"text":279},{"id":312,"depth":392,"text":313},{"id":336,"depth":386,"text":337},{"id":370,"depth":386,"text":371},{"id":377,"depth":386,"text":378},"tech talk","Briswell Vietnam Co Ltd","2024-03-08","md",{},true,"\u002Fvi\u002Fnews\u002Fdebugging-aws-lambda-voi-localstack",null,{"title":5,"description":20},"vi\u002Fnews\u002Fdebugging-aws-lambda-voi-localstack","https:\u002F\u002Fs3-ap-southeast-1.amazonaws.com\u002Fhomepage-media\u002Fwp-content\u002Fuploads\u002F2023\u002F10\u002F12100501\u002Flocalstack-image.jpg","fwvf8zilk_kswNNQri-QTeA3lPhIecxt6R2GESzCTS8",1782205036821]