AWS-də serversiz CI / CD boru kəməri necə qurulur

Hamımız kopiya / yapışdırıb çatdırılma günlərinin çoxdan keçdiyinə inanırıq. Təəssüf ki, bəzi inkişaf etdiricilər üçün bu tətbiq olunmur və seçilən metoddur. Niyə bu qədər pis olduğunu asanlıqla bütün bir məqalə yaza bilərdim, amma düşünürəm ki, özünü izah edir. Serversiz arxitekturaya meyl ilə CI / CD boru kəmərləri tətbiqlərinizin çatdırılmasında mühüm rol oynayır. Bunlar növbəti serversiz layihəniz üçün ən yaxşı üç tövsiyəmə də daxil edilmişdir.

Uzun müddətdir fasiləsiz inteqrasiya və çatdırılma ilə maraqlanırdım və bir neçə il əvvəl TeamCity ilə ilk dəfə barmaqlarımı suya batırdım. CI / CD boru kəmərlərimizin əksəriyyəti üçün bu gün də TeamCity istifadə edirik. TeamCity çox yaxşı işləyir və mən buna etiraz etmirəm, amma hər zaman işimizi necə inkişaf etdirə biləcəyimizi düşünürəm. Bunlardan biri boru kəmərlərimizi kod şəklində qura biləcəyimizdir və bu da TeamCity-nin o qədər də yaxşı bacarmadığı şeylərdən biridir.

AWS-dən əldə edilən inteqrasiya və yerləşdirmə alətlərinə daha yaxından baxdığımdan bir müddət keçdi. CodeDeploy'u EC2-də çalışan başqa bir layihə üçün istifadə edirik, amma heç vaxt serversiz bir layihə yerləşdirilməsi üçün istifadə etməmişəm. Alətlərlə tanış olduqdan sonra, CloudFormation və Lambda təmin etmək üçün yerli bir inteqrasiya var idi - ehtimal ki, AWS-dən SAM. Serversiz çərçivədən istifadə edirik və CloudFormation şablonları yaratmasına baxmayaraq AWS-dəki alətlərlə dərhal işləmir.

Hazırlaşmaq üçün

İstifadə etdiyim AWS xidmətləri EC2, Docker, ECR, S3, IAM, CodeBuild, CodePipeline, CloudWatch və CloudTrail. Hər xidmətin necə işlədiyi barədə ən azı əsas biliklərə sahib olmalısınız.

Əsasən bu təlimatın əsas götürdüyü .NET-də arxa kod yazıram. Əvvəlcədən hazırlanmış CodeBuild şəkillərinin heç birində həm .NET, həm də NodeJS işləmə müddətləri mövcud deyil (serversiz çərçivə üçün NodeJS tələb olunur). Lambda funksiyalarınızın NodeJS-də yazılması bir yerləşdirmə boru kəməri qurmağı çox asanlaşdırır, çünki Docker şəklinizə yalnız ehtiyacınız olan işləmə vaxtı quraşdırılmışdır (bu dərsliyin çox hissəsini atlaya bilərsiniz). Onu da qeyd etməliyəm ki, qablarla ilk dəfə tanış olduğum üçün yeni bir şey öyrənməkdən həyəcanlandım.

Kodunuzun git kimi bir depoda olduğunu da düşünürəm. Bu təlimatda yalnız yerləşdiriləcək kodu olan bir paketi olan bir sənəd S3-ə yüklənir. Oraya necə daxil olmağınız tamamilə sizə aiddir. Boru kəmərinizi github və CodeCommit kimi depolara bağlayaraq hər zaman daha da irəliləyə bilərsiniz.

1. EC2 nümunəsi yaradın və Docker quraşdırın

Standart bir AWS Linux 2 EC2 instansiyasını yükləməyə başlayın - bu özünü izah edə bilər. Aşağıdakı əmrlərdən istifadə edərək daxil olun və Docker quraşdırın:

sudo yum yeniləmə -y sudo amazon-linux-əlavələr yükləyin docker sudo xidməti başlamaq docker

