Введение

Keycloak — это популярное решение с открытым исходным кодом для управления идентификацией и доступом, которое предоставляет единый вход, федерацию идентичности, вход через социальные сети и многое другое. Развертывание Keycloak в производственной среде требует тщательного планирования для обеспечения безопасности, масштабируемости и высокой доступности.

В этом подробном руководстве мы рассмотрим развертывание Keycloak на AWS Elastic Container Service (ECS) с Fargate с использованием Terraform. Этот бессерверный подход устраняет необходимость управления базовой инфраструктурой, позволяя вам сосредоточиться на вашем приложении.

Почему этот подход?

Использование ECS с Fargate предоставляет бессерверную платформу контейнеров, которая устраняет необходимость в выделении и управлении серверами. В сочетании с Terraform для инфраструктуры как кода, этот подход предлагает идеальный баланс контроля, масштабируемости и операционной простоты.

Обзор архитектуры

Прежде чем углубляться в детали реализации, давайте разберем архитектуру, которую мы будем строить:

Архитектура следует лучшим практикам AWS с акцентом на безопасность, высокую доступность и масштабируемость:

Компоненты инфраструктуры

  • Keycloak работает как контейнеризованное приложение в ECS Fargate
  • Aurora PostgreSQL предоставляет высокодоступный бэкенд базы данных
  • Application Load Balancer (ALB) распределяет трафик между несколькими экземплярами

Безопасность и надежность

  • Группы безопасности и сетевые ACL контролируют поток трафика
  • Автоматическое масштабирование обеспечивает обработку различных нагрузок
  • CloudWatch предоставляет мониторинг и оповещения

Требования

Перед началом

Убедитесь, что у вас есть все необходимые требования перед началом процесса развертывания. Отсутствие требований может привести к ошибкам или проблемам безопасности в вашей инфраструктуре.

Перед началом убедитесь, что у вас есть следующее:

  • Аккаунт AWS с соответствующими разрешениями
  • Terraform (версия 1.0 или новее)
  • AWS CLI настроен с соответствующими учетными данными
  • Зарегистрированное доменное имя (необязательно, но рекомендуется для продакшена)

Настройка VPC

Начнем с создания Virtual Private Cloud (VPC) с публичными и приватными подсетями в нескольких зонах доступности:

Конфигурация VPC

1# VPC Configuration
2module "vpc" {
3  source  = "terraform-aws-modules/vpc/aws"
4  version = "~> 3.0"
5
6  name = "keycloak-vpc"
7  cidr = "10.0.0.0/16"
8
9  azs             = ["us-east-1a", "us-east-1b", "us-east-1c"]
10  private_subnets = ["10.0.1.0/24", "10.0.2.0/24", "10.0.3.0/24"]
11  public_subnets  = ["10.0.101.0/24", "10.0.102.0/24", "10.0.103.0/24"]
12
13  enable_nat_gateway = true
14  single_nat_gateway = false  # Для продакшена используйте несколько NAT шлюзов
15  one_nat_gateway_per_az = true
16
17  enable_vpn_gateway = false
18
19  # Включить поддержку DNS для VPC
20  enable_dns_hostnames = true
21  enable_dns_support   = true
22
23  # Добавить теги для лучшего управления ресурсами
24  tags = {
25    Environment = "production"
26    Project     = "keycloak"
27    Terraform   = "true"
28  }
29}
30
31# Security Groups
32resource "aws_security_group" "alb" {
33  name        = "keycloak-alb-sg"
34  description = "Security group for Keycloak ALB"
35  vpc_id      = module.vpc.vpc_id
36
37  ingress {
38    description = "HTTPS from internet"
39    from_port   = 443
40    to_port     = 443
41    protocol    = "tcp"
42    cidr_blocks = ["0.0.0.0/0"]
43  }
44
45  ingress {
46    description = "HTTP from internet (for redirects)"
47    from_port   = 80
48    to_port     = 80
49    protocol    = "tcp"
50    cidr_blocks = ["0.0.0.0/0"]
51  }
52
53  egress {
54    from_port   = 0
55    to_port     = 0
56    protocol    = "-1"
57    cidr_blocks = ["0.0.0.0/0"]
58  }
59}

Настройка RDS (Aurora PostgreSQL)

Keycloak требует базу данных для хранения конфигурации и пользовательских данных. Мы будем использовать Amazon Aurora PostgreSQL для высокой доступности и производительности:

Конфигурация RDS

