Docker 将S3 bucket作为文件系统安装在AWS ECS容器上

Docker 将S3 bucket作为文件系统安装在AWS ECS容器上,docker,plugins,mount,s3fs,aws-ecs,Docker,Plugins,Mount,S3fs,Aws Ecs,我正在尝试使用rexray/s3fs驱动程序将S3作为卷装载到AWS ECS docker容器上 我可以在我安装了插件的本地机器上完成这项工作 $docker plugin install rexray/s3fs 并将S3桶安装在docker集装箱上 $docker plugin ls ID NAME DESCRIPTION ENABLED 3a0e14ca

我正在尝试使用rexray/s3fs驱动程序将S3作为卷装载到AWS ECS docker容器上

我可以在我安装了插件的本地机器上完成这项工作

$docker plugin install rexray/s3fs
并将S3桶安装在docker集装箱上

$docker plugin ls

ID                  NAME                 DESCRIPTION                                   ENABLED

3a0e14cadc17        rexray/s3fs:latest   REX-Ray FUSE Driver for Amazon Simple Storage   true 

$docker run -ti --volume-driver=rexray/s3fs -v s3-bucket:/data img
我正在尝试在AWS ECS上复制此功能

请参阅以下文件:

若我给了驱动程序值,那个么这个任务就不能运行,也不能给 “无法放置任务,因为没有容器实例满足其所有要求。”错误

我正在使用t2.medium实例并给出任务的it需求,因此它不应该是H/W需求问题

如果我从作业定义中删除驱动程序配置,则会执行任务

我好像错过了什么

如果有人尝试过相同的东西,请分享知识


谢谢

ecs群集ec2实例需要安装rexray驱动程序。在这篇aws博客中,他们讨论了这一点

为了帮助您入门,我们创建了一个AWS CloudFormation模板,用于构建两节点ECS集群。该模板将rexray/ebs卷驱动程序引导到每个节点上,并为它们分配一个IAM角色和一个内联策略,该策略允许它们调用REX-Ray需要的API操作


这同样适用于s3驱动程序

您使用rexray/s3fs驱动程序的方法是正确的

以下是我在AmazonLinux1上运行的步骤

首先,您需要安装s3fs

yum install -y gcc libstdc+-devel gcc-c+ fuse fuse-devel curl-devel libxml2-devel mailcap automake openssl-devel git gcc-c++
git clone https://github.com/s3fs-fuse/s3fs-fuse
cd s3fs-fuse/
./autogen.sh
./configure --prefix=/usr --with-openssl
make
make install
现在安装驱动程序。这里有一些您可能需要修改的选项,例如使用IAM角色而不是Access Key和AWS region

docker plugin install rexray/s3fs:latest S3FS_REGION=ap-southeast-2 S3FS_OPTIONS="allow_other,iam_role=auto,umask=000" LIBSTORAGE_INTEGRATION_VOLUME_OPERATIONS_MOUNT_ROOTPATH=/ --grant-all-permissions
现在,重新启动ECS代理是非常重要的一步。我也更新了好的措施

yum update -y ecs-init
service docker restart && start ecs
您现在应该准备好创建任务定义了。重要的部分是您的卷配置,如下所示

"volumes": [
  {
    "name": "name-of-your-s3-bucket",
    "host": null,
    "dockerVolumeConfiguration": {
      "autoprovision": false,
      "labels": null,
      "scope": "shared",
      "driver": "rexray/s3fs",
      "driverOpts": null
    }
  }
]
现在只需在容器定义中指定装入点:

"mountPoints": [
  {
    "readOnly": null,
    "containerPath": "/where/ever/you/want",
    "sourceVolume": "name-of-your-s3-bucket"
  }
]
现在,只要您拥有访问s3存储桶的适当IAM权限,您的容器就应该启动,并且您可以继续使用s3作为卷


如果运行任务时出现错误,显示“属性”,请仔细检查插件是否已成功安装在ec2实例上,ecs代理是否已重新启动。再次检查您的驱动程序名是否为“rexray/s3fs”。

感谢@wimnat的指导

关于通过LaunchConfiguration UserData在ECS群集中的Ec2实例上安装rexray/s3fs插件,这就是我最终得到的结果(对于AMI版本amzn-AMI-2018.03.o-amazon-ECS-optimized):

注意事项:

  • 使用rexray/s3fs:latest在执行“docker volume ls”时显示卷,但在装载卷时出错()
  • 如果使用版本化的rexray/s3fs,则在定义装载时需要在drivername中包含该版本,即
    驱动程序:“rexray/s3fs:0.11.1”
  • 要检查容器实例是否具有所需的属性,可以使用aws cli:aws ecs列表属性--群集我的群集--目标类型容器实例--配置文件我的配置文件--属性名称ecs.capability.docker plugin.rexray/s3fs.0.11.1
  • 似乎ecs代理在UserData脚本完成后启动,因此无需重新启动代理或等待代理启动。
  • 此安装适用于启用默认加密(AES256)的bucket。如果您使用自己的kmskey加密bucket,则需要提供正确的s3fs选项来处理加密/解密。我没有试过这个

  • 通过直接运行
    s3fs
    命令将bucket装载到我的容器中,我已经让
    s3fs
    在我的ECS容器中工作。我不熟悉rexray驱动程序,它可能比仅仅使用
    s3fs
    提供一些好处,但对于许多用例来说,这可能工作得很好,并且不需要任何
    UserData
    编辑

    我将容器的入口点设置为以下值,使其更加平滑:

    #!/bin/bash
    
    bucket=my-bucket
    
    s3fs ${bucket} /data -o ecs
    
    echo "Mounted ${bucket} to /data"
    
    exec "$@"
    
    -o ecs
    选项对于担任ecs任务角色至关重要,如果您使用常规的
    -o iam_Role=auto
    s3fs
    将担任运行ecs代理的EC2实例的iam角色

    注意:由
    apt get install s3fs
    安装的
    s3fs
    的版本很旧,在撰写本文时没有此选项,这意味着您可能需要从源代码安装
    s3fs


    另请注意:您需要在特权模式下运行容器,s3fs装载才能正常工作。

    AWS已声明AWS ECS支持卷插件,但我找不到有关配置的详细文档。这不是重复的吗?s3fs fuse不是一个可靠的解决方案,我已经尝试过,但在很多方面都失败了。@RobinVarghese-我想这取决于您对可靠的定义和您的用例。s3fs fuse适用于我的用例,即提供一些s3文件,每小时读取一到两次。有没有办法让
    ecs fargate
    代替
    ecs ec2
    ?没有。fargate不支持rexray/s3fs驱动程序。有没有办法让
    ecs fargate
    代替
    ecs ec2
    ?我相信fargate在基于ec2的ecs上的工作方式应该与在fargate上的工作方式相同,两者都使用相同的ecs执行接口,不同之处在于它所运行的基础设施。尽管如此,我还没有测试过它
    #!/bin/bash
    
    bucket=my-bucket
    
    s3fs ${bucket} /data -o ecs
    
    echo "Mounted ${bucket} to /data"
    
    exec "$@"