이번엔 Instance에 NIC를 추가해 보도록 하겠습니다. 그 전에 NIC를 추가하면 어떤 것들에 이점이 있는지 살펴봅시다.
AWS에서 권장하는 방식으로는 위와 같이 4가지로 나옵니다. 개인적으로는 위 4가지 이외에 더 많은 부분들에서 이점을 얻을 수 있을 것 같습니다. 그 내용들은 다음과 같습니다.
- 관리 Network 대역을 나누어 사용할 수 있다.
이 내용은 아주 고리타분한 내용이지만, 실제로는 매우 유용하게 사용할 수 있습니다. ENI 기준으로 Security Group을 지정할 수 있기 때문에, 관리 대역과 통신하는 ENI에 보안정책을 다르게 주어주면 좀더 관리가 편해지기 때문입니다. - NAT, IGW 등 Public Subnet과 내부만 통신되는 Private Subnet을 동시에 사용하여 통신한다.
이렇게 만들면 보안에 취약할 수 있다고 생각되지만, 기존 ENI에 설정하는 것이 아니라 따로 ENI를 제작하여 사용하는 이유는, 서비스에 영향이 없이 외부통신을 막아버리고 싶을 때 ENI를 떼 버리면 손쉽게 처리되기 때문입니다. Security Group을 수정하는 것 보다 ENI를 떼버리는 것이 서비스에 영향을 적게 줄 수 있기 때문입니다. - Cloud Watch Metric을 나누어 볼 수 있다.
아직 설명은 하지 않았지만 AWS의 모니터링 서비스인 Cloud Watch에서 제공하는 Metric 값을 따로 확인할 수 있는 점이 유용하게 쓰일 것 같습니다. 예를 들어 Frontend와 Backend 사이에 있는 Instance의 경우 Frontend용 ENI, Backend용 ENI를 나누어두면 각각의 Metric을 나누어 볼 수 있으니 문제 해결이나 프로그램 고도화시 좋은 지표가 될 수 있을 것입니다. - 여러 개의 Web Service를 하나의 Instance에서 실행할 시 유용하다.
2번과 3번의 이점이 그대로 적용되는 상황이라고 생각합니다. Service를 중지할 때 ENI를 떼버리면 Service 통신이 안되어 중지상태가 되고, Service별 Cloud Watch Metric도 별개로 볼 수 있어 유용하게 쓰일 것 같습니다. - 고가용성 솔루션을 제작할 수 있다.
별로 추천하고 싶지는 않지만 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
'AWS > 파워쉘로 배우는 AWS' 카테고리의 다른 글
#20-1 [EBS] EBS 초기화를 해보자 (0) | 2016.02.12 |
---|---|
#20 [EBS] EBS를 추가해보자 (0) | 2016.01.26 |
#18 [EC2] 고정 IP(EIP)와 Public DNS (0) | 2016.01.12 |
#17 [EC2] Windows Instance를 만들어 보자. (0) | 2016.01.08 |
#16 [EC2] Linux Instance를 생성해 보자. (0) | 2016.01.08 |