如何在CloudFormation模板中为Elastic Beanstalk启动配置指定安全组?

时间:2016-11-18 06:53:24

标签: amazon-web-services elastic-beanstalk amazon-cloudformation aws-security-group

我在CloudFormation模板中定义了以下安全组:

<?php 
$xml=simplexml_load_file("wallpaper.xml") or die("Error: Cannot create object"); 
foreach (array_chunk($xml->children, 25, true) as $array) {
    foreach ($array as $wall)
    { 
        echo "<a href='" . $wall->url . "' target='_blank'><img src='"$wall->thumbnail . "' alt='Wallpaper' /></a> \n";
    }
    echo '<div id="banner">Test</div>';} 
?>

我还定义了一个Elastic Beanstalk环境,其中包含OptionSettings中的以下内容:

"APIInstanceSG": {
  "Type": "AWS::EC2::SecurityGroup",
  "Properties": {
    "GroupDescription": "Security Group for Application EC2 Instances,
    "VpcId": "vpc-10a75377",
    "Tags": [{
      "Key": "Name",
      "Value": "APIInstanceSG" }
    }]
  }
}

当我使用此模板创建堆栈时,安全组是在CloudFormation尝试创建EB环境之前创建的,但是当它尝试创建EB环境时,它会出现以下错误:

  

配置验证例外:无效的选项值:&#39; sg-994fcbe4&#39; (命名空间:&#39; aws:autoscaling:launchconfiguration&#39;,OptionName:&#39; SecurityGroups&#39;):安全组&#39; sg-994fcbe4&#39;不存在

sg-994fcbe4是已创建的安全组的ID enter image description here

Elastic Beanstalk Environment配置如下:

{
  "Namespace": "aws:autoscaling:launchconfiguration",
  "OptionName": "SecurityGroups",
  "Value": { "Ref": "APIInstanceSG" }
}

4 个答案:

答案 0 :(得分:10)

在查看您的AWS :: ElasticBeanstalk :: Environment资源后,我能够重现您遇到的错误。正如Marc Young在对您的问题的评论中建议的那样,您没有为您的环境指定VPC。由于您的安全组位于VPC中,因此无法从同一VPC中的资源访问它。

要解决此问题,您必须将以下配置选项添加到您的环境中:

{
  "Namespace" : "aws:ec2:vpc",
  "OptionName" : "VPCId",
  "Value" : "vpc-10a75377"
},

如果指定VPC,则使用更新的模板创建堆栈将失败,并显示一条错误消息,指出您还需要指定环境子网,因此您必须添加以下选项:

{
  "Namespace" : "aws:ec2:vpc",
  "OptionName" : "Subnets",
  "Value" : <insert the subnet for your instances here>
},
{
  "Namespace" : "aws:ec2:vpc",
  "OptionName" : "ELBSubnets",
  "Value" : <insert the subnet for your load balancer here>
}

您可以在Elastic Beanstalk CloudFormation sample templates中查看VPC中Beanstalk应用程序的工作示例。

答案 1 :(得分:0)

要克服这个问题:

  

您需要从AWS CLI更改EB安全组,您无法从AWS Web Console更改。

考虑到您已经拥有AWS CLI installed ,如果您想要更改安全组,则需要执行此命令:

aws elasticbeanstalk update-environment –environment-name –option-settings Namespace=aws:autoscaling:launchconfiguration,OptionName=SecurityGroups,Value=””

Source

答案 2 :(得分:0)

您应该在LC定义中设置DependsOn属性,以确保在堆栈创建期间它存在于SG之前。否则你不能保证引用会起作用。

"APIInstanceSG": {
  "Type": "AWS::EC2::SecurityGroup",
  "Properties": {
    "GroupDescription": "Security Group for Application EC2 Instances,
    "VpcId": "vpc-10a75377",
    "Tags": [{
      "Key": "Name",
      "Value": "APIInstanceSG" }
    }]
  },
  "DependsOn" : "APIInstanceSG"
}

http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html

答案 3 :(得分:0)

在您的模板中,而不是

"DependsOn" : "RDSInstance"

写:

"DependsOn": ["APIInstanceSG", "RDSInstance"]

更多信息:http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html