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

use*_*745 2 r amazon-s3 amazon-ec2 amazon-iam

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

到目前为止我做了什么

EC2 附加了一个 IAM,允许读取/写入特定的 AWS S3 存储桶

我已将 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).
Run Code Online (Sandbox Code Playgroud)

我本来期望这能起作用吗?相反,它看起来像是身份验证问题

下一个?

我不确定接下来要尝试什么,因为我希望上述方法能起作用。

如果没有,我是否需要以某种方式对 EC2(或在 EC2 上运行的 R 会话)进行身份验证?我认为使用根凭证进行身份验证违背了 IAM 的目的(因为根用户拥有所有权限,而与实例关联的 IAM 仅具有对 S3 的读/写权限)。所以我不确定这样做是否正确(似乎会有更好的方法 - 即让 S3 知道 EC2 有一个 IAM 允许其访问)。但我不确定如何做到这一点,也不知道我在尝试这个过程中哪里出了问题

Sou*_*abh 5

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

\n

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

\n
library(aws.s3)\nlibrary(aws.ec2metadata)\nSys.setenv("AWS_DEFAULT_REGION" = \'us-west-2\')\n
Run Code Online (Sandbox Code Playgroud)\n

参考

\n

这里有一些事情需要研究。

\n

1. 包含 aws.ec2metadata 包

\n

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

\n
    \n
  1. 如果 R 在 EC2 实例上运行,则由 aws.ec2metadata 提供的角色配置文件凭证(如果安装了 aws.ec2metadata 包)。
  2. \n
  3. 如果 R 在 ECS 任务上运行,则由 aws.ec2metadata 提供的角色配置文件凭证(如果安装了 aws.ec2metadata 包)。
  4. \n
\n

2.指定正确的aws区域

\n
    \n
  • S3 对区域规范可能有点挑剔。bucketlist() 将返回所有区域的存储桶,但所有其他函数都需要指定区域。如果未明确指定,则依赖默认值“us-east-1”,并且无法自动检测到正确的区域\xe2\x80\x99。(注意:使用不正确的区域是使用 S3 时最常见且最难找出的错误之一。)
  • \n
\n

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

\n
    \n
  • 这可以通过 aws cli 验证
  • \n
\n
aws s3 ls s3://my_bucket/directory/\naws s3 cp s3://my_bucket/directory/myfile /tmp/\naws s3 cp /tmp/test s3://my_bucket/directory/ # check this only if you need write access\n
Run Code Online (Sandbox Code Playgroud)\n