EC2 Auto Scaling을 통해 시작한 인스턴스가 각 인터페이스가 서로 다른 서브넷에 있는 여러 개의 탄력적 네트워크 인터페이스를 갖도록 설정하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2022년 5월 3일

Amazon Elastic Compute Cloud(Amazon EC2) 자동 크기 조정이 새 인스턴스를 시작할 때, 다른 서브넷에 있는 두 번째 탄력적 네트워크 인터페이스가 자동으로 연결되기를 원합니다. 또한 EC2 자동 크기 조정에서 인스턴스 종료 시 탄력적 네트워크 인터페이스를 삭제하기를 원합니다. 어떻게 해야 합니까?

간략한 설명

EC2 자동 크기 조정은 새 인스턴스를 가동할 때 두 번째 탄력적 네트워크 인터페이스 연결을 지원합니다. 하지만 인스턴스에 연결된 두 탄력적 네트워크 인터페이스는 모두 동일한 서브넷에 위치하고 있습니다.

이 솔루션을 사용하면 원하는 두 개의 서로 다른 서브넷이 있는 인스턴스를 EC2 Auto Scaling이 시작할 수 있습니다. 예를 들어 탄력적 네트워크 인터페이스 하나는 퍼블릭 서브넷에 있고 다른 하나는 프라이빗 서브넷에 있을 수 있습니다.

참고: 이 솔루션은 웜 풀 및 웜 풀로의 확장도 지원합니다.

서브넷에서 프라이빗 IP 주소가 소진되는 것을 방지하기 위해, 인스턴스에 연결된 탄력적 네트워크 인터페이스는 인스턴스 종료 시 삭제됩니다. 이러면 계정의 탄력적 네트워크 인터페이스 한도에 도달하는 것을 방지할 수 있습니다.

이렇게 하려면 다음을 수행합니다.

  1. 인스턴스가 Pending:Wait 상태일 때 두 번째 탄력적 네트워크 인터페이스를 인스턴스에 연결하는 AWS Lambda 함수를 생성합니다. 두 번째 탄력적 네트워크 인터페이스가 첫 번째 탄력적 네트워크 인터페이스의 서브넷과 다른 서브넷에 위치하는지 확인합니다.
  2. 인스턴스 시작을 위한 수명 주기 후크를 생성합니다.
  3. 자동 크기 조정이에서 새 인스턴스를 시작할 때, EC2 인스턴스 시작 수명 주기 작업을 호출하도록 Amazon EventBridge 규칙을 구성합니다.
  4. Lambda 함수를 트리거하도록 EventBridge 규칙을 설정합니다.

참고: 다음 해결 방법은 각 가용 영역에 두 개의 서브넷이 있는 단일 또는 다중 가용 영역에서 활성화된 Auto Scaling 그룹에 대한 것입니다.

해결 방법

Lambda 함수 생성

다음을 수행하는 Lambda 함수를 생성합니다.

  • 시작된 인스턴스에 연결된 첫 번째 네트워크 인터페이스의 서브넷을 확인합니다.
  • Auto Scaling 그룹의 해당 가용 영역에 구성된 다른 서브넷의 인스턴스에 두번째 탄력적 네트워크 인터페이스를 연결합니다.

Lambda 함수를 생성하려면 다음을 수행합니다.

1.    Lambda 콘솔을 엽니다.

2.    함수 생성을 선택합니다.

3.    [새로 작성]을 선택합니다.

4.    함수 이름 필드에 Lambda 함수의 이름을 입력한 다음 Python 3.8 for Runtime을 선택합니다.

5.    Lambda 실행 역할의 드롭다운 화살표를 선택하여 권한을 확장합니다. Lambda에서 설명하고, 생성하고 인스턴스에 인터페이스를 연결할 수 있는 기존 AWS Identity and Access Management(IAM) 역할을 선택합니다. 또한 IAM 역할이 로그 그룹, 로그 스트림 및 PUT 로그 이벤트를 생성할 수 있는지 확인합니다.

사용자 지정 역할을 생성하도록 선택할 수도 있습니다. 함수 역할에는 다음 권한이 있어야 합니다.

{
    "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.    다중 ENI Auto Scaling 그룹 Python 스크립트를 다운로드합니다. 그런 다음 코드를 함수 코드 필드에 복사합니다.

8.    배포 탭을 선택하여 변경 사항이 저장되었는지 확인합니다.

수명 주기 후크 생성

AWS 관리 콘솔에서 또는 다음 AWS Command Line Interface(AWS CLI) 명령을 사용하여 이벤트를 트리거하는 수명 주기 후크를 생성합니다.

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 함수를 트리거하는 EventBridge 규칙 생성

1.    EventBridge 콘솔을 엽니다.

2.    왼쪽 탐색 창에서 규칙을 선택합니다.

참조: 이벤트 버스에서 AWS 기본 이벤트 버스를 선택합니다. 계정의 AWS 서비스에서 이벤트를 발생시키면 항상 계정의 기본 이벤트 버스로 이동합니다.

3.    규칙 생성(Create rule)을 선택합니다.

4.    규칙의 이름설명을 입력합니다.

5.    규칙 유형에서 이벤트 패턴이 있는 규칙을 선택한 후 다음을 선택합니다.

6.    기타이벤트 소스에서 선택하고 다음 내용을 이벤트 패턴 섹션에 추가한 후, 다음을 선택합니다.

참고: 다음 예제에서는 AutoScalingGroupName을 Auto Scaling 그룹의 이름으로 변경하고, LifecycleHookName을 수명 주기 후크의 이름으로 변경합니다.

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

7.    대상 유형에서 AWS 서비스 를선택합니다.

8.    대상 선택을 위해 드롭다운 메뉴에서 Lambda 함수를 선택한 다음, 이전에 생성한 Lambda 함수를 선택합니다.

9.    [Next]를 선택합니다.

10.    (선택 사항) 규칙에 대해 하나 이상의 태그를 입력합니다.

11.    [다음]을 선택합니다.

12.    규칙의 세부 정보를 검토하고 규칙 생성을 선택합니다.

이제 자동 크기 조정에서 새 인스턴스를 시작하면 다른 서브넷에 두 번째 탄력적 네트워크 인터페이스가 생성되어 인스턴스에 연결됩니다.

참고: Amazon Linux AMI를 사용하지 않는 시작 템플릿은 추가 인터페이스를 생성하기 위해 OS 수준에서 추가 옵션을 구성해야 할 수 있습니다.

또는 Amazon Simple Notification Service(Amazon SNS) 주제를 EventBridge 대신 사용하여 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.    Lambda 함수를 트리거하도록 이 SNS 주제를 구성합니다.