Skip to contents

A science-focused, more humane R interface to AWS.

Installation

CRAN version

# install.packages("pak")
pak::pak("sixtyfour")

Development version

# install.packages("pak")
pak::pak("getwilds/sixtyfour")

Load package

Authentication

We leverage the package paws to handle AWS authentication. There are many ways to configure paws to authenticate with AWS - see paws documentation.

One way to authenticate is using these three environment variables:

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY
  • AWS_REGION

You can set these three environment variables within R for the current R session like:

Sys.setenv(
  AWS_ACCESS_KEY_ID = "",
  AWS_SECRET_ACCESS_KEY = "",
  AWS_REGION = "us-west-2"
)

Or set environment variables in a variety of ways to be available across R sessions. See the R Startup chapter of What They Forgot to Teach You About R book for more details.

Package API Overview

  • aws_billing*: manage AWS billing details
  • aws_bucket*: manage S3 buckets
  • aws_file_*: manage files in S3 buckets
  • aws_user*: manage AWS users
  • aws_group*: manage AWS groups
  • aws_role*: manage AWS roles
  • aws_policy*/aws_policies*: manage AWS policies
  • aws_db*: interact with AWS database services Redshift and RDS
  • aws_secrets*: secrets manager
  • aws_vpc*: VPC security groups
  • con_*: connection classes to various AWS services
  • six_*: magical methods

Working with S3

We cover S3 in detail in another vignette (vignette("s3")), so we’ll briefly touch on it here.

Buckets

Make a random bucket name

bucket <- random_bucket()

Create a bucket - check if it exists first

exists <- aws_bucket_exists(bucket)

if (!exists) {
  aws_bucket_create(bucket)
}
#> [1] "http://bucket-lphnzotejwfyuxkm.s3.amazonaws.com/"

Files

First, create a bucket:

my_bucket <- random_bucket()
aws_bucket_create(my_bucket)
#> [1] "http://bucket-cdzsxyjiofheptnr.s3.amazonaws.com/"

Then, upload some files

temp_files <- replicate(n = 3, tempfile(fileext = ".txt"))
for (i in temp_files) cat(letters, "\n", file = i)
remote_files <- s3_path(my_bucket, basename(temp_files))
aws_file_upload(path = temp_files, remote_path = remote_files)
#> [1] "s3://bucket-cdzsxyjiofheptnr/file16cf21ea161d1.txt"
#> [2] "s3://bucket-cdzsxyjiofheptnr/file16cf2751cf00c.txt"
#> [3] "s3://bucket-cdzsxyjiofheptnr/file16cf23ed3dfe5.txt"

List files in the bucket

obs <- aws_bucket_list_objects(my_bucket)
obs
#> # A tibble: 3 × 8
#>   bucket          key   uri    size type  etag  lastmodified        storageclass
#>   <glue>          <chr> <glu> <fs:> <chr> <chr> <dttm>              <chr>       
#> 1 bucket-cdzsxyj… file… s3:/…    53 file  "\"a… 2025-03-20 20:52:34 STANDARD    
#> 2 bucket-cdzsxyj… file… s3:/…    53 file  "\"a… 2025-03-20 20:52:34 STANDARD    
#> 3 bucket-cdzsxyj… file… s3:/…    53 file  "\"a… 2025-03-20 20:52:34 STANDARD

Billing

Billing is covered in the vignette("billing") vignette.

IAM

IAM stands for Identity Access Management. IAM covers four resource types:

  • Users: via aws_user* functions
  • Groups: via aws_group* functions
  • Roles: via aws_role* functions
  • Policies: via aws_policy*/aws_policies* functions

As a brief example let’s create a group, a user, and a role. We’ll assign the user to the group. Then clean it all up.

First, create a group

group_name <- random_string("gr-")
group_name
#> gr-gmpcjatq
aws_group_create(group_name)
#> # A tibble: 1 × 5
#>   GroupName   GroupId               Path  Arn   CreateDate         
#>   <chr>       <chr>                 <chr> <chr> <dttm>             
#> 1 gr-gmpcjatq AGPA22PL7JXXYJ5WLSESJ /     ***** 2025-03-20 20:52:35

Then create a user

name <- random_user()
name
#> [1] "RepellentFinale"
aws_user_create(name)
#> # A tibble: 1 × 6
#>   UserName        UserId     Path  Arn   CreateDate          PasswordLastUsed
#>   <chr>           <chr>      <chr> <chr> <dttm>              <dttm>          
#> 1 RepellentFinale AIDA22PL7… /     ***** 2025-03-20 20:52:35 NA

Now add the user to the group

aws_user_add_to_group(name, group_name)
#> $user
#> # A tibble: 1 × 6
#>   UserName        UserId     Path  Arn   CreateDate          PasswordLastUsed
#>   <chr>           <chr>      <chr> <chr> <dttm>              <dttm>          
#> 1 RepellentFinale AIDA22PL7… /     ***** 2025-03-20 20:52:35 NA              
#> 
#> $policies
#> # A tibble: 0 × 0
#> 
#> $attached_policies
#> # A tibble: 0 × 0
#> 
#> $groups
#> # A tibble: 1 × 5
#>   GroupName   GroupId               Path  Arn   CreateDate         
#>   <chr>       <chr>                 <chr> <chr> <dttm>             
#> 1 gr-gmpcjatq AGPA22PL7JXXYJ5WLSESJ /     ***** 2025-03-20 20:52:35

Now create a role

role_name <- random_role()
trust_policy <- list(
  Version = "2012-10-17",
  Statement = list(
    list(
      Sid = "Statement1",
      Effect = "Allow",
      Principal = list(
        Service = "lambda.amazonaws.com"
      ),
      Action = "sts:AssumeRole"
    )
  )
)
doc1 <- jsonlite::toJSON(trust_policy, auto_unbox = TRUE)
aws_role_create(role_name,
  assume_role_policy_document = doc1,
  description = "test role A"
)
#> # A tibble: 1 × 7
#>   RoleName         RoleId            Path  Arn   CreateDate          Description
#>   <chr>            <chr>             <chr> <chr> <dttm>              <lgl>      
#> 1 BridgedLiquidati AROA22PL7JXX5ETK… /     ***** 2025-03-20 20:52:36 NA         
#> # ℹ 1 more variable: AssumeRolePolicyDocument <chr>

Finally, cleanup

aws_role_delete(role_name)
six_user_delete(name)
#> ! No access keys found for RepellentFinale
#> ℹ Group gr-gmpcjatq detached
#> ℹ RepellentFinale deleted
six_group_delete(group_name)
#> ℹ group gr-gmpcjatq deleted

Databases

Databases are covered in the vignette("databases") vignette.

Magical methods

Magical methods are higher level functions to make your life easier.

As an example, six_user_create() creates a new user, including a) creating the appropriate policy if it doesn’t exist yet, b) attaching the policy to the created user, and c) creating an AWS Access Key for the user (and copy an email template to your clipboard with the details the new user needs).

name <- random_user()
name
#> [1] "GildedArchery"
six_user_create(name)
#> ℹ Added policy UserInfo to GildedArchery
#> ✔ Key pair created for GildedArchery
#> ℹ AccessKeyId: *****
#> ℹ SecretAccessKey: *****
#> ℹ Email template copied to your clipboard

There are other magical methods. See the docs and the vignette("six") vignette for more information.