r - 带有 R 和 aws.s3 包的 AWS Lambda 和 S3

标签 r docker amazon-s3 aws-lambda

我正在尝试使用自定义 docker 镜像访问 lambda 函数中的 AWS S3 存储桶。 我已经设置了一个脚本来获取包含以下代码的文件列表:

Sys.setenv("AWS_ACCESS_KEY_ID" = aws_s3_key,
           "AWS_SECRET_ACCESS_KEY" = aws_s3_secret,
           "AWS_DEFAULT_REGION" = "eu-west-2")

aws_s3_bucket_name <- "my-bucket"

f <- aws.s3::get_bucket(bucket = aws_s3_bucket_name, url_style = "path")

我在 docker(本地的 fedora)中运行我的脚本没有问题,但是,当我在 lambda 中尝试相同的功能时(使用我在系统中配置的相同图像),我得到了这个错误:

..$ Code : chr "InvalidToken"
..$ Message : chr "The provided token is malformed or otherwise invalid." 
..$ Token-0 : chr "IQoJb3JpZ/BoNzJXuwChJ2R5p"| __truncated__ 
..$ RequestId: chr "CP2CBX9PA95G3X2X" 2021-06-15T00:24:17.848+02:00 
..$ HostId : chr "pTlkIhvhCTLPTiXwSBHL/qq7Y=" 2021-06-15T00:24:17.848+02:00 - attr(*, "headers")=List of 8 
..$ x-amz-bucket-region: chr "eu-west-2" 
..$ x-amz-request-id : chr "CP2CBX9PA95G3X2X"  
..$ x-amz-id-2 : chr "pTlkIhvhCTLPTiXwW4vMexnz/qq7Y="  
..$ content-type : chr "application/xml" 
..$ transfer-encoding : chr "chunked" 
..$ date : chr "Mon, 14 Jun 2021 22:24:17 GMT"
..$ server : chr "AmazonS3"
..$ connection : chr "close" 
... 
...

也许这只是我的错,因为我对 was-lambda 还很陌生,但我仍然不明白为什么该脚本在我的本地 docker 中运行。

我怀疑这个问题与某些编码问题有关,因为我得到的错误似乎包含一些“\n”并且消息指的是“Bad Request (HTTP 400)”:

- attr(*, "request_canonical")= chr "GET\n/xxxxxxxx-x-xxx-counter/\n\nhost:s3-eu-west-2.amazonaws.com"| __truncated__
- attr(*, "request_canonical")= chr "GET\n/xxxxxxxx-x-xxx-/\n\nhost:s3-eu-west-2.amazonaws.com"| __truncated__

- attr(*, "request_string_to_sign")= chr "AWS4-HMAC-SHA256\n" __truncated__

ERROR [2021-06-15 10:55:06] Error in parse_aws_s3_response(r, Sig, verbose = verbose): Bad Request (HTTP 400).

最佳答案

我所做的是使用以下命令在 Dockerfile 中设置 aws_access_key_id 和 aws_secret_access_key:

RUN aws configure set aws_access_key_id <<aws_access_key_id>>
RUN aws configure set aws_secret_access_key <<aws_secret_access_key>>

通过这种方式,aws-cli 凭证被存储在容器内,因此这可以写入 S3,我想也可以写入其他服务。 如果您将它们设置在您的 .R 脚本中,那么它们将存储在其中并且容器不知道任何 AWS 实例。

编辑:上述方法的更“优雅”和安全的方法是按照以下方式在 Dockerfile 中设置参数和环境变量:

ARG AWS_KEY
ARG AWS_SECRET

ENV AWS_KEY ${AWS_KEY}
ENV AWS_SECRET ${AWS_SECRET}

然后,您可以通过指定键将“docker build”与构建参数一起使用。

docker build --build-arg AWS_KEY=xxxx --build-arg AWS_SECRET=yyyy .

关于r - 带有 R 和 aws.s3 包的 AWS Lambda 和 S3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67984468/

相关文章:

r - ggplot2:组合来自两个不同地理数据集的形状文件

r - OpenCPU数据缓存

django - docker compose无法将postgresql数据库与django连接

docker - 是否可以在 CoreOS 上更新 Docker 而不更新舰队和 etcd?

django - 如何将 django 日志文件保存在 aws 弹性 beantalk 中托管的 django 应用程序的 s3 存储桶中

amazon-s3 - 如何从 AWS S3 检查 Redshift COPY 命令性能?

r - 模拟马尔可夫链的概率数不正确

r - 有没有办法在同一个 ggplot 上使用 2 个色标?

docker 错误 : client and server don't have same version

amazon-web-services - Chef 12 + AWS Opsworks + 从 s3 部署应用程序