Plumber API를 운영 환경에 배포하기
Docker와 클라우드 플랫폼을 사용해 Plumber API를 컨테이너화하고 배포합니다.
Plumber API를 운영 환경에 배포하기은(는) CoddyKit의 무료 R Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 R Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
운영 환경 배포 옵션
Plumber API는 여러 방식으로 배포할 수 있습니다.
- Docker 컨테이너 — 이식성과 재현성이 높고 어디서나 작동합니다.
- Posit Connect — 일정 예약을 지원하는 원클릭 배포
- Digital Ocean / EC2 — R을 실행하는 일반 Linux VM
Docker는 이식성이 가장 높으며 운영 환경의 R API에 사용되는 업계 표준입니다.
Plumber API 진입점
Plumber 서버를 시작하는 최상위 api.R을 만드세요. Sys.getenv('PORT', unset='8000')을 사용하면 코드를 변경하지 않고도 컨테이너 오케스트레이터가 포트를 설정할 수 있습니다.
# api.R
# library(plumber)
#
# pr <- plumb('routes.R')
# port <- as.integer(Sys.getenv('PORT', unset = '8000'))
# pr$run(host = '0.0.0.0', port = port)
#
# Listening on 0.0.0.0 is required inside Docker
# (127.0.0.1 is only reachable inside the container)기본 Docker 이미지 — rocker/r-ver
rocker/r-ver 이미지는 최소한의 버전 고정 R 환경을 제공합니다. 재현 가능한 빌드를 보장하려면 항상 특정 R 버전(예: rocker/r-ver:4.3.2)을 고정하세요. 운영 환경에서는 :latest를 사용하지 마세요.
# Dockerfile
# FROM rocker/r-ver:4.3.2
#
# Alternatively use rocker/plumber which pre-installs plumber:
# FROM rstudio/plumber:latest
#
# rocker/r-ver is more minimal and gives you full control
# over which packages are installed.Dockerfile에 R 패키지 설치하기
RUN Rscript -e "install.packages(...)"를 사용하여 이미지 빌드 중에 패키지를 설치하세요. 먼저 apt-get으로 시스템 종속 항목(예: httr2에 필요한 libssl-dev)을 설치하세요.
# FROM rocker/r-ver:4.3.2
#
# RUN apt-get update && apt-get install -y \
# libssl-dev \
# libcurl4-openssl-dev \
# && rm -rf /var/lib/apt/lists/*
#
# RUN Rscript -e "install.packages(c('plumber', 'jsonlite', 'httr2'), repos='https://cloud.r-project.org')"파일 복사 및 포트 설정
COPY를 사용하여 R 소스 파일을 컨테이너에 복사하세요. Docker가 컨테이너가 수신 대기하는 포트를 알 수 있도록 EXPOSE로 포트를 선언하세요. 이는 문서화일 뿐이며 포트를 공개하지는 않습니다.
# FROM rocker/r-ver:4.3.2
# ...
# WORKDIR /app
# COPY routes.R .
# COPY api.R .
#
# EXPOSE 8000
#
# CMD ["Rscript", "api.R"]Docker 이미지 빌드 및 실행
docker build로 이미지를 빌드한 다음 호스트 포트를 컨테이너 포트에 매핑하여 컨테이너를 실행하세요. -e 플래그는 비밀 정보에 사용할 환경 변수를 주입합니다.
# Build the image:
# docker build -t my-r-api:1.0 .
#
# Run a container:
# docker run -d \
# -p 8000:8000 \
# -e API_SECRET_KEY='my_secret' \
# -e DATABASE_URL='postgres://...' \
# --name r-api \
# my-r-api:1.0
#
# Test:
# curl http://localhost:8000/pingSys.getenv()로 비밀 정보 읽기
운영 환경에서는 Dockerfile이나 소스 코드에 비밀 정보를 넣지 마세요. 런타임에 Sys.getenv()로 읽으세요. Docker -e 플래그, Kubernetes 비밀 정보 또는 AWS Secrets Manager와 같은 환경 변수 관리 시스템을 통해 전달하세요.
# In routes.R:
# db_url <- Sys.getenv('DATABASE_URL', unset = '')
# api_key <- Sys.getenv('API_SECRET_KEY', unset = '')
#
# if (nchar(db_url) == 0) stop('DATABASE_URL is required')
# if (nchar(api_key) == 0) stop('API_SECRET_KEY is required')
#
# Fail fast at startup rather than failing silently at request time
cat('Validate all required env vars at startup with stop()
')상태 확인 엔드포인트
/ping 또는 /health 엔드포인트를 사용하면 로드 밸런서와 오케스트레이터(Kubernetes, ECS)가 API가 실행 중인지 확인할 수 있습니다. 이 엔드포인트는 인증 없이 빠르게 200을 반환해야 하며, 선택적으로 DB 연결도 확인할 수 있습니다.
# #* Health check
# #* @preempt auth
# #* @get /ping
# function() {
# list(
# status = 'ok',
# version = '1.0.0',
# time = format(Sys.time(), '%Y-%m-%dT%H:%M:%SZ')
# )
# }
#
# Docker HEALTHCHECK:
# HEALTHCHECK CMD curl -f http://localhost:8000/ping || exit 1완전한 Dockerfile 예제
다음은 지금까지의 내용을 모두 적용한 운영 환경용 Plumber API Dockerfile입니다.
# FROM rocker/r-ver:4.3.2
# RUN apt-get update && apt-get install -y libssl-dev libcurl4-openssl-dev \
# && rm -rf /var/lib/apt/lists/*
# RUN Rscript -e "install.packages(c('plumber','jsonlite'), repos='https://cloud.r-project.org')"
# WORKDIR /app
# COPY routes.R api.R ./
# EXPOSE 8000
# HEALTHCHECK CMD curl -f http://localhost:8000/ping || exit 1
# CMD ["Rscript", "api.R"]운영 환경의 로깅
구조화된 로깅은 운영 환경의 문제를 진단하는 데 도움이 됩니다. cat() 또는 logger 패키지를 사용하여 타임스탬프가 포함된 로그를 표준 출력에 기록하세요. Docker와 대부분의 플랫폼은 표준 출력을 자동으로 수집하여 로그 집계기로 전달합니다.
# Log format: ISO timestamp + level + message
log_info <- function(msg) {
cat(format(Sys.time(), '%Y-%m-%dT%H:%M:%S'), '[INFO]', msg, '
')
}
log_info('API starting up')
log_info(paste('Port:', Sys.getenv('PORT', '8000')))Nginx를 사용한 역방향 프록시
운영 환경에서는 Plumber 앞에 Nginx 역방향 프록시를 배치하여 TLS 종료, 요청 빈도 제한, 요청 버퍼링을 처리하세요. Nginx는 localhost의 Plumber로 요청을 전달하고, 외부에서는 443 포트의 Nginx에 연결합니다.
# Nginx config snippet (nginx.conf):
# server {
# listen 443 ssl;
# ssl_certificate /etc/letsencrypt/.../fullchain.pem;
# ssl_certificate_key /etc/letsencrypt/.../privkey.pem;
#
# location /api/ {
# proxy_pass http://127.0.0.1:8000/;
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
# }
# }빠른 확인: Docker EXPOSE
Dockerfile의 EXPOSE 8000 지시문은 실제로 어떤 동작을 수행합니까?
Plumber API 배포 복습
운영 환경에 Plumber를 배포하는 핵심 단계:
0.0.0.0에서 수신 대기하고 환경에서PORT를 읽습니다.- 기본 이미지로 버전을 고정한
rocker/r-ver:X.Y.Z를 사용합니다. - Dockerfile에서 패키지를 설치하고 소스 파일만 복사합니다.
-e환경 변수로 비밀 정보를 주입하며 소스 코드나 Dockerfile에는 넣지 않습니다./ping상태 확인 엔드포인트를 추가합니다(#* @preempt auth포함).- TLS와 요청 빈도 제한을 위해 Nginx를 역방향 프록시로 사용합니다.
AI 튜터와 함께 R을(를) 배우세요 — 무료
브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.
- 코스
- 43
- 레슨
- 159
자주 묻는 질문
“Plumber API를 운영 환경에 배포하기” 강의는 무료인가요?
네 — “Plumber API를 운영 환경에 배포하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 R Academy 강의 전체를 잠금 해제할 수 있습니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“Plumber API를 운영 환경에 배포하기”에서 뭘 배우나요?
Docker와 클라우드 플랫폼을 사용해 Plumber API를 컨테이너화하고 배포합니다. 브라우저에서 직접 실행하는 실습 코드로 R Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
R Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 R Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“Plumber API를 운영 환경에 배포하기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 R Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 R Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- Plumber와 REST 입문
- GET 및 POST 엔드포인트 만들기
- 인증과 API 보안
- Plumber API를 운영 환경에 배포하기