Назад | Перейти на главную страницу

Добавление кластера ElastiCache в приложение Elastic Beanstalk

У меня есть установка приложения Elastic Beanstalk с использованием платформы докеров. Все идет гладко, и я могу повторно развернуть приложение с помощью eb deploy команда cli. Приложение настраивается на пользовательском VPC (что я почти не понимаю) и доступно через Интернет.

Я хочу добавить в свое приложение кластер Memcached ElastiCache. Я попытался создать кластер вручную через консоль, но мне кажется, что я никогда не могу подключиться к нему (независимо от того, как я его настроил) из моего приложения (я пробовал telnetting из экземпляра Elastic Beanstalk). Я добавил .ebextensions в мое приложение и попытался добавить директиву для EB, чтобы создать для меня кластер кеша. Я пробовал использовать образец шаблона AWS, но это не сработало. Я попытался изменить настройки и даже попытался упростить директиву до минимально необходимых параметров, чтобы заставить EB создать кластер. Кажется, все, что я делаю, не работает. Ниже мой текущий файл:

Resources:
  MyElastiCache:
    Type: "AWS::ElastiCache::CacheCluster"
    Properties:
      CacheNodeType: "cache.t2.small"
      NumCacheNodes: "1"
      Engine: "memcached"
      VpcSecurityGroupIds: 
        - sg-XXXXXXXX
      CacheSubnetGroupName: "subnet-XXXXXXXX"

Для VpcSecurityGroupIds, Я пробовал как группы безопасности EC2, так и группы безопасности VPC. Ни то, ни другое не помогает. В CacheSubnetGroupName это идентификатор подсети в моем VPC.

Это очень неприятно, потому что на тестирование самого минимального изменения уходит 5 минут, так как EB приходится повторно развертывать мое приложение каждый раз, когда я пробую что-то новое. Любая помощь будет принята с благодарностью.

Изменить: вот моя последняя попытка.

Resources:
  MyElastiCacheSubnetGroup:
    Type: "AWS::ElastiCache::SubnetGroup"
    Properties:
      Description: "Blah blah blah"
      SubnetIds:
        - subnet-XXXXXXXX
        - subnet-XXXXXXXX
        - subnet-XXXXXXXX
        - subnet-XXXXXXXX
  MyElastiCache:
    Type: "AWS::ElastiCache::CacheCluster"
    Properties:
      CacheNodeType: "cache.t2.small"
      NumCacheNodes: "1"
      Engine: "memcached"
      VpcSecurityGroupIds: 
        - sg-XXXXXXXX
      CacheSubnetGroupName:
        Ref: "MyElastiCacheSubnetGroup"

И ошибка, связанная с этим: Service:AmazonCloudFormation, Message:Stack named 'awseb-e-amyvnbtvps-stack' aborted operation. Current state: 'UPDATE_ROLLBACK_IN_PROGRESS' Reason: The following resource(s) failed to create: [MyElastiCacheSubnetGroup].

Как выяснилось, ошибка заключалась в том, что учетная запись IAM, которая управляла развертыванием, не имела необходимых политик для создания сервисов Elasticache. Однажды я дал пользователю IAM соответствующие разрешения. Это начало работать. К сожалению, ошибка не очень хорошо определена в событиях Elastic Beanstalk Events. Я обнаружил, что события также перечислены в Cloudformation, и именно здесь я обнаружил, что проблема была в разрешениях.

В VpcSecurityGroupIds свойство - это список из одного или нескольких Группы безопасности VPC который будет назначен кластеру кеша.

Убедитесь, что одна из этих групп безопасности разрешает соединения через порт 11211 либо из групп безопасности экземпляра EC2 вашего EB-приложения, либо из CIDR, который включает экземпляры EC2 вашего EB-приложения. Без этого правила любые подключения не будут выполнены.

В CacheSubnetGroupName не является подсетью VPC.

Перед созданием кластера кэша в VPC необходимо создать группу подсети кэша. Группа подсетей кэша - это набор подсетей VPC. Для получения дополнительной информации см. Следующее:

http://docs.aws.amazon.com/AmazonElastiCache/latest/UserGuide/SubnetGroups.html

Вы можете создать ресурс Cache Subnet Group в своем .ebextensions файл:

Resources:
  MyElastiCacheSubnetGroup:
    Type: "AWS::ElastiCache::SubnetGroup"
    Properties:
      Description: "Something informational"
      SubnetIds:
        - subnet-XXXXXX
  MyElastiCache:
    Type: "AWS::ElastiCache::CacheCluster"
    Properties:
      CacheNodeType: "cache.t2.small"
      NumCacheNodes: "1"
      Engine: "memcached"
      VpcSecurityGroupIds: 
        - sg-XXXXXXXX
      CacheSubnetGroupName: 
        Ref: "MyElastiCacheSubnetGroup"