Kako izraditi CI / CD cjevovod bez poslužitelja na AWS

Svi bismo željeli misliti da su dani umnožavanja kopiranja i lijepljenja odavno prošli, nažalost to nije slučaj i još uvijek preferiraju način isporuke za neke programere. Lako bih mogao napisati čitav članak zašto je to loše, ali mislim da je to prilično samouvjereno. S trendom prema arhitekturi bez poslužitelja, CI / CD cjevovodi igraju glavnu ulogu u vašoj isporuci aplikacija. Oni također sadrže moja 3 glavna savjeta za vaš sljedeći projekt bez poslužitelja.

Kontinuirana integracija i isporuka nešto me je dugo zanimalo i prvi put sam uronio nožne prste u vodu s TeamCity-om prije više godina. I dalje koristimo TeamCity za većinu naših CI / CD cjevovoda. TeamCity djeluje sjajno i nemam ništa protiv, ali uvijek gledam kako poboljšati ono što radimo. Jedna od tih stvari je stvaranje naših cjevovoda kao koda - što je jedna od stvari u kojoj TeamCity nije tako dobar.

Prošlo je neko vrijeme od kada sam detaljno pogledao alate za integraciju i isporuku AWS je dostupan i dok koristimo CodeDeploy za drugi projekt koji radi na EC2, nikad ih nisam koristio za implementaciju projekta bez poslužitelja. Nakon što sam se ponovo upoznao sa alatima koje sam mogao vidjeti, sada postoji naravna integracija za implementaciju CloudFormation-a i Lambda - vjerojatno s AWS-ovim SAM - koristimo okvir bez poslužitelja i iako generira predloške CloudFormation, to ne radi bez okvira s alatima. u AWS.

Priprema se

AWS usluge koje ću koristiti su EC2, Docker, ECR, S3, IAM, CodeBuild, CodePipeline, CloudWatch, CloudTrail. Trebat ćete razumjeti barem osnovnu razinu onoga što svaka od tih usluga mora učiniti nakon toga.

Prvenstveno pišem backkend kod u .NET, na čemu se temelji ovaj vodič. Nijedna od unaprijed izgrađenih CodeBuild slika na njima nema i .NET i NodeJS (NodeJS je potreban za okvir bez poslužitelja). Ako su vaše Lambda funkcije napisane u NodeJS-u, postupak postavljanja cjevovoda za implementaciju postaje puno jednostavniji, jer je jedino vaše vrijeme izvođenja potrebno instalirati na vašu Docker sliku (potencijalno biste mogli preskočiti puno ovog vodiča). Također bih trebao spomenuti, ovo je bilo moje prvo upoznavanje s kontejnerima, pa sam bio uzbuđen što sam naučio nešto novo.

Pretpostavljam i da vaš kod živi u nekoj vrsti skladišta kao što je git. Za ovaj ćemo samo učitati datoteku u S3 koja sadrži paket koda koji će se implementirati - na vama je kako ovisite. Uvijek možete ići dalje od onoga što sam stvorio povezivanjem cjevovoda sa spremištima, kao što su github ili CodeCommit.

1. Napravite EC2 instancu i instalirajte Docker

Započnite spinovanjem standardne instance AWS Linux 2 EC2 - to bi trebalo biti samo po sebi razumljivo. Prijavite se i instalirajte Docker pomoću ovih naredbi:

sudo yum update -y
sudo amazon-linux-dodaci instaliraju docker
sudo servis docker start

Također ćemo trebati dodati ec2 korisnika u docker grupu kako biste mogli izvršavati Docker naredbe bez korištenja sudo:

sudo usermod -a -G docker ec2-korisnik

Nakon izvršenja naredbe, odjavite se i ponovno se prijavite u EC2 instancu kako bi korisnik ec2 mogao preuzeti nova dopuštenja. Zatim provjerite može li korisnik ec2 pokrenuti Docker naredbe bez sudo:

informacije o dockeru
Izlaz naredbe informacije za doktora

2. Izgradite Docker sliku i gurnite na ECR

Pod pretpostavkom da je gornji korak uspješan, sljedeća faza je izrada Dockerove slike i guranje na ECR. AWS pruža osnovne slike za CodeBuild na githubu, što olakšava izgradnju naše slike.

Objavio sam i svoju sliku na githubu ako ne želite proći korake u nastavku kako biste izradili vlastiti: https://github.com/effectivedigital/serverless-deployment-image

Započnite kloniranjem slika i navigacijom u .NET Core 2.1 direktorij:

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

Otvorite Dockerfile u željenom uređivaču teksta:

nano Dockerfile

Na kraju ostalih naredbi već u Dockerfileu dodajte naredbe za instaliranje NodeJS i okvira bez poslužitelja. Uspio sam dobiti većinu ovih naredbi iz slike NodeJS Docker iz istog spremišta iz AWS-a:

# Instalirajte čvorove ovisnosti
ENV NODE_VERSION = "10.14.1"
# gpg ključevi navedeni na https://github.com/nodejs/node#release-team
RUN set -ex \
 && za ključ u \
 94AE36675C464D64BAFA68DD7434390BDBE9B9C5 \
 B9AE9905FFD7803F25714661B63B535A4C206CA9 \
 77984A986EBC2AA786BC0F66B01FBB92821C587A \
 56730D5401028683275BD23C23EFEFE93C4CFFFE \
 71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 \
 FD3A5288F042B6850C66B31F09FE44734EB7990E \
 8FCCA13FEF1D0C2E91008E09770F7A9A5AE15600 \
 C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 \
 DD8F2338BAE7501E3DD5AC78C273792F7D83545D \
 4ED778F539E3634C779C87C6D7062848A1AB005C \
 A48C2BEE680E841632CD4E44F07496B3EB3C1762 \
 ; čini \
 gpg - keyserver hkp: //p80.pool.sks-keyservers.net: 80 - tipke recv "$ key" || \
 gpg - keyserver hkp: //ipv4.pool.sks-keyservers.net - recv-tipke "$ tipka" || \
 gpg - keyserver hkp: //pgp.mit.edu: 80 - recv-tipke "$ tipka"; \
 učinio
RUN set -ex \
 && wget "https://nodejs.org/download/release/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.gz" -O čvor-v $ NODE_VER $
 && wget "https://nodejs.org/download/release/v$NODE_VERSION/SHASUMS256.txt.asc" -O SHASUMS256.txt.asc \
 && gpg - serija - dešifriranje - izlaz 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 - komponente-strip = 1 \
 && rm "node-v $ NODE_VERSION-linux-x64.tar.gz" SHASUMS256.txt.asc SHASUMS256.txt \
 && ln -s / usr / local / bin / node / usr / local / bin / nodejs \
 && rm -fr / var / lib / apt / liste / * / tmp / * / var / tmp / *
RUN npm postavljeno je nesigurno
CMD ["čvor"]
# Instaliraj bez servera
RUN set -ex \
 && npm instalirajte -g bez poslužitelja

Sada se slika može graditi i označiti:

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

Nakon dovršetka izgradnje slika se može pokrenuti kako bi se potvrdilo da sve radi i da se server nije ispravno instalirao:

docker run -it --entrypoint sh aws / codebuilding / dot-net -c bash
sls -v
Trčanje sls -v unutar novostvorenog spremnika

Zatim ćemo stvoriti spremište u ECR-u pomoću AWS CLI. Nakon izvršavanja naredbe, novo spremište će biti vidljivo na AWS konzoli:

aws ecr create-repository --repository-name codebuild-dotnet-čvor
Odgovor od AWS CLI nakon kreiranja spremišta u ECR-uNovo stvoreno spremište u ECR-u

Sada ćemo označiti sliku aws / codebuild / dot-net koju smo stvorili ranije s vrijednošću Uri repozitorija iz prethodnog koraka:

docker tag aws / codebuild / dot-net  .dkr.ecr.ap-jugoistok-2.amazonaws.com / codebuild-dotnet-čvor

Pokrenite naredbu get-login za dobivanje naredbenog niza naredbe za prijavu docker za registar spremnika:

aws ecr get-prijava - no-include-email
Naredba za prijavu za autentifikaciju u ECR

Pokrenite naredbu za prijavu na docker koja je vraćena pokretanjem naredbe get-prijava u posljednjem koraku.

prijava za docker -u AWS -p eyJwYXlsb2FkIjoiNGZnd0dSaXM1L2svWWRLMmhJT1c0WWpOZEcxamJFeFJOK2VvT0Y5 [...] https: //  .dkr.ecr.ap-southeast-s-ma

Ako je prijava uspješna, sada možemo poslati svoju docker sliku u spremište stvoreno u ECR-u. Ovisno o veličini gotove slike, može potrajati nekoliko minuta:

docker push  .dkr.ecr.ap-jugoistok-2.amazonaws.com / codebuild-dotnet-čvor
Docker na EC2 stvara našu slikuSlika Dockera u ECR-u

Nakon što je slika stvorena, dopustit ćemo svima da pristupaju s slike iz ECR-a. Dopuštenje treba biti zaključano u proizvodnom okruženju, ali u ovom ćemo primjeru omogućiti da bude otvoreno. Otvorite karticu Dozvole na AWS konzoli, odaberite Uredi politiku JSON i zalijepite u ovo pravilo:

{
  "Verzija": "2008-10-17",
  "Izjava": [
    {
      "Sid": "EnableAccountAccess",
      "Učinak": "Dopusti",
      "Glavni": "*",
      "Akcija": [
        "ECR: BatchCheckLayerAvailability"
        "ECR: BatchGetImage"
        "ECR: DescribeImages",
        "ECR: DescribeRepositories",
        "ECR: GetAuthorizationToken"
        "ECR: GetDownloadUrlForLayer"
        "ECR: GetRepositoryPolicy"
        "ECR: ListImages"
      ]
    }
  ]
}

