본문 바로가기

AWS/파워쉘로 배우는 AWS

#19 [EC2] NIC(ENI)를 추가해보자.

이번엔 Instance NIC 추가해 보도록 하겠습니다. 전에 NIC 추가하면 어떤 것들에 이점이 있는지 살펴봅시다.



AWS에서 권장하는 방식으로는 위와 같이 4가지로 나옵니다. 개인적으로는 4가지 이외에 많은 부분들에서 이점을 얻을 있을 같습니다. 내용들은 다음과 같습니다.

  1. 관리 Network 대역을 나누어 사용할 있다.
    내용은 아주 고리타분한 내용이지만, 실제로는 매우 유용하게 사용할 있습니다. ENI 기준으로 Security Group 지정할 있기 때문에, 관리 대역과 통신하는 ENI 보안정책을 다르게 주어주면 좀더 관리가 편해지기 때문입니다.
  2. NAT, IGW Public Subnet 내부만 통신되는 Private Subnet 동시에 사용하여 통신한다.
    이렇게 만들면 보안에 취약할 있다고 생각되지만, 기존 ENI 설정하는 것이 아니라 따로 ENI 제작하여 사용하는 이유는, 서비스에 영향이 없이 외부통신을 막아버리고 싶을 ENI 버리면 손쉽게 처리되기 때문입니다. Security Group 수정하는 보다 ENI 떼버리는 것이 서비스에 영향을 적게 있기 때문입니다.
  3. Cloud Watch Metric 나누어 있다.
    아직 설명은 하지 않았지만 AWS 모니터링 서비스인 Cloud Watch에서 제공하는 Metric 값을 따로 확인할 있는 점이 유용하게 쓰일 같습니다. 예를 들어 Frontend Backend 사이에 있는 Instance 경우 Frontend ENI, Backend ENI 나누어두면 각각의 Metric 나누어 있으니 문제 해결이나 프로그램 고도화시 좋은 지표가 있을 것입니다.
  4. 여러 개의 Web Service를 하나의 Instance에서 실행할 유용하다.
    2
    번과 3번의 이점이 그대로 적용되는 상황이라고 생각합니다. Service 중지할 ENI 떼버리면 Service 통신이 안되어 중지상태가 되고, Service Cloud Watch Metric 별개로 있어 유용하게 쓰일 같습니다.
  5. 고가용성 솔루션을 제작할 있다.
    별로 추천하고 싶지는 않지만 ENI 설정된 Private IP, EIP(Public IP) 바뀌지 않기 때문에 Application에서 수정   없이 ENI 다른 Instance 이동시키면 해당 IP 통신이 되니 고가용성 구성이 가능합니다.

시나리오도 충분히 가능해 보입니다만, 생각엔 대부분 위에 기술한 내용들과 연관이 있을 같습니다. 추가적으로 다음 내용은 AWS문서에서 모범 사례로 소개한 내용들입니다.



눈여겨 보실 부분은 번째에 eth0(Instance 생성시 생성되는 ENI) 제거가 되지 않는다는 내용과 마지막에 ENI 추가로 연결해도 네트워크 대역폭은 늘어나지 않으니 참고 바랍니다.

 

서론이 길었네요. 우선 ENI 살펴보도록 하겠습니다.

PS> Get-EC2NetworkInterface


 



아직도 불만입니다만, cmdlet 결과 값이 친절하지 않습니다.

위에서 개의 ENI 확인되는 이유는 현재 Oregon Region 생성된 Instance 2 이기 때문입니다. 위에서 언급된 eth0라는 녀석이죠. 그럼 언제나 그랬듯 하나하나 파헤쳐 봅시다.

Association: Public IP 대한 정보입니다. EIP 지정 EIP정보가 포함되어 있습니다.

Attachment: ENI 연결 정보입니다.

AvailabilityZone: ENI 소속된 AZ 입니다.

Description: 설명….

Groups: ENI 설정된 Security Group입니다.

MacAddress: ENI MAC 주소입니다.

NetworkInterfaceId: ENI ID입니다.

OwnerId: 제작한 사용자입니다.

PrivateDnsName: 내부 DNS Name 입니다.

PrivateIpAddress: 내부 IP 주소입니다.

PrivateIpAddresses: 내부 IP 주소에 대한 정보입니다. 하나의 ENI에 여러 개의 IP 삽입할 확인이 필요합니다.

RequesterId: ENI 관리하는 AWS 서비스 ID입니다.

RequesterManaged: ENI 관리하는 AWS 서비스가 있는지에 대한 정보입니다.

SourceDestCheck: In/Out traffic 확인 여부입니다.

Status: ENI 상태입니다. In-use 현재 Instance attach되어있다는 의미입니다.

SubnetId: ENI 소속된 Subnet ID입니다.

TagSet: Tag입니다.

VpcId: ENI 소속된 VPC ID입니다.

