Добавление переменной среды с помощью AWS CloudFormation сбрасывает приложение AWS Beanstalk - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть приложение и среда AWS Beanstalk, созданные с использованием следующего шаблона CloudFormation:

MyApp:
    Type: 'AWS::ElasticBeanstalk::Application'
    Properties:
        ApplicationName: MyAppName

InitialApplication:
    Type: 'AWS::ElasticBeanstalk::ApplicationVersion'
    Properties:
        ApplicationName: !Ref MyApp
        Description: Version 1.0
        SourceBundle:
            S3Bucket: !Sub 'elasticbeanstalk-samples-${AWS::Region}'
            S3Key: ecs-sample.zip

AppEnvironment:
    Type: 'AWS::ElasticBeanstalk::Environment'
    Properties:
        ApplicationName: !Ref MyApp
        Description: staging
        TemplateName: !Ref AppConfigurationTemplate
        VersionLabel: !Ref InitialApplication

AppConfigurationTemplate:
    Type: 'AWS::ElasticBeanstalk::ConfigurationTemplate'
    DependsOn:
        - MySecurityGroup
    Properties:
        ApplicationName: !Ref MyApp
        Description: My Configuration Template
        SolutionStackName: '64bit Amazon Linux 2018.03 v2.11.2 running Multi-container Docker 18.03.1-ce (Generic)'
        OptionSettings:
            # Lots of options here

            # Application environment variables
            - Namespace: aws:elasticbeanstalk:application:environment
              OptionName: MY_APP_OPTION
              Value: SOME_VALUE

Проблема заключается в том, что если я добавлю переменную среды в свое приложение (то есть в пространство имен aws:elasticbeanstalk:application:environment),Beanstalk сбрасывает версию приложения среды в исходное приложение.Итак, предположим, что я создал стек CloudFormation год назад и с тех пор развернул 50 версий своего приложения ... Если я затем добавлю переменную среды через CloudFormation, приложение среды будет сброшено в пример приложения.Это, конечно, сломает все, так как базы данных изменились и т. Д. Что я хочу, это, конечно, добавить / изменить переменные среды без изменения версии развернутого приложения в среде Beanstalk.

Почему Beanstalk сбрасывает мое приложениепри внесении этого изменения, и есть ли способ предотвратить это?

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 12 декабря 2018

Здесь важно понять, зачем на самом деле использовать CloudFormation для развертывания вашего приложения, если вы можете инициализировать, а затем загружать новые версии своего приложения через консоль EB (как вы заявляете, что делали) или через API EB.CloudFormation - это своего рода «рецепт» для вашего приложения, и он предназначен для поддержания определения инфраструктуры под контролем исходного кода .Это причина, по которой вы наблюдали откат при обновлении только части переменных среды в вашем «рецепте» - изменения, внесенные в CloudFormation, вызвали обновление в приложении и были применены определения из шаблона - где старая версия приложения была сложной-coded.Вот почему в идеале ваш шаблон CloudFormation должен быть параметризован - каждый раз, когда вы хотите сделать обновление в своем приложении, вы должны передать шаблону имя самой новой версии.

Конечно, вы можетевручную обновите версию EB в своей консоли, но в этом случае сама идея использования CloudFormation становится бессмысленной и приведет к осложнениям, которые вы наблюдаете.

Как вы указали в комментарии, вы можете загружать новое приложениеверсии до S3 и затем обновление CloudFormation через API, передавая версию в качестве параметра.Таким образом, обновления могут быть автоматизированы.Пример вызова API для выполнения некоторых обновлений в стеке (объяснение в документах AWS ):

aws cloudformation update-stack --stack-name mystack --template-url https://s3.amazonaws.com/sample/updated.template
--parameters ParameterKey=VPCID,ParameterValue=SampleVPCID ParameterKey=SubnetIDs,ParameterValue=SampleSubnetID1\\,UpdatedSampleSubnetID2

В вашем случае параметр для обновления будет AWS :: ElasticBeanstalk:: ApplicationVersion и особенно SourceBundle .

СТАРЫЙ ОТВЕТ (обновление приложения в консоли EB, не затрагивая CloudFormation)

Я понимаю, что вы не развертываете приложение с помощью шаблона Cloud Formation (поскольку оно не обновлялось в течение года), поэтому вы должны делать это программно с помощью eb deploy или в Elastic Beanstalk Console.Тогда почему бы не обновить переменные среды в консоли?

Вы можете сделать это, перейдя в консоль приложения, нажав «Конфигурация» в меню слева, а затем кнопку «Изменить» вРаздел «Программное обеспечение».Внизу вы можете добавить переменные среды, которые будут существовать в вашем приложении после каждого нового развертывания.

0 голосов
/ 13 декабря 2018

Постоянное обновление облачной информации - это лучшая практика и, безусловно, рекомендуется.Если вы этого не сделаете, то окажетесь в неловких сценариях, которые вы сейчас испытываете, это неудачно, но поправимо.Вам нужно будет обновить пакетный источник внутри шаблона CF до самой последней версии, чтобы он мог развернуться, может потребоваться перестроить инфраструктуру, поскольку это большое изменение, о котором он не знает, что произошло

0 голосов
/ 07 декабря 2018

Необходимо выполнить изменение переменной среды с помощью ChangeSet, чтобы выполнялось только изменение переменной среды, а оставшийся стек оставался как есть.

...