我正在尝试使用自定义 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/