Получите значение из AWS Хранилище параметров системного менеджера во время развертывания Elasti c Beanstalk - PullRequest
1 голос
/ 20 марта 2020

У меня есть строка подключения к базе данных, хранящаяся в AWS Хранилище параметров системного менеджера, которое я хочу передать переменным среды экземпляра Elasti c Beanstalk. Я не хочу фиксировать его в исходном коде и не должен полагаться на то, что установщик устанавливает значения при развертывании или делает это вручную через веб-консоль.

Я пробовал Dynami c Ссылки, такие как {{resolve:ssm:DATABASE_CONNECTION_STRING:1}} (с обратными галочками и без них), которые работают в стеках CloudFormation, но не в конфигурации Elasti c Beanstalk.

Я пробовал использовать container_commands подобно

export DATABASE_CONNECTION_STRING=`aws ssm get-parameter --name DATABASE_CONNECTION_STRING --region eu-west-1 --query Parameter.Value --output text

но экземпляр Elasti c Beanstalk не имеет необходимых разрешений, и я не уверен, как их установить.

Я пытался создать файл из содержимого файла S3, используя files: и source: но получите ошибки.

В идеале Dynami c Ссылки будут работать, например, .ebextensions/env.config =>

OptionSettings:
  aws:elasticbeanstalk:application:environment:
    DATABASE_CONNECTION_STRING: {{resolve:ssm:ANNOTATOR_DATABASE_CONNECTION_STRING:1}}

1 Ответ

0 голосов
/ 23 марта 2020

Я использовал конфигурацию files, которая загружает файл из S3 в /tmp/app.env, а затем приложение Python использует load_dotenv('/tmp/app.env'). Не идеально, но пока работает.

Вот .ebextensions/env.config:

Resources:
  AWSEBAutoScalingGroup:
    Metadata:
      AWS::CloudFormation::Authentication:
        S3Auth:
          type: "s3"
          buckets: ["S3_BUCKET_NAME"]
          roleName: 
            "Fn::GetOptionSetting": 
              Namespace: "aws:autoscaling:launchconfiguration"
              OptionName: "IamInstanceProfile"
              DefaultValue: "aws-elasticbeanstalk-ec2-role"
files:
  "/tmp/app.env":  
    mode: "444"
    owner: wsgi
    group: wsgi
    authentication: "S3Auth"
    source: https://URL_TO_S3_BUCKET/app.env

Обязательно измените S3_BUCKET_NAME и URL_TO_S3_BUCKET на ваши настройки.

Тогда в Python я использую;

if os.path.exists('/tmp/app.env'):
    load_dotenv('/tmp/app.env')
else:
    load_dotenv('.env')
...