Skip to main content

ActiveSupport::CurrentAttributes — Rails가 request-scoped state를 다루는 방법

· 3 min read

rails generate authentication을 실행하면 app/models/current.rb가 생성된다. 3줄짜리 파일이다. 이 3줄이 어떤 문제를 풀고 있고, 내부에서 어떻게 동작하는지를 다룬다. CurrentAttributes는 DHH의 PR #29180으로 Rails에 도입되었다.

문제: request context의 전파

현재 사용자 정보는 애플리케이션 전체에서 필요하지만, request가 끝나면 사라져야 한다. 이 정보를 필요한 곳마다 메서드 인자로 넘기는 것은 가능하지만 번거롭다.

# 인자 전달 방식 - 동작하지만 모든 레이어에 user를 넘겨줘야 한다
def create(message_params, user)
message = Message.new(message_params)
message.creator = user
Event.create(record: message, user: user)
end

ActiveSupport::CurrentAttributes가 이 문제를 해결한다. request 동안만 유효한 저장소를 제공하고, request가 끝나면 자동으로 비운다.

Kamal + SSM으로 GitHub Actions에서 EC2에 배포하기

· 4 min read

이전 글에서 EC2를 public subnet에 두더라도 올바르게 구성하면 안전하다고 했다. 그 구성에서는 보안 그룹 인바운드에 CloudFront prefix list의 443만 허용하고, 관리 접속은 SSM Session Manager로 처리한다. SSH 포트는 열려 있지 않다.

하지만 Kamal은 SSH로 EC2에 접속해서 Docker 명령어를 실행한다. SSH 포트 없이 Kamal 배포를 어떻게 할 수 있을까. 이 글은 OIDC, SSM, 일회성 SSH 키를 조합해서 이 문제를 해결하는 방법을 다룬다.

EC2를 public subnet에 두면 안 될까

· 5 min read

Private subnet은 EC2 배포의 필수 조건이 아니다. 올바르게 구성한 public subnet EC2는 VPS 호스팅과 구조적으로 다르지 않다. 왜 괜찮은지, 그리고 Kamal + AWS SSM으로 실제로 어떻게 구성했는지를 다룬다.

AWS Well-Architected Framework의 모범 사례

AWS의 모범 사례를 따르면 EC2는 private subnet에 배치하고 load balancer만 외부에 노출해야 한다. 합리적인 원칙이지만, 따르려면 구성이 복잡해진다. Private subnet의 EC2가 외부 API를 호출하거나 패키지를 설치하려면 NAT Gateway가 필요하다. 이 비용을 받아들이기 전에, 실제로 무엇이 다른지 따져보자.