1# Database subnet group
2resource "aws_db_subnet_group" "keycloak" {
3  name       = "keycloak-db-subnet-group"
4  subnet_ids = module.vpc.private_subnets
5
6  tags = {
7    Name = "Keycloak DB Subnet Group"
8  }
9}
10
11# Database security group
12resource "aws_security_group" "database" {
13  name        = "keycloak-database-sg"
14  description = "Security group for Keycloak database"
15  vpc_id      = module.vpc.vpc_id
16
17  ingress {
18    description     = "PostgreSQL from Keycloak service"
19    from_port       = 5432
20    to_port         = 5432
21    protocol        = "tcp"
22    security_groups = [aws_security_group.keycloak.id]
23  }
24
25  egress {
26    from_port   = 0
27    to_port     = 0
28    protocol    = "-1"
29    cidr_blocks = ["0.0.0.0/0"]
30  }
31}
32
33# Aurora PostgreSQL cluster
34resource "aws_rds_cluster" "keycloak" {
35  cluster_identifier      = "keycloak-cluster"
36  engine                  = "aurora-postgresql"
37  engine_version          = "13.7"
38  database_name           = "keycloak"
39  master_username         = "keycloak"
40  master_password         = var.database_password  # Используйте AWS Secrets Manager в продакшене
41  backup_retention_period = 7
42  preferred_backup_window = "03:00-04:00"
43  db_subnet_group_name    = aws_db_subnet_group.keycloak.name
44  vpc_security_group_ids  = [aws_security_group.database.id]
45  skip_final_snapshot     = true  # Измените для продакшена
46
47  tags = {
48    Name = "Keycloak Aurora Cluster"
49  }
50}

Настройка ECS кластера и определения задачи

Теперь создадим ECS кластер и определение задачи для запуска Keycloak:

Конфигурация ECS

1# ECS Cluster
2resource "aws_ecs_cluster" "keycloak" {
3  name = "keycloak-cluster"
4
5  setting {
6    name  = "containerInsights"
7    value = "enabled"
8  }
9
10  tags = {
11    Name = "Keycloak ECS Cluster"
12  }
13}
14
15# ECS Task Definition
16resource "aws_ecs_task_definition" "keycloak" {
17  family                   = "keycloak"
18  network_mode             = "awsvpc"
19  requires_compatibilities = ["FARGATE"]
20  cpu                      = "1024"
21  memory                   = "2048"
22  execution_role_arn       = aws_iam_role.ecs_task_execution_role.arn
23
24  container_definitions = jsonencode([
25    {
26      name  = "keycloak"
27      image = "quay.io/keycloak/keycloak:20.0.3"
28      essential = true
29      portMappings = [
30        {
31          containerPort = 8080
32          hostPort      = 8080
33          protocol      = "tcp"
34        }
35      ]
36      environment = [
37        { name = "KC_DB", value = "postgres" },
38        { name = "KC_DB_URL", value = "jdbc:postgresql://keycloak-cluster.cluster-abc123xyz.us-east-1.rds.amazonaws.com:5432/keycloak" },
39        { name = "KC_DB_USERNAME", value = "keycloak" },
40        { name = "KC_DB_PASSWORD", value = "var.database_password" },
41        { name = "KEYCLOAK_ADMIN", value = "admin" },
42        { name = "KEYCLOAK_ADMIN_PASSWORD", value = "var.keycloak_admin_password" }
43      ]
44      command = ["start", "--optimized"]
45    }
46  ])
47}

Настройка Application Load Balancer (ALB)

Настроим Application Load Balancer для распределения трафика между экземплярами Keycloak:

Конфигурация ALB

1# Application Load Balancer
2resource "aws_lb" "keycloak" {
3  name               = "keycloak-alb"
4  internal           = false
5  load_balancer_type = "application"
6  security_groups    = [aws_security_group.alb.id]
7  subnets            = module.vpc.public_subnets
8
9  enable_deletion_protection = true  # Установите в true для продакшена
10
11  tags = {
12    Name = "Keycloak ALB"
13  }
14}
15
16# Target Group
17resource "aws_lb_target_group" "keycloak" {
18  name        = "keycloak-tg"
19  port        = 8080
20  protocol    = "HTTP"
21  vpc_id      = module.vpc.vpc_id
22  target_type = "ip"
23
24  health_check {
25    enabled             = true
26    healthy_threshold   = 2
27    unhealthy_threshold = 2
28    timeout             = 5
29    interval            = 30
30    path                = "/health"
31    matcher             = "200"
32    port                = "traffic-port"
33    protocol            = "HTTP"
34  }
35
36  tags = {
37    Name = "Keycloak Target Group"
38  }
39}
40
41# Listener
42resource "aws_lb_listener" "keycloak" {
43  load_balancer_arn = aws_lb.keycloak.arn
44  port              = "443"
45  protocol          = "HTTPS"
46  ssl_policy        = "ELBSecurityPolicy-TLS-1-2-2019-07"
47  certificate_arn   = aws_acm_certificate.keycloak.arn
48
49  default_action {
50    type             = "forward"
51    target_group_arn = aws_lb_target_group.keycloak.arn
52  }
53}

