Per seguire questo workshop, è necessario preparare il tuo ambiente con le seguenti dipendenze:
- Terraform: Assicurati di avere Terraform installato nel tuo sistema. Puoi scaricare e installare Terraform seguendo le istruzioni dalla pagina ufficiale di Terraform.
- AWS CLI: Assicurati di avere AWS CLI installato e configurato con le tue credenziali AWS. Puoi installare AWS CLI seguendo la documentazione ufficiale.
- Docker: Docker è utilizzato per creare e gestire i container dei microservizi. Puoi scaricare e installare Docker seguendo le istruzioni per il tuo sistema operativo dalla documentazione di Docker.
- Git: Git è utilizzato per il versioning del codice e il controllo delle modifiche. Se non hai Git installato, puoi scaricarlo e installarlo dalla pagina ufficiale di Git.
Questo workshop è progettato per fornire una comprensione pratica dell'utilizzo di Terraform per gestire l'infrastruttura su AWS, implementare microservizi su un cluster ECS e creare pipeline CI/CD automatizzate. Al termine di questo workshop, gli studenti saranno in grado di:
- Creare e configurare un cluster ECS utilizzando Terraform.
- Implementare microservizi Docker su un cluster ECS.
- Configurare e gestire una pipeline CI/CD per il deployment continuo dei microservizi.
- Implementare strumenti di osservabilità per monitorare e tracciare le applicazioni.
Clona il repository e naviga nella directory principale:
git clone https://github.com/tuonome/repository.git
cd repositoryConfigura l'accesso AWS con le tue credenziali:
aws configureNaviga nella directory terraform/ e inizializza Terraform:
cd terraform
terraform initModifica il file main.tf con le tue configurazioni personalizzate per ECS:
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "5.53.0"
}
}
}
provider "aws" {
region = var.aws_region
}
resource "aws_ecs_cluster" "ecs_cluster" {
name = "${var.owner}-my-ecs-cluster"
}
resource "aws_ecs_task_definition" "bikes_task_definition" {
family = "bikes"
container_definitions = file("${path.module}/bikes-deployment.yaml")
}
resource "aws_ecs_service" "bikes_service" {
name = "bikes-service"
cluster = aws_ecs_cluster.ecs_cluster.id
task_definition = aws_ecs_task_definition.bikes_task_definition.arn
desired_count = 2
}
resource "aws_ecs_task_definition" "cars_task_definition" {
family = "cars"
container_definitions = file("${path.module}/cars-deployment.yaml")
}
resource "aws_ecs_service" "cars_service" {
name = "cars-service"
cluster = aws_ecs_cluster.ecs_cluster.id
task_definition = aws_ecs_task_definition.cars_task_definition.arn
desired_count = 2
}
resource "aws_iam_role" "ecs_service_role" {
name = "${var.owner}-ecs-service-role"
assume_role_policy = jsonencode({
Version = "2012-10-17",
Statement = [{
Effect = "Allow",
Principal = {
Service = "ecs.amazonaws.com"
},
Action = "sts:AssumeRole"
}]
})
}
resource "aws_iam_role_policy_attachment" "ecs_service_policy" {
role = aws_iam_role.ecs_service_role.name
policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceRole"
}
resource "aws_lb" "application_load_balancer" {
name = "my-application-lb"
internal = false
load_balancer_type = "application"
security_groups = [aws_security_group.alb_sg.id]
subnets = var.public_subnet_ids
}
resource "aws_security_group" "alb_sg" {
name = "alb_sg"
description = "Security group for ALB"
vpc_id = var.vpc_id
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
resource "aws_lb_listener" "alb_listener" {
load_balancer_arn = aws_lb.application_load_balancer.arn
port = "80"
protocol = "HTTP"
default_action {
type = "fixed-response"
status_code = "200"
content_type = "text/plain"
message_body = "OK"
}
}
resource "aws_iam_role" "alb_ingress_controller_role" {
name = "alb-ingress-controller-role"
assume_role_policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "eks.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
EOF
}
resource "aws_iam_policy" "alb_ingress_controller_policy" {
name = "alb-ingress-controller-policy"
policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents",
"ec2:DescribeAccountAttributes",
"ec2:DescribeAddresses",
"ec2:DescribeInstances",
"ec2:DescribeInstanceStatus",
"ec2:DescribeInternetGateways",
"ec2:DescribeVpcs",
"ec2:DescribeSubnets",
"ec2:DescribeSecurityGroups",
"ec2:DescribeRouteTables",
"ec2:DescribeLoadBalancers",
"ec2:DescribeTags",
"ec2:GetCoipPoolUsage",
"ec2:DescribeCoipPools",
"ec2:DescribeNatGateways",
"ec2:DescribeEgressOnlyInternetGateways",
"ec2:DescribePrefixLists",
"ec2:DescribeAddresses",
"ec2:DescribeSecurityGroups",
"ec2:DescribeInstances",
"ec2:DescribeImages",
"ec2:DescribeAvailabilityZones",
"ec2:DescribeVpcs",
"ec2:DescribeSubnets",
"ec2:DescribeSecurityGroups",
"ec2:DescribeInstances",
"ec2:DescribeImages",
"ec2:DescribeAvailabilityZones",
"ec2:DescribeRouteTables",
"ec2:DescribeInstances",
"ec2:DescribeImages",
"ec2:DescribeAvailabilityZones",
"ec2:DescribeRouteTables"
],
"Resource": "*"
}
]
}
EOF
}
resource "aws_iam_role_policy_attachment" "alb_ingress_controller_policy_attachment" {
policy_arn = aws_iam_policy.alb_ingress_controller_policy.arn
role
= aws_iam_role.alb_ingress_controller_role.name
}
resource "helm_release" "alb_ingress_controller" {
name = "alb-ingress-controller"
repository = "https://aws.github.io/eks-charts"
chart = "aws-load-balancer-controller"
namespace = "kube-system"
version = "1.3.1"
values = [
{
"clusterName" = "${var.owner}-my-ecs-cluster"
"serviceAccount.create" = "false"
"serviceAccount.annotations" = "eks.amazonaws.com/role-arn: ${aws_iam_role.alb_ingress_controller_role.arn}"
"serviceAccount.name" = "aws-load-balancer-controller"
"image.repository" = "602401143452.dkr.ecr.us-west-2.amazonaws.com/amazon/aws-load-balancer-controller:v2.2.0"
"image.tag" = "v2.2.0"
"region" = "us-west-2"
"vpcId" = "${var.vpc_id}"
"subnetIds" = "${var.public_subnet_ids}"
"serviceAccount.externalPolicy" = "true"
}
]
}Naviga nella directory docker/ e crea le immagini Docker dei microservizi:
cd ../docker
docker build -t nome_microservizio .Dopo aver costruito le immagini, esegui il push sul registro Docker di AWS ECR:
docker tag nome_microservizio:latest aws_account_id.dkr.ecr.region.amazonaws.com/repository:tag
docker push aws_account_id.dkr.ecr.region.amazonaws.com/repository:tagConfigura una pipeline CI/CD utilizzando strumenti come AWS CodePipeline e AWS CodeBuild per il deployment continuo dei microservizi su ECS.
Implementa strumenti come Amazon CloudWatch per il monitoraggio e la gestione delle metriche delle applicazioni su ECS.
Per verificare che il deployment sia andato a buon fine, puoi accedere alla console AWS ECS e verificare lo stato dei tuoi servizi e dei tuoi task.
Una volta completato il workshop, puoi distruggere tutte le risorse create eseguendo:
terraform destroySostituisci <tuo-nome> con il nome del tuo account IAM e <id-del-tuo-account> con l'ID del tuo account AWS, quindi esegui il comando:
eksctl create iamserviceaccount \
--cluster=${var.owner}-my-ecs-cluster \
--namespace=kube-system \
--name=aws-load-balancer-controller \
--role-name ${var.owner}AmazonEKSLoadBalancerControllerRole \
--attach-policy-arn=arn:aws:iam::${var.aws_account_id}:policy/AWSLoadBalancerControllerIAMPolicy \
--approveInstalla Helm eseguendo i seguenti comandi:
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 > get_helm.sh
chmod 700 get_helm.sh
./get_helm.shAggiungi il repository dei chart Helm di eks:
helm repo add eks https://aws.github.io/eks-charts
helm repo updateInfine, installa l'AWS Load Balancer Controller:
helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
--set clusterName=${var.owner}-my-ecs-cluster \
--set serviceAccount.create=false \
--set serviceAccount.annotations=eks.amazonaws.com/role-arn: ${aws_iam_role.alb_ingress_controller_role.arn} \
--set serviceAccount.name=aws-load-balancer-controller \
--set image.repository=602401143452.dkr.ecr.us-west-2.amazonaws.com/amazon/aws-load-balancer-controller \
--set image.tag=v2.2.0 \
--set region=us-west-2 \
--set vpcId=${var.vpc_id} \
--set subnetIds=${var.public_subnet_ids} \
--set serviceAccount.externalPolicy=trueSiete invitati a contribuire migliorando questo workshop con nuove funzionalità, correzioni di bug o suggerimenti. Create una pull request e sarò felice di esaminarla!
-R3cube Team