Как создать приложение AWS Elasticbeanstalk с интегрированной RDS с помощью CloudFormation? - PullRequest
1 голос
/ 29 сентября 2019

Я пытаюсь настроить среду AWS для моего приложения SpringBoot, которое использует Postgres.Я решил использовать CloudFormation для настройки всех компонентов AWS, необходимых для моего приложения.

Ниже приведен шаблон формирования облака app.json:

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Parameters": {
    "S3BucketName": {
      "Description": "S3 BucketName",
      "Type": "String"
    },
    "S3FileName": {
      "Description": "Name of the jar/war file",
      "Type": "String"
    },
    "DBName":{
      "Default":"mytododb",
      "Description":"The database name",
      "Type":"String",
      "MinLength":"1",
      "MaxLength":"64",
      "AllowedPattern":"[a-zA-Z][a-zA-Z0-9]*",
      "ConstraintDescription":"must begin with a letter and contain only alphanumeric characters."
    },
    "DBUser":{
      "Description":"The database admin account username",
      "Type":"String",
      "MinLength":"1",
      "MaxLength":"16",
      "AllowedPattern":"[a-zA-Z][a-zA-Z0-9]*",
      "ConstraintDescription":"must begin with a letter and contain only alphanumeric characters."
    },
    "DBPassword":{
      "NoEcho":"true",
      "Description":"The database admin account password",
      "Type":"String",
      "MinLength":"8",
      "MaxLength":"41",
      "AllowedPattern":"[a-zA-Z0-9]*",
      "ConstraintDescription":"must contain only alphanumeric characters."
    },
    "DBAllocatedStorage":{
      "Default":"5",
      "Description":"The size of the database (Gb)",
      "Type":"Number",
      "MinValue":"5",
      "MaxValue":"1024",
      "ConstraintDescription":"must be between 5 and 1024Gb."
    },
    "DBInstanceClass":{
      "Default":"db.t2.micro",
      "Description":"The database instance type",
      "Type":"String",
      "ConstraintDescription":"must select a valid database instance type."
    },
    "MultiAZDatabase":{
      "Default":"false",
      "Description":"Create a multi-AZ RDS database instance",
      "Type":"String",
      "AllowedValues":[
        "true",
        "false"
      ],
      "ConstraintDescription":"must be either true or false."
    }
  },
  "Resources": {
    "SpringBootApplication": {
      "Type": "AWS::ElasticBeanstalk::Application",
      "Properties": {
        "Description":"Spring boot and elastic beanstalk"
      }
    },
    "SpringBootApplicationVersion": {
      "Type": "AWS::ElasticBeanstalk::ApplicationVersion",
      "Properties": {
        "ApplicationName":{"Ref":"SpringBootApplication"},
        "SourceBundle": {
          "S3Bucket": {
            "Ref": "S3BucketName"
          },
          "S3Key": {
            "Ref": "S3FileName"
          }
        }
      }
    },
    "SpringBootBeanStalkConfigurationTemplate": {
      "Type": "AWS::ElasticBeanstalk::ConfigurationTemplate",
      "Properties": {
        "ApplicationName": {"Ref":"SpringBootApplication"},
        "Description":"A display of speed boot application",
        "OptionSettings": [
          {
            "Namespace": "aws:rds:dbinstance",
            "OptionName": "DBAllocatedStorage",
            "Value": {
              "Ref": "DBAllocatedStorage"
            }
          },
          {
            "Namespace": "aws:rds:dbinstance",
            "OptionName": "DBDeletionPolicy",
            "Value": "Delete"
          },
          {
            "Namespace": "aws:rds:dbinstance",
            "OptionName": "DBEngine",
            "Value": "postgres"
          },
          {
            "Namespace": "aws:rds:dbinstance",
            "OptionName": "DBEngineVersion",
            "Value": "10.4"
          },
          {
            "Namespace": "aws:rds:dbinstance",
            "OptionName": "DBInstanceClass",
            "Value": { "Ref": "DBInstanceClass" }
          },
          {
            "OptionName": "DBPassword",
            "Namespace": "aws:rds:dbinstance",
            "Value": { "Ref": "DBPassword" }
          },
          {
            "Namespace": "aws:rds:dbinstance",
            "OptionName": "DBUser",
            "Value": { "Ref": "DBUser" }
          },
          {
            "Namespace": "aws:rds:dbinstance",
            "OptionName": "MultiAZDatabase",
            "Value": { "Ref": "MultiAZDatabase" }
          }
        ],
        "SolutionStackName": "64bit Amazon Linux 2018.03 v2.9.2 running Java 8"
      }
    },
    "SpringBootBeanstalkEnvironment": {
      "Type": "AWS::ElasticBeanstalk::Environment",
      "Properties": {
        "ApplicationName": {"Ref":"SpringBootApplication"},
        "EnvironmentName":"TodoAppEnvironment",
        "TemplateName": {"Ref":"SpringBootBeanStalkConfigurationTemplate"},
        "VersionLabel": {"Ref": "SpringBootApplicationVersion"}
      }
    }
  },
  "Outputs": {
    "DevURL": {
      "Description": "The URL of the DEV Elastic Beanstalk environment",
      "Value": {
        "Fn::Join": [
          "",
          [
            {
              "Fn::GetAtt": [
                "SpringBootBeanstalkEnvironment",
                "EndpointURL"
              ]
            }
          ]
        ]
      },
      "Export": {
        "Name": {
          "Fn::Sub": "${AWS::StackName}-EndpointURL"
        }
      }
    }
  }
}

