我正在尝试使用aws.s3
包中的write_using()
从 EC3 中的 R 读取/写入 S2。
到目前为止我做了什么
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).
我本来以为这会起作用吗?相反,它看起来像一个身份验证问题
下一个?
我不确定接下来要尝试什么,因为我希望上述方法会起作用。
如果没有,我是否需要以某种方式对 EC2(或在 EC2 上运行的 R 会话)进行身份验证?我认为使用根凭证进行身份验证违背了 IAM 的目的(因为根用户对所有内容都有权限,而与实例关联的 IAM 只有读/写 S3 权限)。所以我不确定这是正确的做法(似乎会有更好的方法 - 即让 S3 知道 EC2 有一个允许它访问的 IAM 的方法)。但是我不确定该怎么做,或者我在尝试这样做时哪里出错了
使用 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 身份验证,您需要使用aws.ec2metadata
- 如果 R 在 EC2 实例上运行,则由 aws.ec2metadata 提供的角色配置文件凭证(如果安装了 aws.ec2metadata 包)。
- 如果 R 在 ECS 任务上运行,则由 aws.ec2metadata 提供的角色配置文件凭证(如果安装了 aws.ec2metadata 包)。
阿拉伯数字。指定正确的 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
从 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
要使其正常工作,您需要独特的key
和secret
来参与。这样做只需要 1 分钟,请执行以下操作:
- 在浏览器中转到 AWS 中的 IAM 部分
- 创建 IAM 用户(选择"编程访问"作为访问类型)
- 为其提供预定义的"AmazonS3FullAccess"权限(通过单击"直接附加现有策略"并搜索"AmazonS3FullAccess"来执行此操作)。不需要标签或其他任何东西。
- 单击并创建用户。您将在最后一个屏幕上的浏览器中看到访问密钥和密钥。
- 将密钥和机密放入 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")