ããã¡ããã
Rã®ã¹ã¯ãªãããAPIã«ãããã¨ãã£ã¦ããã¾ãããï¼ ããããããDockerã§ã
ã¨ããããã§ä»åã¯Fargateä¸ã§Rã®ã¹ã¯ãªãããAPIã«ãã¦ã¿ã¾ããã

æºå
ããããæºåãã¾ããä»åã¯Amazon Linux2ã§å®æ½ãã¾ããã
ãã¨ã«ãªãã¤ã¡ã¼ã¸
r-baseã¨ããå ¬å¼ã®ã¤ã¡ã¼ã¸ãããã¾ããä»åã¯ããããã¨ã«ã¤ã¡ã¼ã¸ã使ãã¾ãã
ã¤ã¡ã¼ã¸ã®ãã«
docker pull r-base
Rã®ã¹ã¯ãªãã
Rã«ã¯plunberã¨ããããã±ã¼ã¸ãããããããå©ç¨ããã¨Rã®ã¹ã¯ãªãããREST APIã¨ãã¦ä½¿ããããã«ãªãã¾ãã詳ããä½¿ãæ¹ã¯ãªã³ã¯å ã§ç¢ºèªãã¦ãã ããã
plumberãèµ·åããã¹ã¯ãªãããæ¸ãã¾ãã
plumber.R
library(plumber)
api <- plumber::plumb("sample.R")
api$run(host = "0.0.0.0", port=8000)
ä¸è¨ã®ã¹ã¯ãªããå
ã§å¼ã³åºãã¦ããsample.Rã¯ä»¥ä¸ã®ããã«ãã¾ãããä»åã¯ãµã³ãã«ãªã®ã§ãã¹ã¦GETã®ç°¡åãªãã®ã§ãã
sample.R
#* @get /hello
hw <- function() {
return("Hello, world!")
}
#* @get /hello//
hw <- function(name, age) {
return(paste("Hello", name, "You're", age, "years old", seq=" "))
}
#* @get /fn
hw <- function(x) {
x <- as.numeric(x)
y <- 2 * x + 1
return(y)
}
#irisãèªã¿è¾¼ã¿
df <- iris
#* @get /plot
#* @png
hw <- function() {
p <- plot(df$Sepal.Length, df$Sepal.Width,
main="Sample plot", xlab="Sepal.Length", ylab="Sepal.Width")
print(p)
}
Dockerflileãæ¸ã
Dockerflileã¯ãããªæã
Dockerfile
FROM r-base
COPY sample.R /usr/local/src/
COPY plumber.R /usr/local/src/
WORKDIR /usr/local/src/
RUN R -e 'install.packages("plumber")'
EXPOSE 8000
ENTRYPOINT ["Rscript", "plumber.R"]
ECR
ECRã«ãªãã¸ããªã使ãã¦ããã¾ããECRã®ç»é¢ãéããããªãã¸ããªã®ä½æããã¯ãªãã¯ã
ããæãã®ãªãã¸ããªåãå
¥åãã¦ãããªãã¸ããªã®ä½æããã¯ãªãã¯ãä»åã¯ãªãã¸ããªåãr-apiã¨ãã¾ããã

æ§ç¯
ãã¦ã¤ã¡ã¼ã¸ããã«ããã¦ãFargateãæ§ç¯ãã¦ããã¾ãã
ã¤ã¡ã¼ã¸ã®ãã«ãã»ããã·ã¥
使ãããªãã¸ããªã®è©³ç´°ç»é¢ããããã·ã¥ã³ãã³ãã確èªã§ãã¾ãã

表示ãããããã·ã¥ã³ãã³ãã¯ãããªæããä¸è¨ãå®è¡ãã¦ãã«ãã»ããã·ã¥ãã¾ããplumberã®ã¤ã³ã¹ãã¼ã«ã«ã¡ãã£ã¨æéããããã¾ãã
#èªè¨¼ãAmazon Linux2ãªã®ã§AWS CLIãããªã¤ã³ã¹ãã¼ã«ããã¦ã¾ãã
#ããã¦ãªãå ´åã¯å
ã«ã¤ã³ã¹ãã¼ã«ããå¿
è¦ãããã¾ã
$(aws ecr get-login --no-include-email --region ap-northeast-1)
#ã¤ã¡ã¼ã¸ã®ãã«ã
docker build -t ãªãã¸ããªå .
#ã¿ã°ã¤ã
docker tag ãªãã¸ããªå:latest 119463424712.dkr.ecr.ap-northeast-1.amazonaws.com/ãªãã¸ããªå:latest
#ããã·ã¥
docker push 119463424712.dkr.ecr.ap-northeast-1.amazonaws.com/ãªãã¸ããªå:latest
ããã·ã¥ããã¾ãã