Ec2 istifadəçisini Docker qrupuna əlavə etməliyik ki, sudo istifadə etmədən Docker əmrlərini çalışdıra biləsiniz:

sudo usermod -a -G docker ec2-user

Komutu yerinə yetirdikdən sonra EC2 istifadəçilərinin yeni icazələri ala bilməsi üçün çıxın və EC2 instansiyanıza yenidən daxil olun. Sonra ec2 istifadəçisinin sudo olmadan Docker əmrlərini işlədə biləcəyinə əmin olun:

Docker məlumatı
Docker Info əmrinin çıxışı

2. Docker şəklini yaradın və ECR düyməsini basın

Yuxarıdakı addımın uğurlu olduğunu fərz etsək, növbəti addım Docker görüntüsünü yaratmaq və ECR-yə itələməkdir. AWS, Github-da CodeBuild üçün əsas şəkilləri təmin edir ki, bu da öz imicimizi qurmağı asanlaşdırır.

Öz şəklinizi yaratmaq üçün aşağıdakıları etmək istəmirsinizsə şəklimi github-da dərc etdim: https://github.com/effectivedigital/serverless-deployment-image

Şəkillər klonlaşdırmağa və .NET Core 2.1 qovluğuna keçməyə başlayın:

Git klon https://github.com/aws/aws-codebuild-docker-images.git cd aws-codebuild-docker-images cd ubuntu / dot-net / core-2.1 /

Dockerfile'yi sevdiyiniz mətn redaktorunda açın:

nano Dockerfile

Dockerfile-də olan digər əmrlərin sonunda NodeJS və serversiz çərçivəni quraşdırmaq üçün əmrləri əlavə edin. Bu əmrlərin əksəriyyətini NWEJS Docker görüntüsündən AWS-dəki eyni deposundan ala bildim:

# Düyün Asılılıqlarını qurun ENV NODE_VERSION = "10.14.1"
# GPG əsas https://github.com/nodejs/node#release-team RUN dəsti verilmişdir -Ex \ && Input \ 94AE36675C464D64BAFA68DD7434390BDBE9B9C5 \ B9AE9905FFD7803F25714661B63B535A4C206CA9 \ 77984A986EBC2AA786BC0F66B01FBB92821C587A \ 56730D5401028683275BD23C23EFEFE93C4CFFFE \ 71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 \ FD3A5288F042B6850C66B31F09FE44734EB7990E \ 8FCCA13FEF1D0C2E91008E09770F7A9A5AE15600 \ C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 \ DD8F2338BAE7501E3DD5AC78C273792F7D83545D \ 4ED778F539E3634C779C87C6D7062848A1AB005C \ A48C2BEE680E841632CD4E44F07496B3EB3C1762 \; make \ gpg - keyserver hkp: //p80.pool.sks-keyservers.net: 80 - recv-keys "$ key" || \ gpg - keyserver hkp: //ipv4.pool.sks-keyservers.net - recv-keys "$ key" || \ gpg - keyserver hkp: //pgp.mit.edu: 80 - recv-düymələri "$ key"; \ done RUN set -ex \ && wget "https://nodejs.org/download/release/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.gz" -O node-v $ NODE_VER $ && wget "https://nodejs.org/download/release/v$NODE_VERSION/SHASUMS256.txt.asc" -O SHASUMS256.txt.asc \ && gpg - toplu - şifrəni aç - SHASUMS256.txt SHASUMS256.txt.asc \ && grep "node-v $ NODE_VERSION-linux-x64.tar.gz \ $" SHASUMS256.txt | sha256sum -c - \ && tar -xzf "node-v $ NODE_VERSION-linux-x64.tar.gz" -C / usr / local - strip-elements = 1 \ && rm "node-v $ NODE_VERSION-linux-x64. tar.gz "SHASUMS256.txt.asc SHASUMS256.txt \ && ln -s / usr / local / bin / knoten / usr / local / bin / knotenjs \ && rm -fr / var / lib / apt / lists / * / tmp / * / var / tmp / *
RUN npm təhlükəli-permi doğru olaraq təyin edir
CMD ["düyün"]
# Serverless Framework RUN setini quraşdırın -ex \ && npm install -g serverless

