(Acest articol a fost publicat pentru prima dată pe R | Discindoși cu amabilitate a contribuit la R-bloggeri). (Puteți raporta problema legată de conținutul acestei pagini aici)
Doriți să vă distribuiți conținutul pe R-bloggeri? dați clic aici dacă aveți un blog, sau aici dacă nu aveți.
Implementați un proiect cu mai multe scripturi R și {renv}
-mediu gestionat la AWS Lambda
Ambele caracteristici au necesitat ajustări minore ale bazei de cod. Copierea suplimentară acceptă scripturi și restaurarea {renv}
ambele ar trebui să se întâmple atunci când imaginea docker AWS Lambda este creată, astfel încât logica pentru a crea fișierul Docker trebuia actualizată. În consecință, cel r2lambda::build_lambda
funcția are acum două argumente suplimentare:
#' @param support_path path to the support files (if any). Either NULL #' (the default) if all needed code is in the same `runtime_path` script, or a #' character vector of paths to additional files needed by the runtime script. #' @param renvlock_path path to the renv.lock file (if any). Default is NULL. #' #' @details Use either `renvlock_path` or `dependencies` to install required #' packages, not both. By default, both are `NULL`, so the Docker image will #' have no additional packages installed.
Pentru a include orice scripturi de suport, furnizați căi de script cu vector de caractere către support_path
argument la construirea locală a imaginii docker Lambda cu
build_lamdba
.
(Rețineți că proiectul cu mai multe fișiere a fost acceptat și anterior, deși poate nu în mod explicit. O abordare care îmi place este de a crea un pachet „R” care exportă funcția de rulare necesară pentru Lambda. Apoi trebuie doar să faceți acea personalizare. R
ambalați o dependență a proiectului și fie instalați în imaginea docker AWS Lambda dependencies
sau
renvlock_path
.)
Cod demo
Presupunând că avem un folder cu următoarea structură:
~/Desktop$ ls -1 iris-lambda/ renv/ renv.lock runtime.r support.r test-code.r
Unde, support.r
defineşte o funcţie care runtime.r
utilizări pentru Lambda:
get_iris_summary_by_species <- function(species) { iris |> dplyr::filter(Species == species) |> dplyr::summarise( mean = mean(Sepal.Length), sd = sd(Sepal.Length) ) }
Apoi runtime.r
generează scriptul de asistență și apelează funcția definită acolo:
source("support.r") iris_summary <- function(species) { get_iris_summary_by_species(species) } lambdr::start_lambda()
Apoi ar trebui să funcționeze următoarele, trecând scriptul de asistență și renv.lock la r2lambda::build_lambda:
dir("~/Desktop/iris-lambda") runtime_function <- "iris_summary" runtime_path <- "~/Desktop/iris-lambda/runtime.r" support_path <- "~/Desktop/iris-lambda/support.r" renvlock_path <- "~/Desktop/iris-lambda/renv.lock" dependencies <- NULL # Might take a while, its building a docker image build_lambda( tag = "my_iris_lambda", runtime_function = runtime_function, runtime_path = runtime_path, support_path = support_path, renvlock_path = renvlock_path, dependencies = dependencies ) # test payload <- list(species = "setosa") tag <- "my_iris_lambda" test_lambda(tag = tag, payload) # deploy # Might take a while, its pushing it to a remote repository deploy_lambda( tag = "my_iris_lambda", Timeout = 30 ) invoke_lambda( function_name = "my_iris_lambda", invocation_type = "RequestResponse", payload = list(species = "versicolor"), include_logs = FALSE ) invoke_lambda( function_name = "my_iris_lambda", invocation_type = "RequestResponse", payload = list(species = "setosa"), include_logs = FALSE )