Fargateèµ·å
ãã¦æå¾ã«ããã·ã¥ããã¤ã¡ã¼ã¸ããã³ã³ãããFargateã§èµ·åãã¾ãã
ã¿ã¹ã¯å®ç¾©
ã¾ãã¯ã³ã³ãããèµ·åããããã®ã¿ã¹ã¯å®ç¾©ããã¾ãã
ECSã®ã¿ã¹ã¯å®ç¾©ã®ç»é¢ãããæ°ããã¿ã¹ã¯å®ç¾©ã®ä½æããã¯ãªãã¯ã
èµ·åã¿ã¤ãã¯Fargateã鏿ããæ¬¡ã®ã¹ãããããã¯ãªãã¯ã
ããæãã®ã¿ã¹ã¯å®ç¾©åãå
¥åã
CPUã¨ã¡ã¢ãªã¯æå°ã«ãã¾ããã
ãã³ã³ããã追å ããã¯ãªãã¯ã
ããæãã®ã³ã³ããåãå
¥åãã¤ã¡ã¼ã¸ã«ã¯ããã·ã¥ããã¤ã¡ã¼ã¸ã®URIããå
¥åã
ãã¼ããããã³ã°ã¯Dockerfileå
ã§æå®ããã®ã¨åã8000ã¨ãã¾ãããã®ä»ã¯ããã©ã«ãã§ã追å ãã
ã¿ã¹ã¯å®ç¾©ã®è¨å®ãä¸è¨ä»¥å¤ã¯ããã©ã«ãã¨ãã¦ã使ããã¯ãªãã¯ã
ã¯ã©ã¹ã¿ã¼ä½æ
ECSã®ã¯ã©ã¹ã¿ã¼ç»é¢ãããã¯ã©ã¹ã¿ã¼ã®ä½æããã¯ãªãã¯ã
ããããã¯ã¼ãã³ã°ã®ã¿ãã鏿ãã¦ã次ã¸ã
ããæãã®ã¯ã©ã¹ã¿ã¼åãå
¥åãVPCãæ°è¦ä½æããå ´åã¯ããã®é
ç®ã«ãã§ãã¯ãå
¥ãã¾ããã使ããã¯ãªãã¯ã

ã¿ã¹ã¯å®è¡
ä»åã¯è² è·åæ£ãAutoScaleãèããªãã®ã§ãµã¼ãã¹ããã¯ã¿ã¹ã¯ãå®è¡ããã«ãæåã§ã¿ã¹ã¯ã1ã¤å®è¡ããã ãã«ãã¾ãã
使ããã¯ã©ã¹ã¿ã¼ã®è©³ç´°ã®ãã¿ã¹ã¯ãã¿ãã®ãæ°ããã¿ã¹ã¯ã®å®è¡ããã¯ãªãã¯ã
èµ·åã¿ã¤ãã¯Fargateã鏿ãã¿ã¹ã¯å®ç¾©ã¯å
ã»ã©ä½æãããã®ã鏿ã
VPCã¨ã»ãã¥ãªãã£ã°ã«ã¼ãã¯ããæãã«æ¢åã®ãã®ã使ç¨ãããæ°è¦ã§ä½æãã¦ãã ãããECRããã¤ã¡ã¼ã¸ãã¨ãå¿
è¦ãããã®ã§ã¤ã³ã¿ã¼ãããã¸ã¢ã¯ã»ã¹ã§ããå¿
è¦ãããã¾ãããã®ãããããªãã¯IPããENABLEDãã
ãã¿ã¹ã¯ã®å®è¡ããã¯ãªãã¯ããã¿ã¹ã¯ä¸è¦§ããã¹ãã¼ã¿ã¹ããRUNNINGãã¨ãªãã°OKã§ãã

確èª
curlãå©ãã¦ç¢ºèªããã®ãããã§ãããå³ã®è¡¨ç¤ºãããã®ã§ãã©ã¦ã¶ãã確èªãã¦ã¿ã¾ãã ã¿ã¹ã¯ã®è©³ç´°ãããããªãã¯IPã確èªã§ããã®ã§ããã®IPã«æ¥ç¶ãã¾ãã
Hello, world
ååã¨å¹´é½¢
è¨ç®
å³
ããæãã§ãã
ã¾ã¨ã
ãããã§ããã§ãããããplumber + Dockerã¯Amazon Sagemakerã§Rã使ç¨ããå ´åã«ãå¿ è¦ã¨ãªãã®ã§ãããã試ãã¦ã¿ããã¨æãã¾ãã