Настройка Route 53 и ACM

Наконец, настроим DNS и SSL сертификаты:

Конфигурация Route 53 и ACM

1# SSL Certificate
2resource "aws_acm_certificate" "keycloak" {
3  domain_name       = var.keycloak_hostname
4  validation_method = "DNS"
5
6  lifecycle {
7    create_before_destroy = true
8  }
9
10  tags = {
11    Name = "Keycloak SSL Certificate"
12  }
13}
14
15# Route 53 record for Keycloak
16resource "aws_route53_record" "keycloak" {
17  zone_id = var.route53_zone_id
18  name    = var.keycloak_hostname
19  type    = "A"
20
21  alias {
22    name                   = aws_lb.keycloak.dns_name
23    zone_id                = aws_lb.keycloak.zone_id
24    evaluate_target_health = true
25  }
26}
27
28# Certificate validation
29resource "aws_acm_certificate_validation" "keycloak" {
30  certificate_arn         = aws_acm_certificate.keycloak.arn
31  validation_record_fqdns = [for record in aws_route53_record.keycloak_validation : record.fqdn]
32}

Развертывание

Для развертывания инфраструктуры выполните следующие шаги:

Команды развертывания

1# Initialize Terraform
2terraform init
3
4# Plan the deployment
5terraform plan -var-file=prod.tfvars -out=tfplan
6
7# Apply the deployment
8terraform apply tfplan
9
10# Verify the deployment
11terraform output
12
13# Check Keycloak service status
14aws ecs describe-services --cluster keycloak-cluster --services keycloak-service

Советы по развертыванию

Первоначальное развертывание может занять 10-15 минут, так как AWS подготавливает все ресурсы. Следите за сервисом ECS в консоли AWS, чтобы отслеживать прогресс запуска контейнера. Keycloak обычно занимает 2-3 минуты для полной инициализации после запуска контейнера.

Тестирование развертывания

После завершения развертывания важно убедиться, что все работает правильно:

1Базовая функциональность

  • Доступ к консоли администратора Keycloak
  • Создать тестовый realm и пользователя
  • Настроить простое клиентское приложение

2Расширенное тестирование

  • Тестировать потоки аутентификации
  • Проверить логи в CloudWatch
  • Тестировать сценарии высокой доступности

Команды быстрой проверки

Команды проверки

1# Check if Keycloak is responding
2curl -k https://your-keycloak-domain.com/health
3
4# Test admin console access
5curl -k https://your-keycloak-domain.com/admin/
6
7# Check ECS service health
8aws ecs describe-services --cluster keycloak-cluster --services keycloak-service --query 'services[0].runningCount'
9
10# View container logs
11aws logs tail /ecs/keycloak --follow

Заключение

В этом руководстве мы рассмотрели, как развернуть Keycloak на AWS ECS с Fargate с использованием Terraform. Этот подход обеспечивает масштабируемое, высокодоступное и безопасное решение для управления идентификацией без накладных расходов на управление базовой инфраструктурой.

Ключевые преимущества

Эта архитектура обеспечивает готовое к продакшену развертывание Keycloak, которое следует лучшим практикам AWS для безопасности, масштабируемости и надежности. Бессерверный подход с Fargate минимизирует операционные накладные расходы, сохраняя полный контроль над вашей системой управления идентификацией.

Инфраструктура

  • Бессерверные операции с Fargate
  • Высокая доступность в нескольких AZ
  • Автоматическое масштабирование по требованию

Безопасность

  • Безопасная сетевая конфигурация
  • Шифрование SSL/TLS
  • Приватные подсети для чувствительных компонентов

Управление

  • Управляемая база данных с Aurora PostgreSQL
  • Инфраструктура как код с Terraform
  • Мониторинг с CloudWatch

Следующие шаги

  • Настройте темы и конфигурации Keycloak для вашей организации
  • Интегрируйте с вашими существующими приложениями, используя OIDC или SAML
  • Настройте мониторинг и оповещения для продакшена
  • Реализуйте процедуры резервного копирования и аварийного восстановления
Нужна помощь с развертыванием Keycloak на AWS?
Предлагаю экспертные консультации по инфраструктуре AWS, развертыванию Keycloak и реализации Terraform. Давайте обсудим, как я могу помочь вам построить безопасную, масштабируемую систему аутентификации.