schedule.R
- you can use auth from environment files specified in app.yaml
.plumber
- example:library(googleAuthR) ## authentication
library(googleCloudStorageR) ## google cloud storage
library(readr) ##
## gcs auto authenticated via environment file
## pointed to via sys.env GCS_AUTH_FILE
#* @get /demoR
demoScheduleAPI <- function(){
## download or do something
something <- tryCatch({
gcs_get_object("schedule/test.csv",
bucket = "mark-edmondson-public-files")
}, error = function(ex) {
NULL
})
something_else <- data.frame(X1 = 1,
time = Sys.time(),
blah = paste(sample(letters, 10, replace = TRUE), collapse = ""))
something <- rbind(something, something_else)
tmp <- tempfile(fileext = ".csv")
on.exit(unlink(tmp))
write.csv(something, file = tmp, row.names = FALSE)
## upload something
gcs_upload(tmp,
bucket = "mark-edmondson-public-files",
name = "schedule/test.csv")
cat("Done", Sys.time())
}
containerit
then replace FROM with trestletech/plumber
and add the below lines to use correct AppEngine port:Example:
library(containerit)
dockerfile <- dockerfile("schedule.R", copy = "script_dir", soft = TRUE)
write(dockerfile, file = "Dockerfile")
Then change/add these lines:
EXPOSE 8080
ENTRYPOINT ["R", "-e", "pr <- plumber::plumb(commandArgs()[4]); pr$run(host='0.0.0.0', port=8080)"]
CMD ["schedule.R"]
Example output:
FROM trestletech/plumber
LABEL maintainer="mark"
RUN export DEBIAN_FRONTEND=noninteractive; apt-get -y update \
&& apt-get install -y libcairo2-dev \
libcurl4-openssl-dev \
libgmp-dev \
libpng-dev \
libssl-dev \
libxml2-dev \
make \
pandoc \
pandoc-citeproc \
zlib1g-dev
RUN ["install2.r", "-r 'https://cloud.r-project.org'", "readr", "googleCloudStorageR", "Rcpp", "digest", "crayon", "withr", "mime", "R6", "jsonlite", "xtable", "magrittr", "httr", "curl", "testthat", "devtools", "hms", "shiny", "httpuv", "memoise", "htmltools", "openssl", "tibble", "remotes"]
RUN ["installGithub.r", "MarkEdmondson1234/googleAuthR@7917351", "hadley/rlang@ff87439"]
WORKDIR /payload/
COPY [".", "./"]
EXPOSE 8080
ENTRYPOINT ["R", "-e", "pr <- plumber::plumb(commandArgs()[4]); pr$run(host='0.0.0.0', port=8080)"]
CMD ["schedule.R"]
app.yaml
with any environment vars such as auth files, that will be included in same folder. Also limit instances if needed to make sure errors down’t spawn hundreds of VMs.Example:
runtime: custom
env: flex
automatic_scaling:
min_num_instances: 1
max_num_instances: 1
resources:
cpu: 1
memory_gb: 2
env_variables:
GCS_AUTH_FILE: auth.json
cron.yaml
for the schedule needed:cron:
- description: "test cron"
url: /demoR
schedule: every 1 hours
gcloud app deploy --project your-project
Deploy new cron via gcloud app deploy cron.yaml