elastic change aws amazon-web-services elastic-beanstalk amazon-rds aws-cli amazon-elastic-beanstalk

amazon web services - change - AWS CLI crea RDS con elasticbeanstalk create-environment



change rds elastic beanstalk (4)

Simplemente estableciendo las opciones aws: rds: dbinstance no crea una base de datos RDS. Actualmente puede crear una instancia de RDS utilizando una de las siguientes técnicas:

  1. Crear usando AWS Console
  2. Use eb cli
  3. Use la sección Recursos de ebextensions para crear un recurso RDS

Los dos primeros enfoques son los más convenientes, ya que hacen todo el trabajo pesado por ti, pero para el tercero tienes que hacer un trabajo extra. El tercer enfoque es lo que le gustaría usar si no está utilizando la consola o eb CLI.

Puede crear un recurso RDS para su entorno beanstalk utilizando el siguiente fragmento de ebextension. Cree un archivo llamado 01-rds.config en el directorio .ebextensions de su fuente de la aplicación.

Resources: AWSEBRDSDatabase: Type: AWS::RDS::DBInstance Properties: AllocatedStorage: 5 DBInstanceClass: db.t2.micro DBName: myawesomeapp Engine: postgres EngineVersion: 9.3 MasterUsername: myAwesomeUsername MasterUserPassword: myCrazyPassword

Este archivo está en formato YAML, por lo que la sangría es importante. También puede usar JSON si lo desea. Estas no son opciones de configuración por lo que no puede pasarlo como --option-settings test.json . Solo necesita agrupar este archivo con su fuente de la aplicación.

Obtenga más información sobre las propiedades que puede configurar en su base de datos RDS aquí . En esta página también puede encontrar qué propiedades se requieren y qué propiedades son opcionales.

Avíseme si lo anterior no funciona para usted o si tiene más preguntas.

¿Cómo puedo crear una instancia de RDS con create-environment u otro subcomando de aws elasticbeanstalk ? Probé varias combinaciones de parámetros inútilmente. A continuación hay un ejemplo.

APP_NAME="randall-railsapp" aws s3api create-bucket --bucket "$APP_NAME" APP_VERSION="$(git describe --always)" APP_FILE="deploy-$APP_NAME-$APP_VERSION.zip" git archive -o "$APP_FILE" HEAD aws s3 cp "$APP_FILE" "s3://$APP_NAME/$APP_FILE" aws --region us-east-1 elasticbeanstalk create-application-version / --auto-create-application / --application-name "$APP_NAME" / --version-label "$APP_VERSION" / --source-bundle S3Bucket="$APP_NAME",S3Key="$APP_FILE" aws --region us-east-1 elasticbeanstalk create-environment / --application-name "$APP_NAME" / --version-label "$APP_VERSION" / --environment-name "$APP_NAME-env" / --description "randall''s rails app environment" / --solution-stack-name "64bit Amazon Linux 2014.03 v1.0.0 running Ruby 2.1 (Puma)" / --cname-prefix "$APP_NAME-test" / --option-settings file://test.json

Y el contenido de test.json :

[ { "OptionName": "EC2KeyName", "Namespace": "aws:autoscaling:launchconfiguration", "Value": "a-key-is-here" }, { "OptionName": "EnvironmentType", "Namespace": "aws:elasticbeanstalk:environment", "Value": "SingleInstance" }, { "OptionName": "SECRET_KEY_BASE", "Namespace": "aws:elasticbeanstalk:application:environment", "Value": "HAHAHAHAHAHA" }, { "OptionName": "DBPassword", "Namespace": "aws:rds:dbinstance", "Value": "hunter2" }, { "OptionName": "DBUser", "Namespace": "aws:rds:dbinstance", "Value": "random" }, { "OptionName": "DBEngineVersion", "Namespace": "aws:rds:dbinstance", "Value": "9.3" }, { "OptionName": "DBEngine", "Namespace": "aws:rds:dbinstance", "Value": "postgres" } ]

