AWS CLI создает RDS с помощью среды создания elasticbeanstalk
как я могу создать экземпляр RDS с помощью create-environment
или другая подкоманда aws elasticbeanstalk
? Я пробовал несколько комбинаций параметров безрезультатно. Ниже приведен пример.
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
и содержание 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"
}
]
кто-нибудь знает, почему это не удается? Ничего я указывать с aws:rds:dbinstance
пространство имен, похоже, удаляется из конфигурации.
4 ответов
просто настройка параметров aws:rds: dbinstance не создает базу данных RDS. В настоящее время можно создать экземпляр RDS, используя один из следующих методов:
- создать с помощью AWS Console
- использовать eb cli
- использовать раздел ресурсов ebextensions для создания ресурса RDS
первые два подхода являются наиболее удобными, так как они делают всю тяжелую работу для вас, но для третьего один вы должны сделать дополнительную работу. Третий подход-это то, что вы хотели бы использовать, если вы не используете консоль или EB CLI.
вы можете создать ресурс RDS для вашей среды beanstalk, используя следующий фрагмент ebextension. Создайте файл с именем 01-rds.config
на .ebextensions
каталог источника вашего приложения.
Resources:
AWSEBRDSDatabase:
Type: AWS::RDS::DBInstance
Properties:
AllocatedStorage: 5
DBInstanceClass: db.t2.micro
DBName: myawesomeapp
Engine: postgres
EngineVersion: 9.3
MasterUsername: myAwesomeUsername
MasterUserPassword: myCrazyPassword
этот файл находится в формате YAML, поэтому отступ важен. Вы также можете использовать JSON, если хотите.
Это не настройки параметров, поэтому вы не можете передать его as --option-settings test.json
. Вам просто нужно связать этот файл с источником приложения.
подробнее о том, какие свойства можно настроить в базе данных RDS здесь. На этой странице вы также можете узнать, какие свойства требуются и какие свойства являются необязательными.
Дайте мне знать, если выше не работает для вас или если у вас возникли дополнительные вопросы.
у меня была та же проблема, не удалось заставить ее работать .ebextensions, и мне не нравится инструмент EB CLI.
EB CLI использует недокументированную функцию API и настроенную версию библиотеки botocore ('eb_botocore'), чтобы сделать эту работу. :(
поэтому я пошел вперед и раздвоил botocore и объединился в файле данных API, используемом eb_botocore:https://github.com/boto/botocore/pull/396
затем я побежал 'python setup.py установить' на обоих мой изменен botocore и aws-cli (оба в master), и aws-cli теперь принимает параметр --template-specification в команде "aws elasticbeanstalk create-environment". Ура!
пример использования:
aws elasticbeanstalk create-environment\
...various options...\
--option-settings file://option-settings.json
--template-specification file://rds.us-west-2.json
где rds.США-Запад-2.json is:
{
"TemplateSnippets": [{
"SnippetName": "RdsExtensionEB",
"Order": 10000,
"SourceUrl":
"https://s3.amazonaws.com/elasticbeanstalk-env-resources-us-west-2/eb_snippets/rds/rds.json"
}]
}
(похоже, вы должны выбрать фрагмент, специфичный для вашего региона EB).
и option-настройки.json содержит настройки, связанные с RDS, аналогичные тем, которые перечислены в вопросе (DBEngine, DBInstanceClass, DBAllocatedStorage, DBPassword).
Он отлично работает. Я надеюсь, что команда AWS CLI позволит нам использовать эту функцию в официальном инструменте в будущем. Я предполагаю, что это не тривиальное изменение, или они бы уже сделали это, но это довольно крупное функциональное упущение от API Elastic Beanstalk и инструмента AWS CLI, поэтому, надеюсь, они возьмут трещину в нем.
другие ответы не работали в моей среде по состоянию на сентябрь 2015 года. После долгих проб и ошибок для меня сработало следующее:
фрагмент шаблона конфигурации (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.файл конфигурации (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"
}
}
}
}
по состоянию на декабрь 2017 года мы используем следующие 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"]
С такими пользовательскими опциями
$ cat .ebextensions/custom-options.config
option_settings:
"aws:elasticbeanstalk:customoption":
DBSubnets: subnet-1234567,subnet-7654321
VpcId: vpc-1234567
единственное - вы должны явно передать переменные rds_* env в свое приложение.