如何設定透過 EC2 Auto Scaling 啟動的執行個體,以便在不同子網的各介面中使用多個彈性網絡介面?

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

當 Amazon Elastic Compute Cloud (Amazon EC2) Auto Scaling 啟動新執行個體時,我希望其他子網的第二個彈性網絡介面可以自動與該執行個體連接。我還希望 EC2 Auto Scaling 在執行個體終止時刪除彈性網絡介面。該如何進行?

簡短描述

EC2 Auto Scaling 支援在 Auto Scaling 執行新的執行個體時自動連接第二個彈性網絡介面。不過,與該執行個體連接的兩個彈性網絡介面都位於同一子網中。

使用此解決方案,您可以將 EC2 Auto Scaling 啟動的執行個體放置在您選擇的兩個不同子網中。例如,其中一個彈性網絡介面可位於公有子網中,另一個則位於私有子網中。

注意:此解決方案亦可使用暖集區及擴展至暖集區。

為避免在子網路中耗盡私有 IP 地址,執行個體終止時會刪除與該執行個體連接的彈性網絡介面。這樣可防止達到您帳戶的彈性網絡介面數量上限。

操作方式:

  1. 建立 AWS Lambda 函數,當執行個體處於 Pending:wait (待處理:等候) 狀態時,將第二個彈性網絡介面連接至執行個體。確定第二個彈性網絡介面與第一個彈性網絡介面位於不同的子網路中。
  2. 建立執行個體啟動的 lifecycle hook。
  3. 設定 Amazon EventBridge 規則或 Amazon Simple Notification Service (Amazon SNS) 主題,以觸發 Lambda 函數。當 Auto Scaling 啟動新執行個體時由 EC2 執行個體啟動生命週期動作叫用規則或 SNS 主題

注意:下列解決方案適用於在單一或多個可用區域中啟用的 Auto Scaling 群組,且每個可用區域中有兩個子網。

解決方案

建立 Lambda 函數

建立執行下列作業的 Lambda 函數:

  • 檢查與啟動的執行個體連接的第一個網路介面所在的子網路。
  • 將第二個彈性網絡介面連接至該 Auto Scaling 群組可用區域中設定的另一個子網路中的執行個體。

若要建立 Lambda 函數,請執行下列操作:

1.    開啟 Lambda 主控台

2.    選擇 Create function (建立函數)。

3.    選擇 Author from scratch (從頭編寫)。

4.    在 Function (函數) 名稱欄位中輸入 Lambda 函數的名稱,然後選擇 Python 3.8 for Runtime (執行時間使用 Python 3.8)。

5.    透過選取下拉式箭頭變更 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.    選擇 Create function (建立函數)。

7.    下載多個 ENI Auto Scaling 群組 Python 指令碼。然後將程式碼複製到 Function code (函數代碼) 欄位中。

8.    選取 Deploy (部署) 索引標籤以確保變更儲存下來。

建立 lifecycle hook

建立 lifecycle hook 以從 AWS 管理主控台觸發事件。如需指示,請參閱新增 lifecycle hook (主控台)。或者,使用下列 AWS Command Line Interface (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 更改成您的 Auto Scaling 群組名稱,並將 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.    選擇下一步

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 的啟動範本可能需要在作業系統層級設定其他選項,才能建立額外的介面。