(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.rgenerează 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
)
