Введение

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

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

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

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

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

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

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

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

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

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

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

Требования

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

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

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

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

Настройка VPC

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

1# Конфигурация VPC
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 gateway
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# Группы безопасности
32resource "aws_security_group" "alb" {
33  name        = "keycloak-alb-sg"
34  description = "Группа безопасности для Keycloak ALB"
35  vpc_id      = module.vpc.vpc_id
36
37  ingress {
38    description = "HTTPS из интернета"
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 из интернета (для редиректов)"
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за её высокую доступность и производительность:

1# Группа подсетей базы данных
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# Группа безопасности базы данных
12resource "aws_security_group" "database" {
13  name        = "keycloak-database-sg"
14  description = "Группа безопасности для базы данных Keycloak"
15  vpc_id      = module.vpc.vpc_id
16
17  ingress {
18    description     = "PostgreSQL от сервиса Keycloak"
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
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:

1# Кластер ECS
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
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:

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}

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

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

1# Запись Route 53 для Keycloak
2resource "aws_route53_record" "keycloak" {
3  zone_id = var.route53_zone_id
4  name    = var.keycloak_hostname
5  type    = "A"
6
7  alias {
8    name                   = aws_lb.keycloak.dns_name
9    zone_id                = aws_lb.keycloak.zone_id
10    evaluate_target_health = true
11  }
12}

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

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

1# Инициализируйте Terraform
2terraform init
3
4# Запланируйте развертывание
5terraform plan -var-file=prod.tfvars -out=tfplan
6
7# Примените развертывание
8terraform apply tfplan
9
10# Проверьте развертывание
11terraform output

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

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

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

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

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

Заключение

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

Резюме ключевых преимуществ

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

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

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

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

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

Управление

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