İndi şəkil yaradıla bilər və qeyd edilə bilər:

docker build -t aws / codebuild / dot-net.

Quruluş tamamlandıqdan sonra, bütün funksiyaların işlədiyini və Serverless-in düzgün quraşdırıldığını təsdiqləmək üçün görüntü işlədilə bilər:

docker run -it --entrypoint sh aws / codebuild / dot-net -c bash
sls -v
Yeni yaradılmış konteynerdə sls -v düyməsini işə salın

Sonra AWS CLI istifadə edərək ECR-də bir depo yaradacağıq. Komanda işə salındıqdan sonra AWS konsolunda yeni depo görünəcək:

aws ecr create-repository --repositoryname codebuild-dotnet-node
ECR-də depo yaratdıqdan sonra AWS CLI-nin cavabıECR-də yeni yaradılan anbar

İndi əvvəllər yaratdığımız aws / codebuild / dot-net görüntüsünü əvvəlki addımdakı repositoryUri dəyəri ilə qeyd edirik:

Docker etiketi aws / codebuild / dot-net .dkr.ecr.ap-south-2.amazonaws.com / codebuild-dotnet-node

Konteyner qeydiyyatı üçün Docker giriş identifikasiyası əmr sətrini almaq üçün get-login əmrini işə salın:

aws ecr get-login - e-poçt daxil edilmir
ECR ilə identifikasiya üçün giriş əmri

Son mərhələdə get-login əmrini işə salmaqla qaytarılmış Docker giriş əmrini çalıştırın.

Docker giriş -u AWS -p eyJwYXlsb2FkIjoiNGZnd0dSaXM1L2svWWRLMmhJT1c0WWpOZEcxamJFeFJOK2VvT0Y5 [...] https: // .dkr.ecr.ap-south-2.amazonazon

Giriş uğurlu olarsa, artıq Docker şəklimizi ECR-də yaradılan depoya köçürə bilərik. Bitmiş görüntünün ölçüsündən asılı olaraq bir neçə dəqiqə çəkə bilər:

Docker təkan .dkr.ecr.ap-south-2.amazonaws.com / codebuild-dotnet-node
EC2 üzərindəki doker imicimizi yaradırECR-də Docker şəkli

Şəkil yaradıldıqdan sonra hər kəs ECR vasitəsilə şəkilə daxil ola bilər. İcazə istehsal mühitində kilidlənməlidir. Lakin bu nümunə açıq olmağa imkan verir. AWS konsolunda İcazələr nişanına gedin, JSON Siyasətini Düzəliş et seçin və bu siyasəti yapışdırın:

