如何在 Elastic Beanstalk Cloud Formation 脚本中强制 ELB 配置

Posted

技术标签:

【中文标题】如何在 Elastic Beanstalk Cloud Formation 脚本中强制 ELB 配置【英文标题】:How to force ELB configuration in an Elastic Beanstalk Cloud Formation script 【发布时间】:2015-12-22 06:30:31 【问题描述】:

我的目标是拥有一个 Cloud Formation 模板,它不仅可以自动创建具有 NAT 主机和堡垒主机的 VPC,而且还可以将从 S3 拉取的 .NET 应用程序部署到负载均衡的 Elastic Beanstalk 中,更重要的是只允许从我的办公室访问应用程序,而不是整个互联网。似乎即使应用程序可能位于私有子网中的 VPC 中并且 ELB 位于公共子网中,公共子网上的网络 ACL 也无关紧要。如果我只将公共子网锁定到我的办公室,来自办公室外部的连接仍然可以进入 ELB 并访问应用程序。

似乎可行的方法是将安全组应用于 ELB,但我看不到任何方法可以强制在“AWS::ElasticBeanstalk::Environment”对象中创建具有特定 SG 的特定 ELB。 ELB 和 ELB SG 由 beanstalk 自动创建,必须在 CF 运行后手动更改。我不想那样。我想要一种在 CF 中以自动化方式创建所有内容的方法,事后无需手动步骤。是的,我在手动创建的 stakc 上尝试过 Cloud Form。不,它没有给我我想要的。

这是我的 CF 模板的摘录:

"MyWebApp": 
  "Type": "AWS::ElasticBeanstalk::Application",
  "Properties": 
    "ApplicationName" : "AlmDemoWebApp",
    "Description": "MyWebapp"
  
,

"MyWebAppVersion": 
  "Type": "AWS::ElasticBeanstalk::ApplicationVersion",
  "Properties": 
    "ApplicationName": "Ref": "MyWebApp",
    "SourceBundle": 
      "S3Bucket": "mywebapp",
      "S3Key": "Fn::Join" : ["", ["MyWebApp.", "Ref":"Version", ".zip"]]
    
  
,


"MyWebAppEnvironment" : 
  "DependsOn" : ["MyWebApp", "MyWebAppVersion", "BastionSecurityGroup", "BeanstalkSecurityGroup", "VPC", "EBLoadBalancer", "EBLoadBalancerSecurityGroup", "PrivateSubnet", "PublicSubnet"],
  "Type" : "AWS::ElasticBeanstalk::Environment",
  "Properties" : 
    "ApplicationName" :  "Ref" : "MyWebApp" ,
     "Description" : "MyWebApp Target Environment",
     "SolutionStackName": "64bit Windows Server 2012 R2 running IIS 8.5",
     "OptionSettings" : [
       "Namespace" : "aws:autoscaling:launchconfiguration", "OptionName" : "SecurityGroups", "Value" :  "Ref" : "BeanstalkSecurityGroup" ,
       "Namespace" : "aws:autoscaling:launchconfiguration", "OptionName" : "EC2KeyName", "Value" :  "Ref" : "InstanceKeyName" ,
       "Namespace" : "aws:ec2:vpc", "OptionName" : "VPCId", "Value" :  "Ref" : "VPC" ,
       "Namespace" : "aws:ec2:vpc", "OptionName" : "Subnets", "Value" :  "Ref" : "PrivateSubnet" ,         
       "Namespace" : "aws:ec2:vpc", "OptionName" : "ELBSubnets", "Value" :  "Ref" : "PublicSubnet" ],
     "VersionLabel": "Ref": "MyWebAppVersion"
  

我可以在 AWS::ElasticBeanstalk::Environment -> Properties -> OptionSettings 中放入一些神秘且记录不充分的选项,这将强制 Elastic Beanstalk 使用先前在 CF 模板中配置的特定 ELB(“EBLoadBalancer ") 而不是自动创建一个具有随机名称的名称?将入口规则应用于“BeanstalkSecurityGroup”似乎没有帮助。显然,SG 规则必须在 ELB 上才能真正起作用。

【问题讨论】:

【参考方案1】:

听起来您需要为 Elastic Beanstalk 堆栈创建一个内部 ELB。为此,请创建如下属性。

"ELBScheme":  
     "Type":"String",
     "AllowedValues":[  
        "internal"
     ],
     "Default":"internal",
     "Description":"Internal load balancer in VPC so that your Elastic Beanstalk application cannot be accessed from outside your VPC."
  

并将其称为 AWS::ElasticBeanstalk::Environment "MyWebAppEnvironment" 中的命名空间

     
      "Namespace":"aws:ec2:vpc",
      "OptionName":"ELBScheme",
      "Value":"internal"
   

【讨论】:

以上是关于如何在 Elastic Beanstalk Cloud Formation 脚本中强制 ELB 配置的主要内容,如果未能解决你的问题,请参考以下文章

如何在 aws elastic beanstalk 环境实例启动上运行 shell 脚本

如何在 AWS Elastic Beanstalk 上修改 Nginx 配置

如何在 Elastic Beanstalk 上设置 Loggly?

如何在 Elastic Beanstalk 上安装 matplotlib

如何在 AWS Elastic Beanstalk 上运行 celery worker?

如何在 AWS Elastic Beanstalk 中选择特定平台?