如何使用 CloudFormation 将安全组添加到现有 EC2 实例

Posted

技术标签:

【中文标题】如何使用 CloudFormation 将安全组添加到现有 EC2 实例【英文标题】:How to add a security group to an existing EC2 instance with CloudFormation 【发布时间】:2017-10-25 17:44:20 【问题描述】:

目前,我们的 AWS 基础设施有许多附加到我在控制台中创建的安全组的实例。

我们正在使用 CloudFormation 重新构建我们的安全组,因此我们可以在每条规则中添加注释和描述。

我的问题是:

当我使用 CloudFormation 创建新的安全组时,如何在不删除实例的情况下将其添加到现有 EC2 实例 我在 AWS 中看到了一些堆栈模板,但他们只有一个模板来创建具有安全组的新实例,所以我不知道如何仅为安全组创建堆栈。如果我更新堆栈,它会立即应用于所有实例吗? 如何将当前安全组导出为 JSON,这样我就不必在 CloudFormation 中重新创建所有安全组?

【问题讨论】:

【参考方案1】:

你不能。

Amazon CloudFormation 模板可以创建资源,这些资源可以引用同一模板中的其他资源。例如,您可以创建安全组和实例,并将实例配置为使用安全组。在在模板中进行此类引用时,可以按名称引用资源(例如SecurityGroup1Web Server)。

如果您希望 CloudFormation 中的资源与已存在的资源相关联,则需要通过其唯一 ID 引用外部资源

例如,可以在 CloudFormation 模板中创建 Amazon EC2 实例,并引用现有的安全组。

但是,您的需求正好相反!您希望修改现有资源以指向新资源。例如,修改现有实例以指向新的安全组。这在 CloudFormation 模板中不可能,因为它只能创建资源和配置这些资源——它不能修改模板之外的资源。

从逻辑上讲,在创建 Amazon EC2 实例之前需要存在安全组,因为实例链接到安全组。

导出为 JSON

如果您希望将现有资源导出到 CloudFormation 模板(例如导出当前安全组定义),您可以使用:

Using CloudFormer to Create AWS CloudFormation Templates from Existing AWS Resources hava.io visualops.io

【讨论】:

谢谢。所以我想我只是通过cloudformation创建安全组,然后我会去aws控制台手动更改每个实例。在需要更改安全组中的某些内容后,我将在 cloudformation 中进行编辑并更新堆栈。有意义吗? 是的,考虑到您的情况,这是正确的方法。 @JohnRotenstein,这似乎是基本要求之一。如果我不能使用 cloudformation 修改现有资源,那么与 ansible 或 terraform 相比,我有什么优势可以修改现有资源。 @PMat 您可以使用 CloudFormation 修改由 CloudFormation 创建的资源,只需修改最初创建资源的堆栈上的模板/参数。但是您不能使用 CloudFormation 修改不是由 CloudFormation 创建的资源,因为它不知道这些资源。 到目前为止,我已经将安全组作为实例和负载均衡器创建的一部分绑定在单独的模板中。但是现在,您提供了有关创建安全组并在不同模板中引用它们的见解。非常感谢。【参考方案2】:

添加安全组不会重新创建您的实例,只会修改它。

你可以测试一下:

添加安全组,执行变更集 将该安全组添加到您的实例(在同一模板中)并 再次进行变更集
YourSecurityGroup:
  < enter code here >

YourInstance:
  Properties:
   SecurityGroupIds:
     - !Ref YourSecurityGroup

【讨论】:

如果您通过 CloudFormation 创建了已经运行的实例,则只需更新 SecurityGroupIds (docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/…) 列表,它不会破坏该实例。如果您在NetworkInterfaces 下定义了安全组,则更新它会替换实例。 你想说上面的例子行不通吗?你试过了吗?

以上是关于如何使用 CloudFormation 将安全组添加到现有 EC2 实例的主要内容,如果未能解决你的问题,请参考以下文章

如何指定安全组中的所有端口 - CloudFormation

AWS CloudFormation VPC CIDR 分配给安全组

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

AWS Cloudformation:如何在 AWS 弹性 beanstalk 配置中引用多个安全组

在 CloudFormation 模板中引用 AWS Parameter Store 的安全字符串

为堆叠频率表中的每个组添加一列总 n