如何使用aws.s3包函数(write_using和read_using)从EC2上的R访问S3数据?

时间:2019-06-18 13:15:08

标签: r amazon-s3 amazon-ec2 amazon-iam

我正在尝试使用write_using()包中的aws.s3在EC2中从R读取/写入S3。

到目前为止我做了什么

EC2附带了一个IAM,可以对specific AWS S3 bucket

进行读/写。

我已将IAM与EC2相关联。我还创建了一个存储桶(在此示例中,请假定其名为my-unique-bucket

当我进入EC2并打开R时,然后运行类似s3write_using(mtcars, FUN = write.csv, object = "mtcars.csv", bucket = "my-unique-bucket")

我知道

List of 4
 $ Code     : chr "AccessDenied"
 $ Message  : chr "Access Denied"
 $ RequestId: chr "3B942C125C154B49"
 $ HostId   : chr "0dgc4Iuv3EXdQxMgkh4Qkxt+aADzxsVYp6pq2k3/OjSztFlV1nftjn4MkIvNZ+wCVqzeJsttY44="
 - attr(*, "headers")=List of 6
  ..$ x-amz-request-id : chr "3B942C125C154B49"
  ..$ x-amz-id-2       : chr "0dgc4Iuv3EXdQxMgkh4Qkxt+aADzxsVYp6pq2k3/OjSztFlV1nftjn4MkIvNZ+wCVqzeJsttY44="
  ..$ content-type     : chr "application/xml"
  ..$ transfer-encoding: chr "chunked"
  ..$ date             : chr "Tue, 18 Jun 2019 12:57:45 GMT"
  ..$ server           : chr "AmazonS3"
  ..- attr(*, "class")= chr [1:2] "insensitive" "list"
 - attr(*, "class")= chr "aws_error"
NULL
Error in parse_aws_s3_response(r, Sig, verbose = verbose) : 
  Forbidden (HTTP 403).

我希望这能奏效吗?相反,它看起来像是身份验证问题

下一步?

我不确定下一步该怎么做,因为我希望以上方法能奏效。

如果没有,我是否需要对EC2(或在EC2上运行的R会话)进行身份验证?我认为使用根凭据进行身份验证会破坏IAM的目的(因为根用户具有所有权限,而与实例关联的IAM仅具有对S3的读/写权限)。因此,我不确定这是正确的做法(似乎会有更好的方法-即让S3知道EC2具有允许其访问的IAM的方法)。但是我不确定如何执行此操作,或者在尝试此操作时哪里出错了

2 个答案:

答案 0 :(得分:0)

从R中访问S3数据

这将在任何地方(例如Windows,mac等,无论是在EC2上还是其他版本上运行)中运行。您需要在R中使用以下代码:

key <- "ALIAVI5FAYD9B(8MVJZ" # Substitute with your own (see below)
secret <- "ePy7jMlRj5jTVAruqmb3uap9bHXmnsSHI+zqfdmHL" # (see below)

Sys.setenv("AWS_ACCESS_KEY_ID" = key,
           "AWS_SECRET_ACCESS_KEY" = secret)

bucketlist() # This returns a list of all your buckets if authentication was successful 

要使其正常工作,您需要使用唯一的keysecret进行潜入。这样做仅需1分钟,请执行以下操作:

  1. 在浏览器中转到AWS中的IAM部分
  2. 创建一个IAM用户(为访问类型选择“程序访问”)
  3. 提供预定义的“ AmazonS3FullAccess”权限(通过单击“直接附加现有策略”并搜索“ AmazonS3FullAccess”来执行此操作)。无需标签或其他任何东西。
  4. 单击并创建用户。您将在最后一个屏幕上的浏览器中看到访问密钥和机密。
  5. 将密钥和秘密放入R代码中(如上所述),您就完成了!这里的所有都是它的。

一些额外的提示

# Write to your S3 bucket
s3write_using(mtcars, FUN = write.csv, object = "mtcars.csv", bucket = "your-bucket-name")

# Read from your S3 bucket
myfile <- s3read_using(FUN = read.csv, object = "mtcars.csv", bucket = "your-bucket-name")

# In case you need to remove an environment variable AWS_SESSION_TOKEN, this will clear it
Sys.unsetenv("AWS_SECRET_ACCESS_KEY")

答案 1 :(得分:0)

使用aws IAM角色的解决方案:

您需要使用aws.ec2metadata并确保指定正确的s3存储桶区域以使用ec2或ecs任务IAM角色。

library(aws.s3)
library(aws.ec2metadata)
Sys.setenv("AWS_DEFAULT_REGION" = 'us-west-2')

参考文献

这里没有什么值得研究的。

1。包括软件包aws.ec2metadata

根据https://cran.r-project.org/web/packages/aws.s3/readme/README.html,它使用https://github.com/cloudyr/aws.signature/进行AWS Auth,您需要使用 aws.ec2metadata

  1. 如果R在EC2实例上运行,则如果安装了aws.ec2metadata软件包,则由aws.ec2metadata提供的角色配置文件凭据。
  2. 如果R在ECS任务上运行,则如果已安装aws.ec2metadata软件包,则由aws.ec2metadata提供的角色配置文件凭据。

2。指定正确的AWS区域

  • S3可能对区域规范有些挑剔。 bucketlist()会从所有区域返回存储桶,但所有其他函数都需要指定一个区域。如果未明确指定默认值“ us-east-1”,则默认为“ us-east-1”,并且无法自动检测到正确的区域。 (注意:使用不正确的区域是使用S3时最常见的错误之一,也是最难发现的错误。)

3。验证ec2 / ecs任务IAM角色对s3存储桶具有正确的访问权限(读/写)。

  • 可以通过aws cli验证
aws s3 ls s3://my_bucket/directory/
aws s3 cp s3://my_bucket/directory/myfile /tmp/
aws s3 cp /tmp/test s3://my_bucket/directory/ # check this only if you need write access