Alguien sabe por qué esto está fallando? Cualquier cosa que especifique con un espacio de nombres aws:rds:dbinstance parece eliminarse de la configuración.


Tuve el mismo problema, no pude hacer que funcionara a través de .ebextensions, y no me gusta la herramienta EB CLI.

EB CLI utiliza una función de API no documentada y una versión personalizada de la biblioteca de botocore (''eb_botocore'') para que esto funcione. :(

Así que seguí y bifurqué botocore, y me fusioné en el archivo de datos API utilizado por eb_botocore: https://github.com/boto/botocore/pull/396

Luego ejecuté ''python setup.py install'' en mi botocore modificado y aws-cli (ambos en master), y aws-cli ahora acepta una opción --template-specification en el comando ''aws elásticobeanstalk create-environment''. ¡Hurra!

Ejemplo de uso:

aws elasticbeanstalk create-environment/ ...various options.../ --option-settings file://option-settings.json --template-specification file://rds.us-west-2.json

donde rds.us-west-2.json es:

{ "TemplateSnippets": [{ "SnippetName": "RdsExtensionEB", "Order": 10000, "SourceUrl": "https://s3.amazonaws.com/elasticbeanstalk-env-resources-us-west-2/eb_snippets/rds/rds.json" }] }

(parece que debe seleccionar un fragmento específico para su región EB).

y option-settings.json contiene configuraciones relacionadas con RDS similares a las enumeradas en la pregunta (DBEngine, DBInstanceClass, DBAllocatedStorage, DBPassword).

Funciona muy bien. Espero que el equipo de AWS CLI nos permita usar esta característica en la herramienta oficial en el futuro. Supongo que no se trata de un cambio trivial o que ya lo habrían hecho, pero es una omisión bastante importante en cuanto a la funcionalidad de la API de Elastic Beanstalk y la herramienta CLI de AWS, así que espero que lo intenten.


Las otras respuestas no funcionaron en mi entorno a partir de septiembre de 2015. Después de mucho ensayo y error, lo siguiente funcionó para mí:

fragmento de plantilla config (YAML):

aws:rds:dbinstance: DBAllocatedStorage: ''5'' DBDeletionPolicy: Delete DBEngine: postgres DBEngineVersion: 9.3.9 DBInstanceClass: db.t2.micro DBPassword: PASSWORD_HERE DBUser: USERNAME_HERE MultiAZDatabase: false

archivo .ebextensions / rds.config (JSON):

{ "Parameters": { "AWSEBDBUser": { "NoEcho": "true", "Description": "The name of master user for the client DB Instance.", "Default": "ebroot", "Type": "String", "ConstraintDescription": "must begin with a letter and contain only alphanumeric characters" }, "AWSEBDBPassword": { "NoEcho": "true", "Description": "The master password for the DB instance.", "Type": "String", "ConstraintDescription": "must contain only alphanumeric characters" }, "AWSEBDBName": { "NoEcho": "true", "Description": "The DB Name of the RDS instance", "Default": "ebdb", "Type": "String", "ConstraintDescription": "must contain only alphanumeric characters" } }, "Resources": { "AWSEBAutoScalingGroup": { "Metadata": { "AWS::ElasticBeanstalk::Ext": { "_ParameterTriggers": { "_TriggerConfigDeployment": { "CmpFn::Insert": { "values": [ { "CmpFn::Ref": "Parameter.AWSEBDBUser" }, { "CmpFn::Ref": "Parameter.AWSEBDBPassword" }, { "CmpFn::Ref": "Parameter.AWSEBDBName" } ] } } }, "_ContainerConfigFileContent": { "plugins": { "rds": { "Description": "RDS Environment variables", "env": { "RDS_USERNAME": { "Ref": { "CmpFn::Ref": "Parameter.AWSEBDBUser" } }, "RDS_PASSWORD": { "Ref": { "CmpFn::Ref": "Parameter.AWSEBDBPassword" } }, "RDS_DB_NAME": { "Ref": { "CmpFn::Ref": "Parameter.AWSEBDBName" } }, "RDS_HOSTNAME": { "Fn::GetAtt": [ "AWSEBRDSDatabase", "Endpoint.Address" ] }, "RDS_PORT": { "Fn::GetAtt": [ "AWSEBRDSDatabase", "Endpoint.Port" ] } } } } } } } }, "AWSEBRDSDatabase": { "Type": "AWS::RDS::DBInstance", "DeletionPolicy": "Delete", "Properties": { "DBName": { "Ref": { "CmpFn::Ref": "Parameter.AWSEBDBName" } }, "AllocatedStorage": "5", "DBInstanceClass": "db.t2.micro", "Engine": "postgres", "DBSecurityGroups": [ { "Ref": "AWSEBRDSDBSecurityGroup" } ], "MasterUsername": { "Ref": { "CmpFn::Ref": "Parameter.AWSEBDBUser" } }, "MasterUserPassword": { "Ref": { "CmpFn::Ref": "Parameter.AWSEBDBPassword" } }, "MultiAZ": false } }, "AWSEBRDSDBSecurityGroup": { "Type": "AWS::RDS::DBSecurityGroup", "Properties": { "DBSecurityGroupIngress": { "EC2SecurityGroupName": { "Ref": "AWSEBSecurityGroup" } }, "GroupDescription": "Enable database access to Beanstalk application" } } } }


A partir de diciembre de 2017 usamos las siguientes extensiones eléctricas

$ cat .ebextensions/rds.config Resources: AWSEBRDSDBSecurityGroup: Type: AWS::RDS::DBSecurityGroup Properties: EC2VpcId: Fn::GetOptionSetting: OptionName: "VpcId" GroupDescription: RDS DB VPC Security Group DBSecurityGroupIngress: - EC2SecurityGroupId: Ref: AWSEBSecurityGroup AWSEBRDSDBSubnetGroup: Type: AWS::RDS::DBSubnetGroup Properties: DBSubnetGroupDescription: RDS DB Subnet Group SubnetIds: Fn::Split: - "," - Fn::GetOptionSetting: OptionName: DBSubnets AWSEBRDSDatabase: Type: AWS::RDS::DBInstance DeletionPolicy: Delete Properties: PubliclyAccessible: true MultiAZ: false Engine: mysql EngineVersion: 5.7 BackupRetentionPeriod: 0 DBName: test MasterUsername: toor MasterUserPassword: 123456789 AllocatedStorage: 10 DBInstanceClass: db.t2.micro DBSecurityGroups: - Ref: AWSEBRDSDBSecurityGroup DBSubnetGroupName: Ref: AWSEBRDSDBSubnetGroup Outputs: RDSId: Description: "RDS instance identifier" Value: Ref: "AWSEBRDSDatabase" RDSEndpointAddress: Description: "RDS endpoint address" Value: Fn::GetAtt: ["AWSEBRDSDatabase", "Endpoint.Address"] RDSEndpointPort: Description: "RDS endpoint port" Value: Fn::GetAtt: ["AWSEBRDSDatabase", "Endpoint.Port"] AWSEBRDSDatabaseProperties: Description: Properties associated with the RDS database instance Value: Fn::Join: - "," - - Ref: AWSEBRDSDatabase - Fn::GetAtt: ["AWSEBRDSDatabase", "Endpoint.Address"] - Fn::GetAtt: ["AWSEBRDSDatabase", "Endpoint.Port"]

Con tales opciones personalizadas

$ cat .ebextensions/custom-options.config option_settings: "aws:elasticbeanstalk:customoption": DBSubnets: subnet-1234567,subnet-7654321 VpcId: vpc-1234567

Lo único: debe pasar explícitamente variables de env RDS_ * a su aplicación.