【问题标题】:AWS Lambda and S3 with R and aws.s3 package带有 R 和 aws.s3 包的 AWS Lambda 和 S3
【发布时间】:2021-08-31 04:46:35
【问题描述】:

我正在尝试使用自定义 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”,并且消息指的是“错误请求(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).

【问题讨论】:

  • 有什么解决办法吗?我面临着完全相同的问题
  • 现在不行。我刚刚最终使用 DB 而不是 S3 来存储我的数据。

标签: r docker amazon-s3 aws-lambda


【解决方案1】:

我所做的是使用以下命令在 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 .

【讨论】:

  • 感谢分享。现在我的脚本也可以了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-17
  • 1970-01-01
  • 1970-01-01
  • 2018-02-22
  • 1970-01-01
  • 2021-05-15
  • 2023-01-01
相关资源
最近更新 更多