굵은 글씨로 부분들은 필요한 부분들이니 확인하시기 바랍니다. Object 참조로 숨겨져 있는 값들을 확인해 보겠습니다.


PS> (Get-EC2NetworkInterface -Filter @{ name= 'network-interface-id'; values= "eni-4c57b334" }).Association

PS> (Get-EC2NetworkInterface -Filter @{ name= 'network-interface-id'; values= "eni-4c57b334" }).Attachment

PS> (Get-EC2NetworkInterface -Filter @{ name= 'network-interface-id'; values= "eni-4c57b334" }).Groups


 


 

Get-EC2NetworkInterface 속성 값이 Filter밖에 없네요… 어찌되었든 위와 같은 결과 값을 확인해 보실 있습니다.

본격적으로 ENI 생성하여 봅시다. 위의 ENI들은 us-west-2a에 있으니 같은 AZ 만들어야 Instance 붙일 있겠죠?


PS> $Subnet = 'subnet-d98c8abc'

PS> New-EC2NetworkInterface -SubnetId $Subnet


 


 

Subnet 지정해주면 간단하게 생성 가능합니다. 확인 보면 아시겠지만, 정보들이 많이 부족한 ENI 제작되었습니다. 여기서부터는 정책을 생각해야 하는데요. Security Group 할당해야 하기 때문입니다. 현재는 Default 정책이 적용이 되어 있네요.

우리는 사용 방법을 배우는 중이니 그냥 Security Group 할당하여 봅시다~


PS> Edit-EC2NetworkInterfaceAttribute -NetworkInterfaceId eni-430af43b -Group sg-3dc0de59

PS> (Get-EC2NetworkInterface -NetworkInterfaceId eni-430af43b).Groups


 


 

Default 정책은 빠지고 새로 할당한 Security Group 보이는 것을 확인하실 있습니다. 그럼 개의 Security Group 할당하려면 어떻게 할까요? 다음을 보시죠


PS> Edit-EC2NetworkInterfaceAttribute -NetworkInterfaceId eni-430af43b -Group sg-dbc7c9bf

PS> (Get-EC2NetworkInterface -NetworkInterfaceId eni-430af43b).Groups

PS> Edit-EC2NetworkInterfaceAttribute -NetworkInterfaceId eni-430af43b -Group sg-dbc7c9bf, sg-3dc0de59

PS> (Get-EC2NetworkInterface -NetworkInterfaceId eni-430af43b).Groups


 

 


생각했던 것과는 다르게 동작하는군요. 저는 "기존 그룹에 추가하는 동작을 예상"했었습니다만, "그룹을 삭제하는 cmdlet 없는 "으로 보아서는 동작이 정상동작 이겠네요. 아무래도 ENI Security Group 바늘과 같은 관계인가 봅니다.

 

그럼 Instance ENI 붙여 봅시다.


PS> Add-EC2NetworkInterface -InstanceId i-7120c9b6 -NetworkInterfaceId eni-430af43b -DeviceIndex 1

PS> (Get-EC2Instance -Instance i-7120c9b6).Instances.NetworkInterfaces


 


 

정상적으로 Instance 할당이 되었습니다. ENI 연결하실 -DeviceIndex 넣어주셔야 하는데요. 해당 Index eth0 이미 Default 설정이 되어있기 때문에 1 이상의 정수 값을 삽입하시면 되겠습니다. 당연한 소리겠지만, OS에서 인식하지 못하는 범위로 Mount하시면 안됩니다.

 

붙여 봤으니 OS에서 확인해 봐야겠죠?

 

 

정상적으로 확인이 되었습니다. 연결을 하였으면 줄도 알아야 하는 . ENI 떼어내 봅시다.


PS> Dismount-EC2NetworkInterface -AttachmentId eni-attach-fc5f2ef6 -ForceDismount $true

PS> (Get-EC2Instance -Instance i-7120c9b6).Instances.NetworkInterfaces


 


 

? ENI 분리가 안되었네요??? 다시 한번 확인해 보겠습니다.


PS> (Get-EC2Instance -Instance i-7120c9b6).Instances.NetworkInterfaces


 


 

분리가 되었네요. 직접 해보시면 해당 사실을 경험하실 있는데요. ENI Dismount하는데에 시간이 걸립니다. 정확한 시간은 확인이 안되니 ENI Attachment 값이나, Status 값을 확인한 후에 ENI 작업을 하시 되겠습니다.

그럼 ENI 삭제해 봅시다.


PS> Remove-EC2NetworkInterface -NetworkInterfaceId eni-430af43b -Force


 


 

질의 문이 나오니 -Force 명령을 사용하여 강제 삭제하였습니다.

여기까지 ENI 내용을 간단히 알아보았습니다. 여러가지 내용들이 있습니다만, 이정도만 가지고도 기본 인프라 설정에는 크게 문제 없을 것이라 생각됩니다. 자세한 내용들은 나중에 살펴보면 되죠 ㅋㅋㅋ

 

참고자료 : http://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/concepts.html