Cloudformation으로 생성한 EC2가 반복해서 자동으로 중지될 때

2023.05.31

안녕하세요 클래스메소드의 서은우입니다.

일어날 수 있는 일

EC2 인스턴스를 생성하는 클라우드포메이션 코드를 작성하고 실행하였습니다. 실행한 클라우드포메이션 코드가 제대로 작동하고 리소스 생성이 완료되었습니다.

인스턴스를 사용하기 위해 EC2 콘솔화면에 접속해보니, 어쩐 일인지 인스턴스는 중지 상태가 되어있었습니다. 인스턴스를 다시 실행해 보았지만 곧바로 다시 중지 상태가 되어 버립니다.

이렇게 인스턴스를 실행해도 자동으로 중지 되어 버리는 이유는 무엇일까요?

원인은 루트 볼륨

원인은 인스턴스가 루트 볼륨을 제대로 인식하지 못하기 때문입니다.

AMI에 따라 /dev/sda1 또는 /dev/xvda 가 루트 볼륨용으로 이미 예약 되어있습니다.

하나의 인스턴스에 이미 예약된 루트 볼륨 이름을 사용하여 EBS 볼륨을 매핑할 경우, 인스턴스가 루트 볼륨을 올바르게 인식하지 못하게되어 실행되지 못하고 중지되는 것입니다.

특히, 클라우드포메이션을 이용하여 EC2 인스턴스를 생성할 때, EBS 볼륨의 디바이스 이름을 주의하여 코드를 작성해야합니다.

예를들어, Amazon Linux 2023의 인스턴스를 아래와 같이 작성하여 생성할 경우, 인스턴스가 실행되지 않는 문제를 겪을 수 있습니다.

  EC2InstanceA:
    Type: AWS::EC2::Instance
    Properties: 
      ImageId: ami-amazon-linux2023
      KeyName: key-pair
      InstanceType: type    
      AvailabilityZone: az
      SubnetId: subnet-id
      SecurityGroupIds: security-group
      BlockDeviceMappings:
        - DeviceName: "/dev/sda1"
          Ebs: 
            VolumeType: "gp3"
            VolumeSize: RootVolumeSize

위의 코드의 BlockDeviceMappings 부분에서는 DeviceName 이 /dev/sda1 인 볼륨을 정의하고 있습니다.

루트 볼륨을 제대로 정의했다고 생각할 수 있지만, Amazon Linux 2023의 루트 볼륨 이름은 /dev/xvda 이기 때문에 위의 코드는 루트 볼륨이 아닌 추가 볼륨에 대한 정의를 하고 있다고 해석 되게 됩니다.

BlockDeviceMappings 에 루트 볼륨 지정이 없는 Cloudformation 코드를 실행할 경우 자동으로 Amazon Linux 2023의 루트 볼륨 /dev/xvda 이 생성되게 됩니다.

결국, 생성된 인스턴스에는 /dev/xvda/dev/sda1 2개의 볼륨이 장착되어 인스턴스는 루트 볼륨을 제대로 인식하지 못해 실행되지 못하고 계속해서 중지 되게 됩니다.

볼륨 이름을 주의합시다

따라서 EC2 인스턴스 클라우드포메이션 코드를 작성할 때, 볼륨 이름을 주의하여 작성할 필요가 있습니다.

혹은 콘솔을 이용하는 것도 좋은 방법이 될 수 있습니다.

EC2 콘솔 화면에서 인스턴스를 생성할 경우, 자동적으로 루트 볼륨의 디바이스 이름이 생성되며, 추가 볼륨에 대해서도 선택 가능한 디바이스 이름만 표시되기 때문에 디바이스 이름을 잘못 지정할 걱정을 할 필요가 없기 때문입니다.