r - 在 Fargate 上运行 R 脚本时如何避免使用 AWS S3 环境变量
问题描述
我正在尝试在 Fargate 上运行一项任务以执行以下操作:使用 rmarkdown 生成一个 html 文件,然后将其上传到 S3。
我在硬编码我的 AWS 凭证时取得了成功,如下所示:
rmarkdown::render("hello.Rmd")
library(aws.s3)
Sys.setenv(
"AWS_ACCESS_KEY_ID" = "XXXXXXXXXXXXX",
"AWS_SECRET_ACCESS_KEY" = "YYYYYYYYYYY",
"AWS_DEFAULT_REGION" = "eu-west-2"
)
put_object("hello.html", "test.html", "bucket_name")
但是,我希望它能够在不对我的 AWS 凭证进行硬编码的情况下工作。当我删除 Sys.setenv 代码行时,我得到一个 HTTP 403。我认为 IAM 会处理 AWS 凭证
对于我正在使用的执行角色:具有 ecs 信任关系的 ecsTaskExecutionRole 具有策略:AmazonECSTaskExecutionRolePolicy
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecr:GetAuthorizationToken",
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "*"
}
]
}
对于 taskRoleARN,我正在使用带有附加策略的自定义角色(具有 ecs 信任关系):AmazonS3FullAccess
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*"
}
]
}
这是我的 cloudFormation 模板:
TaskDefinition:
Type: AWS::ECS::TaskDefinition
Properties:
ContainerDefinitions:
- Name: !Ref TaskName
Image: !Join ['', [XXX.dkr.ecr.eu-west-2.amazonaws.com/, !Ref ECRRepository, ':', latest]]
MemoryReservation: 500
Essential: true
LogConfiguration:
LogDriver: awslogs
Options:
awslogs-group: !Join ['/', ['/ecs', !Ref TaskName]]
awslogs-region: eu-west-2
awslogs-stream-prefix: ecs
Family: !Ref TaskName
ExecutionRoleArn: arn:aws:iam::XXX:role/ecsTaskExecutionRole
NetworkMode: awsvpc
RequiresCompatibilities:
- FARGATE
Cpu: !Ref CPU
Memory: !Ref Memory
TaskRoleArn: arn:aws:iam::XXX:role/custom-S3-put
这是我的码头文件:
FROM rocker/tidyverse:3.6.3
RUN apt-get update && \
apt-get install -y openjdk-11-jdk && \
apt-get install -y liblzma-dev && \
apt-get install -y libbz2-dev && \
apt-get install -y libnetcdf-dev
COPY ./packrat/packrat.lock /home/project/packrat/
COPY initiate.R /home/project/
COPY hello.Rmd /home/project/
RUN install2.r packrat
RUN which nc-config
RUN Rscript -e 'packrat::restore(project = "/home/project/")'
RUN echo '.libPaths("/home/project/packrat/lib/x86_64-pc-linux-gnu/3.6.3")' >> /usr/local/lib/R/etc/Rprofile.site
WORKDIR /home/project/
CMD Rscript initiate.R
任何想法为什么后一种方法不起作用而前一种方法是?如果有人有任何想法/建议,我将不胜感激。非常感谢。
解决方案
正如这个答案在另一个问题中指出的那样,aws.s3 可以使用 EC2 元数据进行身份验证。要启用此功能,只需安装包“aws.ec2metadata”:
要使用 EC2 实例中的包,您需要安装 aws.ec2metadata。这样,将从机器的角色中获得凭证。
推荐阅读
- excel - 同一行中 clearcontents 的错误
- ruby-on-rails - Rails 序列化 - fast_jsonapi / active_model_serializers
- c# - C# 中非包装类中的集合的 FluentValidation
- c# - 如何在 Razor Page OnInitialized 事件中使用 404 路由
- c# - 在从 svcutil 创建的客户端发送 SOAP 请求时更改信封的命名空间
- java - 我想从firebase检索当前用户的ID并将其写入另一个节点,但它只是一直拒绝
- python - Pymongo - 如何将数组添加到列表并读取它
- reactjs - 如何将边框半径添加到 react-konva Image 对象?
- html - 更改 HTML 中的图标大小
- python - 模板中的 Django URL,其中包含 slug