我正在尝试使用rexray/s3fs驱动程序将S3作为卷安装在AWS ECS docker容器上。
我可以在我的本地机器上做到这一点,我在那里安装了插件
$docker plugin install rexray/s3fs
并将S3铲斗安装在码头集装箱上。
$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上复制这一点。
尝试遵循以下文档:https://docs.aws.amazon.com/AmazonECS/latest/developerguide/docker-volumes.html
如果我给Driver值,则任务无法运行"无法放置任务,因为没有容器实例满足其所有要求。"错误。
我使用的是t2.mediaum实例,并给出了任务的需求,所以它不应该是H/W需求问题。
如果我从作业定义中删除驱动程序配置,任务就会执行。
我似乎错过了配置某些内容。
有人尝试过同样的东西吗?请分享知识。
谢谢!!
您使用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角色而不是访问密钥和AWS区域。
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"
}
]
现在,只要您有适当的IAM权限访问s3存储桶,您的容器就应该启动,并且您可以继续使用s3作为卷。
如果您在运行显示"ATTRIBUTE"的任务时遇到错误,请仔细检查插件是否已成功安装在ec2实例上,并且ecs代理是否已重新启动。还要仔细检查您的驱动程序名称是否为"rexray/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角色。
请注意,ECS Task Role需要为您尝试挂载的bucket提供s3:GetObject
、s3:PutObject
和s3:ListObjects
IAM操作权限。如果您希望容器对bucket具有只读访问权限,则可以通过关闭s3:PutObject
权限在IAM级别强制执行该权限。您还可以使用细粒度IAM资源语句来禁止或允许只写入某些s3前缀。如果您试图将文件写入s3fs文件系统,而它没有实际进行底层s3api调用的权限,则会引发一些丑陋的错误,但通常情况下一切都很好。
注意:apt-get install s3fs
安装的s3fs
版本较旧,在撰写本文时没有此选项,这意味着您可能需要从源代码安装s3fs
。
还要注意:您需要在特权模式下运行容器,s3fs装载才能工作。
ecs集群ec2实例需要安装rexray驱动程序。在aws的博客文章中,他们讨论了这一点。https://aws.amazon.com/blogs/compute/amazon-ecs-and-docker-volume-drivers-amazon-ebs/
为了帮助您入门,我们创建了一个AWS CloudFormation模板,用于构建一个双节点ECS集群。该模板将rexray/ebs卷驱动程序引导到每个节点上,并为它们分配一个IAM角色,该角色具有内联策略,允许它们调用REX射线所需的API操作。
这同样适用于s3驱动程序
感谢@wimnat的指导。
关于通过LaunchConfiguration UserData在ECS集群中的Ec2实例上安装rexray/s3fs插件,这就是我最终得到的(对于AMI版本amzn-AMI-2019.03.o-amazon-ECS-优化):
#install s3fs required by rexray/s3fs docker plugin
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
#install plugin to enable s3 volumes, using the task execution role to access s3.
docker plugin install rexray/s3fs:0.11.1 S3FS_REGION=us-east-1 S3FS_OPTIONS="allow_other,iam_role=auto,umask=000" LIBSTORAGE_INTEGRATION_VOLUME_OPERATIONS_MOUNT_ROOTPATH=/ --grant-all-permissions
注意事项:
- 使用rexray/s3fs:最新的卷在执行"docker volume ls"时显示,但我在装载卷时出错(https://github.com/rexray/rexray/issues/1187)
- 如果使用版本化的rexray/s3fs,则在定义装载时需要将该版本包括在驱动程序名称中,即
Driver: 'rexray/s3fs:0.11.1'
- 要检查容器实例是否具有所需的属性,可以使用aws-cli:aws ecs list attributes--cluster my cluster--target type container instance--profile myprofile--attribute name ecs.capability.docker-plugin.rexray/s3fs0.11.1
- ecs代理似乎是在UserData脚本完成后启动的,因此无需重新启动代理,也无需等待代理启动。
- 安装适用于启用默认加密(AES256)的bucket。如果您使用自己的kmskey来加密bucket,则需要提供正确的s3fs选项来处理加密/解密。我没有试过这个