{"Versiya": "2008-10-17", "Bəyanat": [{"Sid": "EnableAccountAccess", "Effect": "Allow", "Director": "*", "Action": ["ecr" : BatchCheckLayerAvailability "," ecr: BatchGetImage "," ecr: DescribeImages "," ecr: DescribeRepositories "," ecr: GetAuthorizationToken "," ecr: GetDownloadUrlForLayer "," ecr: GetRepository "ol, "

3. Boru kəmərinizi tikin

Boru kəmərinin çəkilməsinin vaxtı gəldi. Bunu tətbiq etməyi asanlaşdırmaq və daha təkrarlamaq üçün, serversiz çərçivədən istifadə edərək boru kəməri yaratdım. Eyni şeyi CloudFormation-da quraraq həyata keçirə bilərsiniz.

Mənim serverless.yml sənədimdən bütün mənbəyi daxil etməyəcəm, bunun əvəzinə github-dan klon edə bilərsiniz: https://github.com/effectivedigital/serverless-deployment-pipeline

Nə edəcəyini dəqiq başa düşmək üçün serversiz şablona nəzər yetirin, amma bir sözlə quracaq:

  • 3x S3 kovalar
  • 1x vedrə qaydası
  • 3x IAM rolları
  • 1x CodeBuild layihəsi
  • 1x CodePipeline boru kəməri
  • 1x CloudWatch tədbiri
  • 1x CloudTrail Trail

Klonlaşdırdıqdan sonra DockerImageArn-ı ECR-dəki şəklinizə yeniləyin. Deployment.zip xaricində bir fayl adı ilə yerləşdirmə paketləri yaradırsınızsa, DeploymentFilename-i də yeniləyin:

DockerImageArn: .dkr.ecr.ap-southern-2.amazonaws.com / codebuild-dotnet-node: latest DeploymentFilename: Deployment.zip

Boru kəməri artıq istifadəyə hazırdır. Serversiz yerləşdirmə əmrini işə salın və hər şeyin sizin üçün qurulmasını gözləyin:

sls yerləşdirmək -v
Sunucusuz bir çərçivə tərəfindən qurulmuş CloudFormation yığınımızServersiz çərçivə tərəfindən yaradılan CodePipeline boru kəməriServersiz çərçivə tərəfindən yaradılan CodeBuild layihəsi

4. Tətbiqinizə buildSpec.yml əlavə edin

S3-dəki CodePipeline, yerləşdirmə sənədində bir dəyişiklik aşkar etdikdə, CodeBuild-i tətbiqetməni işə salmağa və yerləşdirməyə yönəldir. Bununla birlikdə, CodeBuild, tətbiqinizi qurmaq və yerləşdirmək üçün hansı əmrlərin işə salınması lazım olduğunu da bilməlidir. BuildSpec.yml CodeBuild-in əməl etdiyi təlimatları ehtiva edir.

Aşağıdakı nümunə buildSpec.yml faylını ehtiva edən həqiqətən sadə bir Hello World tətbiqetməsi yaratdım: https://github.com/effectivedigital/serverless-deployment-app

Alternativ olaraq, mövcud tətbiqlərinizdə buildSpec.yml faylı yarada və aşağıdakı təlimatlarla doldurun:

versiya: 0.2
Mərhələlər: pre_build: Commands: - chmod a + x * build: Commands: - ./build.sh post_build: Commands: - sls deploy -v -s $ STAGE

5. Boru kəmərinizi sınayın

İndi boru kəmərinizi ilk dəfə idarə etmək üçün hər şey hazırdır. Serversiz tətbiqiniz üçün bütün sənədləri və buildSpec.yml faylını ehtiva edən Deployment.zip adlı paket yaradın.

Bir neçə dəqiqədən sonra CloudTrail PutObject hadisəsini qeyd etməli və daha sonra CodePipeline-ı işə salmağa imkan verən bir CloudWatch hadisə qaydasını işə salmalıdır.

Deployment.zip S3-ə yükləndiCodePipeline başladı və inşa işləri davam edir

AWS CodeBuild addımının təfərrüatlarına vursaq, tikinti və yerləşdirmənin gedişatını görə bilərik:

CodeBuild, nəticəni qurma və yerləşdirmə işləri aparan Docker görüntüsündən alırMissiyamız uğurlu oldu!

Boru kəmərimiz tərəfindən verilən yeni tətbiq CloudFormation-da da görünür:

Sadə tətbiqetməmizdə yaradılan API son nöqtəsini test edə bilərik (url CodeBuild çıxışında və ya API keçidindədir) və tətbiqimizin uğurla işlədiyini görə bilərik:

API göndərmək üçün poçtalyondan istifadə

Xülasə

CodePipeline, ölçeklenebilir, çevik və sərfəli bir CI / CD boru kəməri qurmağınıza və server tərəfindən qurulan ənənəvi boru kəmərləri ilə əlaqəli bəzi problemləri həll etməyə imkan verir.

Bir addım daha irəli getməyi və yerləşdirmə başa çatdıqdan sonra qarışığa vahid testlərini əlavə etməyi çox istərdim, baxmayaraq ki, bu, özünün bir məqaləsini tələb edir - gələcəkdə gözləyəcəyimiz bir şey!

Slack icmamıza qoşulun və həftəlik əsas mövzumuzu oxuyun ⬇

Bu yazı faydalı olsaydı, müəllif üçün dəstəyinizi göstərmək üçün bir neçə dəfə cl düyməsini vurun! ⬇