‘Permission Denied’에서 프로덕션까지: My AWS & Terraform Journey

발행: (2025년 12월 30일 오후 11:58 GMT+9)
5 min read
원문: Dev.to

Source: Dev.to

“Permission Denied”에서 프로덕션까지: 나의 AWS 및 Terraform 여정 표지 이미지

Zakariyau Mukhtar

DigitalOcean에서 AWS로 전환

나는 Java 앱을 배포하기 위해 DigitalOcean을 사용하는 강의를 따라하고 있었다. 나는 나이지리아에 거주하고 있기 때문에 DigitalOcean이 내 카드를 계속 거부했고, 결국 난관에 부딪혔다.

포기하지 않고 #30ofAWSTerraform 챌린지를 떠올렸다. AWS는 더 복잡하지만 업계 선두주자다. 나는 DigitalOcean “Firewall”을 AWS Security Group으로 변환하고 실전 경험을 쌓기로 결정했다.

1. Terraform으로 인프라 프로비저닝

제 목표는 인프라스트럭처를 코드(IaC)로 관리하여 EC2 인스턴스를 생성하는 것이었습니다. aws_instanceaws_key_pair 리소스를 사용했습니다.

과제: SSH 키 관리

공개 키를 문자열 변수로 직접 전달하면 포맷 오류가 발생했습니다.

해결책

Terraform의 file() 함수를 사용해 공개 키를 디스크에서 직접 읽어 Windows 머신의 정확한 바이트가 AWS에 전달되도록 합니다.

resource "aws_key_pair" "my_ssh_key" {
  key_name   = "zacks-key"
  public_key = file("C:/Users/Public/id_aws.pub")
}

Terraform 코드 샘플

Main.tf – Terraform code block

Main.tf – Additional code block

2. AMI ID와 사용자 이름 전쟁

인스턴스가 “running” 상태가 된 뒤에도 SSH 접속이 안 됐습니다. 계속해서 InvalidAMIID.NotFound 또는 Permission denied (publickey) 오류가 나타났습니다.

교훈

IssueWhat I Learned
Region SpecificityAMI ID는 지역별로 다릅니다. 런던용 Ubuntu AMI는 북버지니아(us-east-1)에서는 작동하지 않습니다.
Architecture Matterst2.microx86_64 이미지가 필요합니다. ARM 기반 AMI를 사용하면 “Not Found” 오류가 발생합니다.
Default User각 OS마다 기본 SSH 사용자가 다릅니다: Amazon Linux는 ec2-user, Ubuntu는 ubuntu 등.

3. Deploying the Application (The JAR File)

서버에 SSH로 접속할 수 있게 된 후, build/libs에 있는 Java 아티팩트를 EC2 인스턴스로 복사해야 했습니다.

The Tool: SCP (Secure Copy)

scp -i C:\Users\Public\id_aws "C:\Users\...\java-app-1.0-SNAPSHOT.jar" ubuntu@:/home/ubuntu/

Build Successful

Translating Firewall to Security Group

강사가 DigitalOcean에 방화벽 규칙을 추가했을 때, 나는 AWS에서는 Security Group을 Terraform에서 업데이트하여 Port 8080을 열어 Spring Boot 애플리케이션에 트래픽이 도달하도록 동일하게 적용했습니다.

4. Linux 사용자 관리 및 보안

보안을 강화하기 위해 개인 사용자 zacks를 만들었습니다.

수행한 단계

  1. 사용자 생성

    sudo adduser zacks
  2. sudo 권한 부여

    sudo usermod -aG sudo zacks
  3. SSH authorized keys 수정
    키 파일 이름을 Authentication_keys로 잘못 지정했습니다. Linux에서는 authorized_keys를 기대합니다. 또한 소유권과 권한을 수정했습니다:

    sudo mv /home/zacks/.ssh/Authentication_keys /home/zacks/.ssh/authorized_keys
    sudo chown -R zacks:zacks /home/zacks/.ssh
    sudo chmod 600 /home/zacks/.ssh/authorized_keys

결론

오늘은 트러블슈팅 마스터클래스였습니다. DevOps는 단순히 코드를 작성하는 것이 아니라 적응력을 갖추는 것이라는 것을 배웠습니다. 한 클라우드 문이 닫히면, 저는 Terraform을 사용해 AWS에서 더 나은 문을 열었습니다.

서버에서 시작된 Java 애플리케이션 (image placeholder – replace with the actual URL)

인프라 다이어그램

인프라가 라이브되고, JAR가 실행 중이며, “Whitelabel Error Page”가 이렇게 아름다울 수는 없었습니다!

애플리케이션 페이지

Back to Blog

관련 글

더 보기 »