3. Napravite svoj cjevovod

Vrijeme je za izgradnju cjevovoda. Da bih ovo olakšao i opetovano implementirao i u pravom obliku arhitekture bez poslužitelja, izgradio sam cjevovod koristeći okvir bez servera. Isto biste mogli postići tako da ga izradite u CloudFormationu.

Neću zalijepiti cijeli izvor iz moje datoteke serverless.yml, umjesto toga možete ga klonirati iz github: https://github.com/effectivedigital/serverless-deployment-pipeline

Pogledajte predložak bez poslužitelja da biste točno shvatili što će raditi, ali ukratko će se postaviti:

  • 3x S3 kante
  • 1x pravila o kantama
  • 3x IAM uloge
  • 1x CodeBuild projekt
  • 1x cjevovod CodePipeline
  • 1x CloudWatch događaj
  • 1x CloudTrail staza

Nakon kloniranja ažurirajte DockerImageArn na svoju sliku u ECR-u. Ako kreirate pakete za implementaciju s imenom datoteke koja nije Deployment.zip, ažurirajte i naziv DeploymentFilename:

DockerImageArn:  .dkr.ecr.ap-jugoistok-2.amazonaws.com / codebuild-dotnet-čvor: najnovije
DeploymentFilename: Deployment.zip

To je to, cjevovod je sada spreman za uporabu. Pokrenite naredbu implementacije bez poslužitelja i pričekajte dok se sve postavi za vas:

sls implementirati -v
Naš CloudFormation stak kreiran od strane okvira bez poslužiteljaCodePipeline cjevovod kreiran od strane okvira bez poslužiteljaCodeBuild projekt kreiran od strane okvira bez poslužitelja

4. Dodajte buildSpec.yml u aplikaciju

Kad CodePipeline otkrije promjenu datoteke za implementaciju u S3, to će reći CodeBuild da se pokrene i pokuša izgraditi i implementirati vašu aplikaciju. U skladu s tim, CodeBuild također mora znati koje naredbe treba pokrenuti za izgradnju i implementaciju vaše aplikacije, buildSpec.yml ima upute koje CodeBuild slijedi.

Napravio sam zaista jednostavnu hello svijet aplikaciju koja uključuje primjer buildSpec.yml datoteke koju možete uključiti: https://github.com/effectivedigital/serverless-deployment-app

Alternativno, možete stvoriti buildSpec.yml datoteku u postojećim aplikacijama i na nju napuniti upute u nastavku:

inačica: 0,2
faze:
  pre_build:
    naredbe:
      - chmod a + x *
  izgraditi:
    naredbe:
      - ./build.sh
  post_build:
    naredbe:
      - sls implementirati -v -s $ STAGE

5. Ispitivanje plinovoda

Sada je sve na svom mjestu da prvi put pokrenete svoj Pipeline. Napravite paket pod nazivom Deployment.zip koji treba sadržavati sve datoteke za vašu aplikaciju bez poslužitelja i datoteku buildSpec.yml.

Nakon nekoliko trenutaka CloudTrail bi trebao zabilježiti događaj PutObject, pokrenite Pravilo događaja CloudWatch koji će tada pokrenuti CodePipeline da se pokrene.

Deployment.zip je prenesen u S3CodePipeline je započeo i izgradnja je u tijeku

Ako kliknemo na detalje AWS CodeBuild koraka, možemo pogledati napredak izgradnje i implementacije:

CodeBuild će dobiti izlaz iz Dockerove slike koja izvodi izgradnju i implementacijuNaša implementacija bila je uspješna!

Nova aplikacija koju je rasporedio naš Pipeline također je vidljiva u CloudFormationu:

Možemo testirati krajnju točku API-ja stvorenu u našoj jednostavnoj aplikaciji (URL se nalazi na CodeBuild izlazu ili API-u Gateway) i vidimo da naša aplikacija uspješno radi:

Upotreba poštara za pozivanje na naš API

Sažetak

CodePipeline omogućava vam stvaranje skalabilnog, fleksibilnog i jeftinog CI / CD cjevovoda i pomaže u rješavanju nekih problema povezanih s tradicionalnim cjevovodima stvorenim na poslužiteljima.

Volio bih učiniti ovaj korak dalje i dodati testiranje jedinice u miks nakon što se implementacija dovrši, mada to jamči vlastiti članak - nešto na čemu bi trebali raditi u budućnosti!

Pridružite se našoj zajednici Slack i čitajte naše tjedne Faun teme ⬇

Ako je ovaj post bio od pomoći, molimo kliknite gumb clap nekoliko puta ispod da pokažete autoru svoju podršku! ⬇