如何构建一个只有一个EC2实例的CloudFormation和Elastic Beanstalk解决方案



此直接CloudFormation代码片段是中提供的示例ElasticBeanstalk应用程序的一部分https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/sample-templates-services-ap-south-1.html

"Mappings" : {
"Region2Principal" : {
"us-east-1"      : { "EC2Principal" : "ec2.amazonaws.com", "OpsWorksPrincipal" : "opsworks.amazonaws.com" },
"us-west-2"      : { "EC2Principal" : "ec2.amazonaws.com", "OpsWorksPrincipal" : "opsworks.amazonaws.com" },
"us-west-1"      : { "EC2Principal" : "ec2.amazonaws.com", "OpsWorksPrincipal" : "opsworks.amazonaws.com" },
"eu-west-1"      : { "EC2Principal" : "ec2.amazonaws.com", "OpsWorksPrincipal" : "opsworks.amazonaws.com" },
"eu-west-2"      : { "EC2Principal" : "ec2.amazonaws.com", "OpsWorksPrincipal" : "opsworks.amazonaws.com" },
"eu-west-3"      : { "EC2Principal" : "ec2.amazonaws.com", "OpsWorksPrincipal" : "opsworks.amazonaws.com" },
"ap-southeast-1" : { "EC2Principal" : "ec2.amazonaws.com", "OpsWorksPrincipal" : "opsworks.amazonaws.com" },
"ap-northeast-1" : { "EC2Principal" : "ec2.amazonaws.com", "OpsWorksPrincipal" : "opsworks.amazonaws.com" },
"ap-northeast-2" : { "EC2Principal" : "ec2.amazonaws.com", "OpsWorksPrincipal" : "opsworks.amazonaws.com" },
"ap-northeast-3" : { "EC2Principal" : "ec2.amazonaws.com", "OpsWorksPrincipal" : "opsworks.amazonaws.com" },
"ap-southeast-2" : { "EC2Principal" : "ec2.amazonaws.com", "OpsWorksPrincipal" : "opsworks.amazonaws.com" },
"ap-south-1"     : { "EC2Principal" : "ec2.amazonaws.com", "OpsWorksPrincipal" : "opsworks.amazonaws.com" },
"us-east-2"      : { "EC2Principal" : "ec2.amazonaws.com", "OpsWorksPrincipal" : "opsworks.amazonaws.com" },
"ca-central-1"   : { "EC2Principal" : "ec2.amazonaws.com", "OpsWorksPrincipal" : "opsworks.amazonaws.com" },
"sa-east-1"      : { "EC2Principal" : "ec2.amazonaws.com", "OpsWorksPrincipal" : "opsworks.amazonaws.com" },
"cn-north-1"     : { "EC2Principal" : "ec2.amazonaws.com.cn", "OpsWorksPrincipal" : "opsworks.amazonaws.com.cn" },
"cn-northwest-1" : { "EC2Principal" : "ec2.amazonaws.com.cn", "OpsWorksPrincipal" : "opsworks.amazonaws.com.cn" },
"eu-central-1"   : { "EC2Principal" : "ec2.amazonaws.com", "OpsWorksPrincipal" : "opsworks.amazonaws.com" },
"eu-north-1"     : { "EC2Principal" : "ec2.amazonaws.com", "OpsWorksPrincipal" : "opsworks.amazonaws.com" }
}
},
"Conditions" : {
"Is-EC2-VPC"     : { "Fn::Or" : [ {"Fn::Equals" : [{"Ref" : "AWS::Region"}, "eu-central-1" ]},
{"Fn::Equals" : [{"Ref" : "AWS::Region"}, "cn-north-1" ]}]},
"Is-EC2-Classic" : { "Fn::Not" : [{ "Condition" : "Is-EC2-VPC"}]}
},
"Resources": {
"WebServerRole": {
"Type": "AWS::IAM::Role",
"Properties" : {
"AssumeRolePolicyDocument" : {
"Statement"  : [{
"Effect"   : "Allow",
"Principal": { "Service": [{ "Fn::FindInMap" : ["Region2Principal", {"Ref" : "AWS::Region"}, "EC2Principal"]}] },
"Action"   : [ "sts:AssumeRole" ]
} ]
},
"Path": "/"
}
},
"WebServerRolePolicy": {
"Type": "AWS::IAM::Policy",
"Properties": {
"PolicyName" : "WebServerRole",
"PolicyDocument" : {
"Statement"  : [ {
"Effect"    : "Allow",
"NotAction" : "iam:*",
"Resource"  : "*"
} ]
},
"Roles": [ { "Ref": "WebServerRole" } ]
}
},
"WebServerInstanceProfile": {
"Type": "AWS::IAM::InstanceProfile",
"Properties": {
"Path": "/",
"Roles": [ { "Ref": "WebServerRole" } ]
}
},
"SampleApplication": {
"Type": "AWS::ElasticBeanstalk::Application",
"Properties": {
"Description": "AWS Elastic Beanstalk Sample Application"
}
},
"SampleApplicationVersion" : {
"Type" : "AWS::ElasticBeanstalk::ApplicationVersion",
"Properties" : {
"Description" : "Version 1.0",
"ApplicationName" : { "Ref" : "SampleApplication" },
"SourceBundle" : {
"S3Bucket": { "Fn::Join" : ["-", ["cloudformation-examples", {"Ref" : "AWS::Region" }]]},
"S3Key": "CloudFormationBeanstalkRDSExample.war"
}
}
},

我在AWS上只有Free Tier帐户,所以我不想花钱测试它的行为。描述中写道:

警告此模板创建一个或多个Amazon EC2实例和一个Amazon关系数据库服务数据库实例。如果您使用此模板创建堆栈,则将为所使用的AWS资源收取费用。

我的问题是,如果启动,它将创建多少个实例?我看不到任何限制,但Mappings部分似乎太长了,我想至少有不止一个限制。Conditions有两个条目,这是否意味着也有两个实例?我想找到一个只有一个实例运行的解决方案,只限制区域就足够了吗?或者如何将创建的EC2数量限制为只有一个

我认为你在使用这个模板。https://s3-ap-south-1.amazonaws.com/cloudformation-templates-ap-south-1/ElasticBeanstalk_Simple.template

在这种情况下,它创建的数据库是db.t2.small。RDS的亚马逊免费层仅为db.t2.micro。如果您将模板编辑为免费层,则警告应消失

更多信息请点击此处:https://aws.amazon.com/rds/free/

实际上,我找到了一条路:

我把这个解决方案作为基础:

AWSTemplateFormatVersion: '2010-09-09'
Resources:
sampleApplication:
Type: AWS::ElasticBeanstalk::Application
Properties:
Description: AWS Elastic Beanstalk Sample Application
sampleApplicationVersion:
Type: AWS::ElasticBeanstalk::ApplicationVersion
Properties:
ApplicationName:
Ref: sampleApplication
Description: AWS ElasticBeanstalk Sample Application Version
SourceBundle:
S3Bucket: !Sub "elasticbeanstalk-samples-${AWS::Region}"
S3Key: php-newsample-app.zip
sampleConfigurationTemplate:
Type: AWS::ElasticBeanstalk::ConfigurationTemplate
Properties:
ApplicationName:
Ref: sampleApplication
Description: AWS ElasticBeanstalk Sample Configuration Template
OptionSettings:
- Namespace: aws:autoscaling:asg
OptionName: MinSize
Value: '2'
- Namespace: aws:autoscaling:asg
OptionName: MaxSize
Value: '6'
- Namespace: aws:elasticbeanstalk:environment
OptionName: EnvironmentType
Value: LoadBalanced
SolutionStackName: 64bit Amazon Linux 2018.03 v2.8.15 running PHP 7.2
sampleEnvironment:
Type: AWS::ElasticBeanstalk::Environment
Properties:
ApplicationName:
Ref: sampleApplication
Description: AWS ElasticBeanstalk Sample Environment
TemplateName:
Ref: sampleConfigurationTemplate
VersionLabel:
Ref: sampleApplicationVersion

(位于https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/quickref-elasticbeanstalk.html)

在那里,如果我将EnvironmentType更改为SingleInstance,我会得到一个我想要的单实例解决方案。

(位于https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/command-options-general.html#command-选项通用弹性(环境(

我还没有测试过,但我想我可以用同样的方式删除MinSizeMaxSize,因为这是一个实例。

最新更新