6

Wie kann ich eine RDS-Instanz mit dem create-environment oder einem anderen Unterbefehl von aws elasticbeanstalk erstellen? Ich habe mehrere Kombinationen von Parametern vergeblich versucht. Unten ist ein Beispiel.AWS CLI create RDS mit 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 

Und der Inhalt 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" 
} 
] 

Wer weiß, warum dies nicht möglich ist? Alles, was ich mit einem aws:rds:dbinstance Namespace spezifiziere, scheint aus der Konfiguration entfernt zu werden.

Antwort

6

Wenn Sie nur die aws: rds: dbinstance-Optionen festlegen, wird keine RDS-Datenbank erstellt. Aktuell können Sie eine RDS-Instanz mit einer der folgenden Techniken erstellen:

  1. erstellen AWS Console
  2. Verwenden eb cli
  3. Verwenden Resources section of ebextensions ein RDS-Ressource

Die ersten beiden Ansätze zu schaffen sind am bequemsten, da sie das ganze schwere Heben für dich erledigen, aber für das dritte musst du etwas mehr Arbeit machen. Der dritte Ansatz ist der, den Sie verwenden möchten, wenn Sie nicht die Konsole oder eb CLI verwenden.

Sie können eine RDS-Ressource für Ihre Beanstalk-Umgebung mit dem folgenden Erweiterungs-Snippet erstellen. Erstellen Sie im Verzeichnis .ebextensions Ihrer App-Quelle eine Datei mit dem Namen 01-rds.config.

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

Diese Datei ist im YAML-Format, daher ist der Einzug wichtig. Sie können JSON auch verwenden, wenn Sie möchten. Dies sind keine Optionseinstellungen, daher können Sie sie nicht als --option-settings test.json übergeben. Sie müssen diese Datei nur mit Ihrer App-Quelle bündeln.

Lesen Sie mehr über die Eigenschaften, die Sie in Ihrer RDS-Datenbank konfigurieren können here. Auf dieser Seite finden Sie auch, welche Eigenschaften benötigt werden und welche optional sind.

Lassen Sie mich wissen, ob das oben für Sie nicht funktioniert oder wenn Sie weitere Fragen haben.

+0

Also ist die '01-rds.config' wie die EB Kommandozeilen-Tools es tun? – ranman

+0

Haben Sie das auch versucht? Wenn ich es versuche, enden meine Umgebungen sofort und ich kann anscheinend keine Protokolle von ihnen bekommen. – ranman

+0

SWEET Ich habe es herausgefunden. Die ekstatische Freude, die ich gerade erlebe, ist fantastisch. Ihr schaukelt. Ich habe eine kleine Bearbeitung zu Ihrer Antwort korrigiert die Parameter-Namen für 01-rds.config Ich habe herausgefunden, das ist, wie die eb Kommandozeilen-Tools es tun. – ranman

1

Ich hatte das gleiche Problem, konnte es über .exextensions nicht funktionieren, und ich mag das EB CLI-Tool nicht.

EB CLI verwendet eine nicht dokumentierte API-Funktion und eine angepasste Version der botocore-Bibliothek (eb_botocore), um dies zu ermöglichen. :(

Also ging ich weiter und botocore gegabelt, und fusionierte in der API-Datendatei von eb_botocore verwendet: https://github.com/boto/botocore/pull/396

Dann lief ich 'Python setup.py install' auf beide my modified botocore und aws-cli (beide Master) und aws-cli akzeptiert jetzt eine --template-Spezifikation Option auf dem Befehl 'aws elasticbeanstalk-Umgebung zu schaffen' Hooray

Beispiel Nutzung:.!

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

wo rds.us-west-2.json ist:

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

(es scheint, Sie müssen ein Snippet für Ihre EB-Region auswählen).

und option-settings.json enthält RDS-bezogene Einstellungen, die denen in der Frage ähnlich sind (DBEngine, DBInstanceClass, DBAllocatedStorage, DBPassword).

Es funktioniert super. Ich hoffe, dass das AWS CLI-Team es uns ermöglicht, dieses Feature in Zukunft im offiziellen Tool zu verwenden. Ich vermute, es ist keine geringfügige Änderung oder sie hätten es bereits getan, aber es ist eine ziemlich große Unterlassung funktional aus der Elastic Beanstalk API und AWS CLI-Tool, so dass sie hoffentlich einen Riss machen.

+1

Nur ein Update, dass diese Antwort ab 9/2015 nicht aktuell ist, das CLI ist jetzt ziemlich anders. – ranman

1

Die anderen Antworten nicht ab September 2015. Nach viel Versuch und Irrtum in meiner Umgebung nicht funktioniert, wird die folgende für mich gearbeitet:

Config Template-Schnipsel (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 /rds.config Datei (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

Update, dass ab Januar 2016 der obige Ansatz nicht mehr funktioniert. –

0

Ab Dezember 2017 nutzen wir die folgenden 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"] 

Mit einer solchen benutzerdefinierten Optionen

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

Das einzige, was - Sie haben explizit Variablen RDS_ * env auf Ihre Anwendung zu übergeben.