6

Come posso creare un'istanza RDS con create-environment o un altro sottocomando di aws elasticbeanstalk? Ho provato diverse combinazioni di parametri senza alcun risultato. Di seguito è un esempio.AWS CLI crea RDS con elasticbeanstalk create-environment

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 

E il contenuto di 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" 
} 
] 

Chiunque sa perché questo sta venendo a mancare? Qualsiasi cosa specifichi con uno spazio dei nomi aws:rds:dbinstance sembra essere rimosso dalla configurazione.

risposta

6

Basta impostare aw: rds: le opzioni dbinstance non creano un database RDS. Attualmente è possibile creare un'istanza RDS utilizzando uno dei seguenti tecniche:

  1. Crea utilizzando AWS Console
  2. Usa eb cli
  3. Usa Resources section of ebextensions per creare una risorsa RDS

I primi due approcci sono i più convenienti in quanto fanno tutto il lavoro pesante per te, ma per il terzo devi fare del lavoro extra. Il terzo approccio è quello che vorresti usare se non stai usando la console o eb CLI.

È possibile creare una risorsa RDS per l'ambiente beanstalk utilizzando il seguente frammento di ebextension. Creare un file chiamato 01-rds.config nella directory .ebextensions della sorgente dell'app.

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

Questo file è in formato YAML, quindi il rientro è importante. Puoi anche usare JSON se vuoi. Queste non sono le impostazioni delle opzioni quindi non è possibile passarlo come --option-settings test.json. Hai solo bisogno di unire questo file con la tua fonte app.

Ulteriori informazioni sulle proprietà che è possibile configurare sul database RDS here. In questa pagina puoi anche trovare quali proprietà sono richieste e quali proprietà sono opzionali.

Fatemi sapere se quanto sopra non funziona per voi o se avete ulteriori domande.

+0

Quindi il '01-rds.config' come fanno gli strumenti della riga di comando EB? – ranman

+0

Anche tu ci hai provato? Quando lo provo, i miei ambienti si arrestano all'istante e non riesco a ottenere alcun registro da loro. – ranman

+0

SWEET L'ho capito. La gioia estatica che sto vivendo in questo momento è fantastica. Ragazzi, rockate. Ho apportato una piccola modifica alla risposta correggendo i nomi dei parametri per 01-rds.config Ho capito che questo è il modo in cui gli strumenti della riga di comando eb lo fanno. – ranman

1

Ho avuto lo stesso problema, non riuscivo a farlo funzionare tramite .ebextensions e non mi piace lo strumento EB CLI.

EB CLI utilizza una funzionalità API non documentata e una versione personalizzata della libreria botocore ('eb_botocore') per farlo funzionare. :(

Così sono andato avanti e botocore biforcuta, e fusa nel file di dati API utilizzata dai eb_botocore: https://github.com/boto/botocore/pull/396

Poi corsi 'python setup.py install' su entrambi my modified botocore e aws-cli (sia a master) e AWS-cli ora accetta un'opzione --template-specifica sulle 'AWS elasticbeanstalk create-ambiente' comando Evviva

Esempio utilizzo:.!

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

dove rds.us-ovest-2.JSON è:

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

(che appare è necessario selezionare un frammento specifico per la vostra regione EB).

e option-settings.json contiene impostazioni relative a RDS simili a quelle elencate nella domanda (DBEngine, DBInstanceClass, DBAllocatedStorage, DBPassword).

Funziona benissimo. Spero che il team di AWS CLI ci consenta di utilizzare questa funzionalità nello strumento ufficiale in futuro. Immagino che non sia un cambiamento banale o lo avrebbero già fatto, ma è una funzionalità di omissione piuttosto importante, dall'API Elastic Beanstalk e dallo strumento CLI di AWS, quindi spero che si prendano una brutta copia.

+1

Solo un aggiornamento che questa risposta non è aggiornata a partire dal 9/2015 la CLI è abbastanza diversa ora. – ranman

1

Le altre risposte non hanno funzionato nel mio ambiente come di settembre 2015. Dopo molti tentativi ed errori, i seguenti ha lavorato per me:

template di configurazione frammento (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 

.ebextensions file di /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" 
     } 
    } 
    } 
} 
+0

Aggiornamento che a partire da gennaio 2016 l'approccio sopra non funziona più. –

0

a partire dal dicembre 2017 abbiamo utilizzare i seguenti ebextensions

$ 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 tali opzioni personalizzate

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

Le uniche cose - si deve passare in modo esplicito RDS_ * variabili env alla vostra applicazione.