и файл параметров параметры.json is:

[
  {
    "ParameterKey": "DBUser",
    "ParameterValue": "myuser"
  },
  {
    "ParameterKey": "DBPassword",
    "ParameterValue": "secret"
  },
  {
    "ParameterKey": "S3BucketName",
    "ParameterValue": "todoapp"
  },
  {
    "ParameterKey": "S3FileName",
    "ParameterValue": "todo-api-spring-boot-0.0.1.jar"
  }
]

Я создаю стек CloudFormation, используя aws cloudformation create-stack - файл тела шаблона: //app.json --parameters file: // параметры.json --stack-name = todo-stack

Проблема: Стек создается, однако экземпляр базы данных (RDS) не создается, и когда я вижу вВ конфигурации ElasticBeanstalk для приложения в Консоли управления нет конфигурации базы данных, связанной с приложением.

Мое ожидание / предположение заключается в настройке различных aws: rds: dbinstance свойств в OptionSettings будет предоставлен экземпляр RDS, который будет ассоциирован с приложением ElasticBeanstalk.

Мое понимание неверно или я пропускаю другие настройки?

PS: Идея состоит в том, чтобы использовать интегрированный RDS, чтобы я мог использовать свойства RDS_HOST, RDS_PORT и т. Д. В своем приложении для подключения к базе данных.

Я могу настроить отдельный ресурс RDS иподключиться к нему, указав параметры подключения.Но я ожидаю, что свойства aws: rds: dbinstance в OptionSettings создадут RDS и свяжут его с приложением Elasticbeanstalk.Если это не так, то какова цель настройки этих параметров в OptionSettings ?

Ref:

https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/command-options-general.html#command-options-general-rdsdbinstance

https://github.com/metabase/metabase/blob/master/bin/aws-eb-docker/cloudformation-elasticbeanstalk.json.template

1 Ответ

0 голосов
/ 30 сентября 2019

Создание RDS не выполняется из-за подхода пространства имен.В основном Namespace используется для переопределения свойств по умолчанию для ресурсов, которые вы создали.

Таким образом, решение состоит в том, чтобы включить шаблон создания RDS перед вашим «SpringBootBeanStalkConfigurationTemplate»

  "Resources": {
    "RDS Creation": {
      {
      "Type" : "AWS::RDS::DBInstance",
      "Properties" : {
          "AllocatedStorage" : String,
          "AllowMajorVersionUpgrade" : Boolean,
          "AssociatedRoles" : [ DBInstanceRole, ... ],
          "AutoMinorVersionUpgrade" : Boolean,
          "AvailabilityZone" : String,
          "BackupRetentionPeriod" : Integer,
          "CharacterSetName" : String,
          "CopyTagsToSnapshot" : Boolean,
          "DBClusterIdentifier" : String,
          "DBInstanceClass" : String,
          "DBInstanceIdentifier" : String,
          "DBName" : String,
          "DBParameterGroupName" : String,
          "DBSecurityGroups" : [ String, ... ],
          "DBSnapshotIdentifier" : String,
          "DBSubnetGroupName" : String,
          "DeleteAutomatedBackups" : Boolean,
          "DeletionProtection" : Boolean,
          "Domain" : String,
          "DomainIAMRoleName" : String,
          "EnableCloudwatchLogsExports" : [ String, ... ],
          "EnableIAMDatabaseAuthentication" : Boolean,
          "EnablePerformanceInsights" : Boolean,
          "Engine" : String,
          "EngineVersion" : String,
          "Iops" : Integer,
          "KmsKeyId" : String,
          "LicenseModel" : String,
          "MasterUsername" : String,
          "MasterUserPassword" : String,
          "MonitoringInterval" : Integer,
          "MonitoringRoleArn" : String,
          "MultiAZ" : Boolean,
          "OptionGroupName" : String,
          "PerformanceInsightsKMSKeyId" : String,
          "PerformanceInsightsRetentionPeriod" : Integer,
          "Port" : String,
          "PreferredBackupWindow" : String,
          "PreferredMaintenanceWindow" : String,
          "ProcessorFeatures" : [ ProcessorFeature, ... ],
          "PromotionTier" : Integer,
          "PubliclyAccessible" : Boolean,
          "SourceDBInstanceIdentifier" : String,
          "SourceRegion" : String,
          "StorageEncrypted" : Boolean,
          "StorageType" : String,
          "Tags" : [ Tag, ... ],
          "Timezone" : String,
          "UseDefaultProcessorFeatures" : Boolean,
          "VPCSecurityGroups" : [ String, ... ]
        }
    }
  }
}

После этого вы можете включить параметры RDS в другие ваши ресурсы, поскольку они будут созданы первыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...