작년 AWS re:Invent 2019 에서 소개되었던 EC2 환경에서 사용할 수 있는 격리된 컴퓨팅 서비스인 AWS Nitro Enclaves(이하 “Enclaves”) 라는 서비스가 올해 10월 28일 GA(General Availability) 되었습니다.
이 포스팅에서는 새롭게 소개된 Enclave 라는 서비스에 대해 간략하게 살펴보고 실제로 어떻게 사용이 되는지 실행해보도록 하겠습니다.
참고. Enclaves 는 아직 전체 Region 에서 지원하지는 않습니다. 지원하고 있는 Region 을 위 링크를 통해 확인하시기 바라며 아쉽지만 최초 GA 대상 리전에 서울리전은 포함되지 않았습니다.
사전 요구 사항
Enclaves 는 AWS EC2 중 Nitro 기반의 EC2 인스턴스를 사용하는 Linux 환경에서 사용할 수 있는 보안적으로 격리된 가상머신을 의미합니다. 2020년 10월 현재 사용 가능한 EC2 인스턴스의 조건은 다음과 같습니다.
- 4vCPU 이상
- t3, t3a, t4g, a1, c6g, c6gd, m6g, m6gd, r6g, and r6gd 을 제외한 Nitro 기반 EC2
- Linux OS
Enclaves 란 무엇인가?
Enclave 를 설명하게이 앞서 AWS Cloud 환경에서 EC2 인스턴스의 격리 환경을 잠깐 살펴보도록 하겠습니다. AWS 에서는 On-premise 의 가상화환경과 마찬가지로 물리적인 서버에 Hypervisor 를 설치하여 가상화된 컴퓨팅 자원(EC2 인스턴스)을 생성하여 사용자에게 할당합니다. 그리고 이 가상화된 컴퓨팅 자원은 아래의 그림과 같이 논리적으로 격리되어 있으며 각각의 인스턴스에 할당된 고유의 CPU, 메모리 자원을 사용하게 됩니다.
Enclave 는 Enclave 자체만 본다면 Enclave 도 가상 머신이기 때문에 기본적으로 다른 인스턴스와 논리적으로 격리되어 있습니다. 다만, Enclave 는 Parent EC2(부모 EC2) 인스턴스에 의해 생성되는 가상 머신으로 Parent EC2 와도 격리는 되어 있지만 Parent EC2 와는 Virtual Socket 을 통해 통신이 가능한 경로를 가지고 있습니다.
즉, Enclave 는 특정 EC2 인스턴스와만 통신이 가능한 별도의 격리된 또 하나의 가상 머신을 이야기하는데요. Enclave 는 이와 같은 격리된 공간안에 사용자가 원하는 어플리케이션을 구동하거나 AWS Certificate Manager 에서 발급한 인증서의 Private Key를 Parent EC2 에서 사용할 수 있도록 저장하는 등의 용도로 사용하실 수 있습니다.
Enclave 의 간단한 사용 순서는 다음과 같습니다.
- EC2 인스턴스 선택(사전 요구 사항 참고) 후 Enclave 활성화
- Nitro CLI 설치
- Enclave 내에서 구동할 Image 준비
- Enclave 실행
- Enclave 동작 확인
- Enclave 제거(필요 시)
- Enclave 활성화
: Enclave 는 Enclave 를 지원하는 Nitro 타입 EC2 인스턴스가 실행될 때 아래와 같은 “enclave-options” 라는 옵션을 통해 활성화할 수 있습니다.
aws ec2 run-instances --image-id support_ami_id --count 1 --instance-type supported_instance_type --key-name your_key_pair --enclave-options 'Enabled=true'
AWS CLI 를 이용하여 새로운 EC2 인스턴스를 실행합니다.
참고. Enclave 를 활성화하기 위해서는 AWS CLI Verison 2 를 사용하여야 합니다.
2. Nitro CLI 설치
: Enclave 가 활성화된 상태로 구동된 EC2 인스턴스에 접속하여 아래와 같은 명령어를 사용하여 Nitro CLI 를 설치합니다.
#sudo amazon-linux-extras install aws-nitro-enclaves-cli
샘플 어플리케이션 설치를 위하여 아래와 같이 Nitro Enclave 개발자 도구도 설치합니다.
#sudo yum install aws-nitro-enclaves-cli-devel -y
사용자를 “ne” 사용자 그룹에 추가한 후 사용자를 “docker” 사용자 그룹에 추가합니다.
#sudo usermod -aG ne username
#sudo usermod -aG docker username
Enclave 는 Parent EC2 인스턴스의 가상 자원을 할당받아 생성되는 가상 머신입니다. 따라서, Enclave 를 Parent EC2 인스턴스에서 생성할 때에는 얼마나 많은 수의 vCPU 나 Memory 를 Enclave 에 할당할 것인지 정해주어야 하는데요. 이 값은 아래의 yaml 파일을 이용하여 설정할 수 있습니다.
/etc/nitro_enclaves/allocator.yaml
저는 별도의 설정 변경 없이 기본값을 그대로 사용하여 Enclave 를 생성하도록 하겠습니다.
#sudo systemctl start nitro-enclaves-allocator.service && sudo systemctl enable nitro-enclaves-allocator.service
#sudo systemctl start docker && sudo systemctl enable docker
3. Enclave 내에서 구동할 Image 준비
: Enclave 는 Container 이미지를 통해 Parent EC2 인스턴스로부터 Enclave 내에 구동될 어플리케이션을 적용받게 됩니다. 따라서, Parent EC2 인스턴스에서 Docker Image 를 생성해주어야 하는데요. 이 포스팅에서는 위 과정에서 Enclave 개발자 도구가 설치되면서 함께 설치되 “Hello” 샘플 어플리케이션을 이용하여 Container Image 를 빌드하도록 하겠습니다.
#docker build /usr/share/nitro_enclaves/examples/hello -t hello
Docker Image 가 빌드되었다면 아래와 같은 명령어를 이용하여 Enclave 에서 사용 가능한 Image Format 으로 변환합니다.
#nitro-cli build-enclave --docker-uri hello:latest --output-file hello.eif
4. Enclave 실행
: EIF 포맷의 Enclave Image 가 생성이 되었으니 이제는 실제로 아래 명령어를 이용하여 Enclave 를 생성해보도록 하겠습니다.
#nitro-cli run-enclave --cpu-count 2 --memory 512 --eif-path hello.eif --debug-mode
5. Enclave 동작 확인
: Enclave 가 정상적으로 생성되었다면 아래와 같은 명령어를 통해서 Enclave 내에 설치한 어플리케이션이 정상동작하는지 확인하실 수 있습니다.
#nitro-cli console --enclave-id i-05f6ed443aEXAMPLE-enc173dfe3eEXAMPLE
6. Enclave 삭제
: Enclave 의 삭제는 아래의 명령어를 통해 수행하실 수 있습니다.
#nitro-cli terminate-enclave --enclave-id i-05f6ed443aEXAMPLE-enc173dfe3eEXAMPLE
감사합니다.