amazon-web-services - elastic beanstalk是什么




AWS CLI使用elasticbeanstalk create-environment创建RDS (3)

我如何使用create-environmentaws elasticbeanstalk另一个子命令创建一个RDS实例? 我试过几个参数组合无济于事。 下面是一个例子。

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命名空间指定的东西似乎都从配置中删除。


只需设置aws:rds:dbinstance选项不会创建RDS数据库。 目前,您可以使用以下技术之一创建RDS实例:

  1. 使用AWS控制台创建
  2. 使用eb cli
  3. 使用ebextensions的“资源”部分创建RDS资源

前两种方法是最方便的,因为它们为你做了所有的繁重工作,但是对于第三种方法,你必须做一些额外的工作。 第三种方法是如果您不使用控制台或eb CLI,您想要使用的方法。

您可以使用以下ebextension片段为您的beanstalk环境创建RDS资源。 在应用程序源的.ebextensions目录中创建一个名为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

这个文件是YAML格式,所以缩进很重要。 如果你喜欢,你也可以使用JSON。 这些不是选项设置,所以你不能把它作为--option-settings test.json 。 您只需要将此文件与您的应用程序源绑定即可。

阅读更多关于您可以在您的RDS数据库上配置的属性。 在此页面上,您还可以找到需要的属性以及可选的属性。

让我知道如果上述不适合你或如果你有任何进一步的问题。


我遇到了同样的问题,无法通过.ebextensions工作,而且我不喜欢EB CLI工具。

EB CLI使用未公开的API功能以及botocore库('eb_botocore')的自定义版本来实现此功能。 :(

所以我继续分叉botocore,并合并在eb_botocore使用的API数据文件中: https//github.com/boto/botocore/pull/396

然后,我在修改后的botocoreaws-cli (都是master)上运行“python setup.py install”,现在aws-cli在“aws elasticbeanstalk create-environment”命令中接受一个-template-specification选项。 万岁!

用法示例:

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

其中rds.us-west-2.json是:

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

(看起来您必须选择一个特定于您的EB区域的片段)。

而option-settings.json包含与问题(DBEngine,DBInstanceClass,DBAllocatedStorage,DBPassword)中列出的类似的RDS相关设置。

它工作很好。 我希望AWS CLI团队可以让我们将来在官方工具中使用这个功能。 我猜这不是一个小小的改变,或者他们已经做到了,但这是Elastic Beanstalk API和AWS CLI工具的一个非常重要的省略功能,所以希望他们能够采取一些措施。


截至2017年12月,我们使用以下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变量传递给你的应用程序。