如何在 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 配置的主要内容,如果未能解决你的问题,请参考以下文章