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:
- Crear usando AWS Console
- Use eb cli
- 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.