如何将通过 EC2 Auto Scaling 启动的实例设置为具有多个弹性网络接口(不同子网中均包含一个接口)?

上次更新日期:2022 年 6 月 27 日

当 Amazon Elastic Compute Cloud (Amazon EC2) Auto Scaling 启动新实例时,我想要其他子网中的另一个弹性网络接口与其自动连接在一起。此外,我还希望 EC2 弹性伸缩在实例终止时删除弹性网络接口。我该如何操作?

简短描述

EC2 弹性伸缩支持在弹性伸缩启动新实例时自动连接另一个弹性网络接口。但是,连接到实例的两个弹性网络接口需要位于相同子网中。

使用此解决方案,您可以将 EC2 Auto Scaling 启用的实例放置在您选择的两个不同子网中。例如,您可以在公有子网中拥有一个弹性网络接口,在私有子网中拥有另一个弹性网络接口。

注意:此解决方案还支持暖池和缩小到暖池。

为避免耗尽子网中的私有 IP 地址,请在实例终止时删除连接到该实例的弹性网络接口。这有助于防止您的账户达到弹性网络接口限制。

为此,请执行以下操作:

  1. 创建一个 AWS Lambda 函数,用于在实例位于 Pending:wait 状态时将第二个弹性网络接口连接到该实例。确保第二个弹性网络接口与第一个弹性网络接口位于不同的子网中。
  2. 为实例启动创建生命周期挂钩。
  3. 配置 Amazon EventBridge 规则或 Amazon Simple Notification Service (Amazon SNS) 主题来触发 Lambda 函数。在 Auto Scaling 启动新实例时 EC2 Instance-launch Lifecycle Action 将调用规则或 SNS 主题

注意:以下解决方案适用于在单个或多个可用区(每个可用区中包含两个子网)中启用的自动扩缩组。

解决方法

创建 Lambda 函数

创建一个用于执行以下操作的 Lambda 函数:

  • 检查连接到已启动实例的第一个网络接口的子网。
  • 将第二个弹性网络接口连接到弹性伸缩组上的该可用区中配置的另一个子网中的实例。

要创建 Lambda 函数,请执行以下操作:

1.    打开 Lambda 控制台

2.    选择 Create function (创建函数)

3.    选择从头开始创建

4.    在 Function(函数)名称字段中输入 Lambda 函数的名称,然后选择 Python 3.8 for Runtime

5.    选择下拉箭头展开 Permissions(权限),以更改 Lambda 函数的默认执行角色。您可以选择使用现有 AWS Identity and Access Management (IAM) 角色,或在 IAM 控制台上创建自定义角色。函数角色必须具有以下权限:

{
    "Statement": [{
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:logs:*:*:*"
        },
        {
            "Action": [
                "ec2:CreateNetworkInterface",
                "ec2:DescribeNetworkInterfaces",
                "ec2:DetachNetworkInterface",
                "ec2:DeleteNetworkInterface",
                "ec2:DescribeSubnets",
                "ec2:AttachNetworkInterface",
                "ec2:DescribeInstances",
                "ec2:ModifyNetworkInterfaceAttribute",
                "autoscaling:CompleteLifecycleAction",
                "autoscaling:DescribeAutoScalingGroups"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ],
    "Version": "2012-10-17"
}

6.    选择创建函数

7.    下载 Multiple ENI Auto Scaling(多 ENI 弹性伸缩)组 Python 脚本。然后将代码复制到 Function code(函数代码)字段。

8.    选择 Deploy(部署)选项卡,以确保已保存更改。

创建生命周期挂钩

创建生命周期挂钩以从 AWS 管理控制台触发事件。有关说明,请参阅添加生命周期挂钩(控制台)。或者,使用以下 AWS 命令行界面(AWS CLI)命令:

注意:对于此用例,将 Heartbeat timeout(心跳超时)参数设置为 300 秒,Default result(默认结果)参数设置为 ABANDON(放弃)。

aws autoscaling put-lifecycle-hook --lifecycle-hook-name my-lifecycle-launch-hook --auto-scaling-group-name my-asg --lifecycle-transition autoscaling:EC2_INSTANCE_LAUNCHING --heartbeat-timeout 300 --default-result ABANDON

注意:如果在运行 AWS CLI 命令时遇到错误,请确保您使用的是最新版本的 AWS CLI

触发 Lambda 函数

您可以使用 Amazon EventBridge 或 Amazon Simple Notification Service (Amazon SNS) 触发 Lambda 函数

创建一个用于触发 Lambda 函数的 EventBridge 规则

1.    打开 EventBridge 控制台

2.    从左侧导航窗格中选择 Rules(规则)。

注意:对于 Event bus(事件总线),请选择 AWS default event bus(AWS 默认事件总线)。当您账户中的 AWS 服务发出事件时,它始终会转至账户的默认事件总线。

3.    选择 Create rule(创建规则)。

4.    输入规则的 Name(名称)和 Description(描述)。

5.    在 Rule type(规则类型)下,选择 Rule with an event pattern(包含事件模式的规则),然后选择 Next(下一步)。

6.    在Event Source(事件源)的 Other(其他)下,将以下内容添加到 Event pattern(事件模式)部分,然后选择 Next(下一步)。

注意:在以下示例中,请将 AutoScalingGroupName 更改为您的弹性伸缩组的名称,并将 LifecycleHookName 更改为生命周期钩子的名称。

{
  "source": ["aws.autoscaling"],
  "detail-type": ["EC2 Instance-launch Lifecycle Action"],
  "detail": {
    "AutoScalingGroupName": ["my-asg"],
    "LifecycleHookName": ["my-lifecycle-launch-hook"]
  }
}

7.    对于 Target types(目标类型),请选择 AWS service(AWS 服务)。

8.    对于 Select a target(选择目标),请从下拉菜单中选择 Lambda function(Lambda 函数),然后选择您先前创建的 Lambda 函数。

9.    选择 Next(下一步)。

10.    (可选)为规则输入一个或多个标记。

11.    选择 Next(下一步)。

12.    查看规则的详细信息,然后选择 Create rule(创建规则)。

创建 Amazon SNS 主题以触发 Lambda 函数

要使用 SNS 主题,请执行以下操作:

1.    运行以下命令,以创建一个使用 AWS CLI 命令向 SNS 主题发送通知的生命周期钩子:

aws autoscaling put-lifecycle-hook --lifecycle-hook-name my-lifecycle-launch-hook --auto-scaling-group-name my-asg --lifecycle-transition autoscaling:EC2_INSTANCE_LAUNCHING --heartbeat-timeout 300 --default-result ABANDON --notification-target-arn <SNStopicARN>

2.    配置此 SNS 主题以触发 Lambda 函数

现在,当 Auto Scaling 启动新实例时,将会在其他子网中创建另一个弹性网络接口,并且会将该接口连接到该实例。

注意:未使用 Amazon Linux AMI 的启动模板可能需要使用在操作系统级别配置的其他选项才能创建其他接口。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?