首页 > 解决方案 > 在 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

任何想法为什么后一种方法不起作用而前一种方法是?如果有人有任何想法/建议,我将不胜感激。非常感谢。

标签: ramazon-web-servicesamazon-s3amazon-ecsaws-fargate

解决方案


正如这个答案在另一个问题中指出的那样,aws.s3 可以使用 EC2 元数据进行身份验证。要启用此功能,只需安装包“aws.ec2metadata”:

要使用 EC2 实例中的包,您需要安装 aws.ec2metadata。这样,将从机器的角色中获得凭证。

https://github.com/cloudyr/aws.s3#aws-s3-client-package


推荐阅读