Execute scripts on EC2 without ssh access.

3 min. read


O jenkins agentoch počul snáď každý. Jednoduché inštancie, ktoré zavoláme on-demand, keď ich potrebujeme, vykonajú úlohu a efektívne ich vypneme.

Premýšľali ste niekedy nad tým, ako presne sa títo agenti vytvárajú? Ja áno, dlho, ale aj tak ma prekvapila miera zložitosti, ktorú som musel prekonať, aby som ich vytvoril.

Cieľ

Vytvoriť jenkins agenta, ktorý sa spawne na AWS ECS ako fargate task a vykoná úlohu, ktorú mu zadáme. Po dokončení úlohy sa automaticky vypne. Ušetrí nám to, čas, peniaze a zároveň je to bezpečnejšie, ako spúšťať jenkins agenta na EC2 inštancii, ktorá je vystavená na internete.

AWS ECS Jenkins agenti

Na vytvorenie jenkins agenta, ktorý by bol spojený s našim master/main jenkins serverom a zároveň vykonával úlohy na AWS ECS, potrebujeme viacero krokov:

  • Dokerizovať našu aplikáciu
  • Vytvoriť ECS cluster
  • Vytvoriť ECS task definition
  • Inštalovať AWS ECS plugin pre jenkins
  • Vytvoriť Docker image s jenkins agentom

Poďme na to postupne a presne odspodu :)

Requirements

Predtým ako začneme, vyriešme najskôr dôležité veci:

  • IAM Role pre ECS task
  • Security Groups

IAM Role pre ECS task

Predpokladám, že využívate nastavenie IAM role pre Jenkins server. Do sekcie Trusted advisors potrebujeme doplniť novú rolu, pokiaľ ešte nemáme:

{
  "Sid": "",
  "Effect": "Allow",
  "Principal": {
      "Service": "es.amazonaws.com"
  },
  "Action": "sts:AssumeRole"
}

K samotnej role pre jenkins server potrebujeme doplniť nasledovné povolenia:

{
  "Sid": "VisualEditor2",
  "Effect": "Allow",
  "Action": [
      "ecs:DescribeTaskDefinition",
      "ecs:DeregisterTaskDefinition",
      "ecs:RunTask",
      "ecs:RegisterTaskDefinition",
      "ecs:StopTask",
      "ecs:DescribeContainerInstances",
      "ecs:DescribeTasks",
      "ecs:ListTaskDefinitions",
      "ecs:ListClusters",
      "ecs:DescribeClusters",
      "ecs:ListTagsForResource",
      "ecs:ListContainerInstances",
  ],
  "Resource": "*"
}

Nezabudnite opraviť povolenia podľa vlastných potrebieb, najmä sekciu Resource.

Security Group pre ECS task

Náš Jenkins server musí vedieť komunikovať s jenkins agentom. Vytvoríme 2 security groups, jednu pre hlavný Jenkins server a druhú pre agenta:

# Jenkins server security group
Inbound:
- TCP 8080 from <agent-security-group>
- TCP 50000 from <agent-security-group>

# Jenkins agent security group
Inbound:
- Whatever you need

Komunikácia medzi Jenkins serverom a Jenkins agentom prebieha z agenta -> na server. Agent potrebuje povolené porty iba ak to vyžaduje aplikácia alebo úloha, ktorú chceme na agentovi vykonávať.

Create Docker image pre jenkins agenta

Vytvoríme si vlastný docker image, ktorý obashuje Jenkins agenta. Keďže tento docker image plánujeme použiť na front-endové aplikácie, pridáme aj Node.js 18 a ďalšie doplnkové package yarn a awscli. Tento predinštalovaný image bude následne pracovať s našou aplikáciu, ktorú mu pošleme cez hlavný Jenkins server.

FROM node:18.17.0-alpine AS node
FROM jenkins/inbound-agent:alpine

USER root
RUN apk update
RUN apk add ca-certificates curl g++ make

# Node.js
COPY --from=node /usr/lib /usr/lib
COPY --from=node /usr/local/share /usr/local/share
COPY --from=node /usr/local/lib /usr/local/lib
COPY --from=node /usr/local/include /usr/local/include
COPY --from=node /usr/local/bin /usr/local/bin

# Image specific
RUN apk add yarn
RUN apk --no-cache add python3 py3-pip
RUN  pip3 install --upgrade pip \
  && pip3 install --no-cache-dir awscli
RUN node -v
RUN yarn -v
RUN mkdir -p /home/jenkins && chown -R 1000:1000 /home/jenkins

# Jenkins directory
WORKDIR /home/jenkins

ENTRYPOINT ["/usr/local/bin/jenkins-agent"]

Amazon Elastic Container Service (ECS) / Fargate Plugin pre Jenkins

Inštalácia jednoduchá, stačí nainštalovať plugin do Jenkinsa. Bližšie informácie

Vytvoriť ECS task definition

Vytvoriť ECS cluster

9. July 2023
Posted in AWS
Tomas
Tomas

Software developer, lives in Zilina, Slovakia. Fan of modern web technologies, digitalization, cloud and education. Also co-owner of a local coffee brand - Kava Doppio