Получение адреса Elasticache из контейнера Docker Elastic Beanstalk

Я пытаюсь, чтобы эластичный beanstalk автоматически подготавливал экземпляр elasticache. Я пытаюсь выяснить, как я могу получить доступ к адресу экземпляра кеша во время выполнения из моей среды докеров. Я использую python (на gevent).

Вот мой файл конфигурации в .ebextensions:

Resources:
  sslSecurityGroupIngress:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      GroupName: {Ref : AWSEBSecurityGroup}
      IpProtocol: tcp
      ToPort: 443
      FromPort: 443
      CidrIp: 0.0.0.0/0

  MyCacheSecurityGroup:
    Type: "AWS::EC2::SecurityGroup"
    Properties:
      GroupDescription: "Lock cache down to webserver access only"
      SecurityGroupIngress :
        - IpProtocol : "tcp"
          FromPort :
            Fn::GetOptionSetting:
              OptionName : "CachePort"
              DefaultValue: "6379"
          ToPort :
            Fn::GetOptionSetting:
              OptionName : "CachePort"
              DefaultValue: "6379"
          SourceSecurityGroupName:
            Ref: "AWSEBSecurityGroup"
  MyElastiCache:
    Type: "AWS::ElastiCache::CacheCluster"
    Properties:
      CacheNodeType:
        Fn::GetOptionSetting:
          OptionName : "CacheNodeType"
          DefaultValue : "cache.t1.micro"
      NumCacheNodes:
        Fn::GetOptionSetting:
          OptionName : "NumCacheNodes"
          DefaultValue : "1"
      Engine:
        Fn::GetOptionSetting:
          OptionName : "Engine"
          DefaultValue : "redis"
      VpcSecurityGroupIds:
        -
          Fn::GetAtt:
            - MyCacheSecurityGroup
            - GroupId

option_settings:
  "aws:elasticbeanstalk:customoption":
    CacheNodeType : cache.t1.micro
    NumCacheNodes : 1
    Engine : redis
    CachePort : 6379

Outputs:
  ElastiCache:
    Description : "ID of ElastiCache Cache Cluster with Redis Engine"
    Value :
      Ref : "MyElastiCache"

files:
  /etc/nginx/conf.d/ssl.conf:
    mode: "000755"
    owner: root
    group: root
    content: |
      # HTTPS Server

      server {
        listen 443;
        server_name localhost;

        ssl on;
        ssl_certificate /etc/pki/tls/certs/server.crt;
        ssl_certificate_key /etc/pki/tls/certs/server.key;

        ssl_session_timeout 5m;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
        ssl_prefer_server_ciphers on;

        location / {
          proxy_pass http://docker;
          proxy_http_version 1.1;

          proxy_set_header Connection "";
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
      }
  /tmp/elasticache.env:
    mode: "000444"
    content: |
      export ELASTICACHE_CONFIGURATION_ENDPOINT="'{"Fn::GetAtt": ["MyElastiCache", "ConfigurationEndpoint.Address"]}':'{"Fn::GetAtt": ["MyElastiCache", "ConfigurationEndpoint.Port"]}'"

option_settings:
  - option_name: ELASTICACHE_DATA_FILE
    value: /var/app/elasticache

container_commands:
  copy_crt:
    command: cp .ebextensions/server.crt /etc/pki/tls/certs/server.crt
  copy_key:
    command: cp .ebextensions/server.key /etc/pki/tls/certs/server.key

Я следовал руководству здесь: http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-environment-resources-elasticache.html#customize-environment-resources-elasticache-defaultvpc. И добавлена ​​поддержка использования нашего сертификата tls.

Моя проблема в том, что файл /tmp/elasticache.env не будет доступен из экземпляра докера. Есть ли лучший способ получить учетные данные elasticache?


person Jim Cortez    schedule 17.09.2015    source источник


Ответы (1)


Если у вас уже есть конечная точка ElastiCache, вы можете вставить ее в переменную среды контейнера Docker с помощью обработчика развертывания приложения:

files:
  "/opt/elasticbeanstalk/hooks/appdeploy/pre/02injectdockerfile.sh":
    mode: "000755"
    content: |
      . /opt/elasticbeanstalk/hooks/common.sh
      EB_CONFIG_APP_CURRENT=$(/opt/elasticbeanstalk/bin/get-config container -k app_deploy_dir)
      cd $EB_CONFIG_APP_CURRENT
      echo "ENV ELASTICACHE_CONFIGURATION_ENDPOINT \"'{"Fn::GetAtt": ["MyElastiCache", "ConfigurationEndpoint.Address"]}':'{"Fn::GetAtt": ["MyElastiCache", "ConfigurationEndpoint.Port"]}'\"" >> Dockerfile

См. Дополнительные сведения в https://stackoverflow.com/a/32458281/3427434 (в разделе варианта №2).

person Edward Samuel    schedule 18.09.2015
comment
Спасибо! Это поможет с некоторыми другими переменными среды. Однако я пытаюсь понять, как правильно заставить Elasticache работать в Elastic Beanstalk. - person Jim Cortez; 21.09.2015
comment
Это не будет работать с Redis, который использует OP, он будет работать только с Memcache. Для Redis используйте {Fn :: GetAtt: [MyElastiCache, RedisEndpoint.Address]} Для справки: docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide / - person Luca Gibelli; 26.08.2016