Continuous Deployment with Serverless Computing
буюу AWS Lambda-г + GitLab CI/CD-тай хослуулах нь
Continuous Deployment: Ensures that every change to the system is releasable
Continuous Delivery/Deployment (CD) гэдэг нь CI-н дараачийн алхам бөгөөд хэрэглэгчийн гар дээр бүтээгдэхүүнийг хүргэх тэр процессыг автоматжуулахыг хэлдэг.
— GitLab CI/CD (Continuous Delivery гэж юу вэ?)
Serverless computing: Огт сервергүй гэсэн үг биш.
Хамгийн энгийнээр хэлбэл өөрсдийн аппликэйшндээ зориулж байнга сервер асаах хэрэггүй гэсэн үг. Хэрэгцээ гарах үед resource хуваарилагдаж ажиллаад, дуусах үед устгачихдаг тул бүр их хямд байх боломжтой, мөн маш хурдан scale хийж олон сая хүсэлтийг даах чадалтай байдаг.
— How I got my first AWS certification
Serverless computing-н AWS дээрх хувилбар нь Lambda. Дан ганц backend гэлтгүй File, Stream processing гэх мэт янз бүрийн зүйлд ашиглаж болно.
AWS Lambda: a serverless, event-driven compute service that lets you run code without provisioning or managing servers.
Харин өнөөдрийн хувьд AWS Lambda функцийг хэрхэн GitLab CI/CD-р автоматжуулахыг туршицгаана аа.
Сонголт
GitLab documentation лүү орвол Deploying AWS Lambda function using GitLab CI/CD гэсэн хэсэгт 2 сонголт бий. Нэг нь Serverless Framework бол нөгөөх нь AWS’ Serverless Application Model (SAM). Өнөөдрийн хувьд хэдүүлээ 2дох сонголтын дагуу явна.
AWS SAM: өөрсдийнх нь гаргасан serverless app хийхэд хялбаршуулсан tool.
- Open Source, uses CloudFormation, local build & test, CI/CD configurable
За тэгээд туршилтаа хийхийн тулд 1. SAM CLI суулгах, 2. жишээ апп үүсгэх (Lambda function + API Gateway) болон 3. CI/CD холбох хэрэгтэй.
1. SAM CLI суулгах
Миний хувьд Ubuntu 20.04/Linux ашигладаг болохоор доорх командаар татаж авч суулгалаа.
2. Жишээ апп үүсгэх
GitLab дээр 1 хоосон төсөл үүсгээд, түүнийгээ local-руугаа clone-доод, дотор нь SAM CLI команд ажиллуулна. (sam init)
sam init -r python3.8 -n gitlabpoc --app-template "hello-world"
За мэдээж дээрх үүсгэсэн төслөө AWS-руу deploy хийх учир хэрэглэх account, programmatic access хийх AWS_ACCESS_KEY_ID
, AWS_SECRET_ACCESS_KEY
2 хэрэг болно. Мөн тэрийгээ GitLab CI/CD → Settings → Variables хэсэгт тохируулах шаардлагатай.
GitLab CI/CD-д зориулж .gitlab-ci.yml
файл хэрэгтэй. Доорх загварын <S3_bucket_name> хэсгийг Lambda code хийх S3 bucket нэрээр солихоо мартав аа!
.gitlab-ci.yml
file addedGitLab CI/CD pipeline ажиллахын тулд GitLab runner тохируулсан байх хэрэгтэй. Үгүй бол pending гэсэн ийм л бичигтэй нүүр тулна даа.
Жишээ болгоод AWS EC2 дээр Ubuntu20.04 instance асаагаад дотор нь GitLab Runner суулгаад, register хийж болно. Мөн Docker суулгаарай. GitLab runner-аа Docker төрлийнхийг үүсгэнэ ээ.
Хэрвээ амжилттай болбол GitLab project-н Settings → CI/CD → Runners хэсэгт ингэж харагдах ёстой. ✅
Бүх юм бэлэн болсон бол git push хийх болгонд CI/CD ажиллаад deployment ШУУД явагдах ёстой. (одоогийн тохиргоогоор) Гэхдээ бодит амьдрал дээр Merge Request дээр ажиллахаар тохируулж мөн гараар deploy хийх товч дардаг байдлаар ажиллуулдаг.
Log дээр харагдаж буй API Gateway линк https://e1t3vuph5b.execute-api.us-east-1.amazonaws.com/Prod/hello
дээр дарж ажиллаж байгаа эсэхийг шалгах боломжтой.
Ингээд л болоо. Шинээр кодын өөрчлөлт орж ирэх болгонд API Gateway болон Lambda function маань байнга автоматаа шинэчлэгддэг болчихлоо.
Шинэ хувилбараа гаргаад Python Lambda функцынхаа буцааж байгаа мессежийг өөрчлөөд hello world
-г hello BEBI
болгоод push хийе.
Push хийсний дараа CI/CD pipeline дотор шинэ ажил явагдана.
Амжилттай дууссаны дараа өмнөх API Gateway link маань өөрчлөгдөөгүй хэвээрээ ч хүсэлтийн хариуд hello BEBI
гэж буцаана. Зөвхөн кодын л өөрчлөлт орсон тул.
Ингээд Lambda-г GitLab CI/CD ашиглан автоматжуулах тест маань амжилттай боллоо. Ажиллагааны хувьд энгийн backend project-н CI/CD-ээс ялгарахгүй бөгөөд Deploy хийхээс өмнө тестийн хэсгийг ч бас оруулж өгч болно. Мөн өөр өөр version гаргах уу, Dev/Stage/Prod аль орчинруу deploy хийх гэх мэт олон тохиргоог нэмэх боломж бий.Өнөөдрийн нийтлэл маань ингээд дуусаж байна. Дараа харин юуг турших вэ?
Testing locally with SAM:
Хүсвэл SAM CLI ашиглан local тест хийж болно. Эхний удаа run-дахад харин Docker image татах байх. Түүний дараа бол шууд функц ажиллаад хариугаа өгнө.
sam local start-api -> curl "http://127.0.0.1:3000/hello"