如何使用AWS CloudFormation模板将AWS S3 Bucket映射到AWS ECS上的容器中?

时间:2016-10-17 23:53:25

标签: amazon-web-services amazon-s3 amazon-cloudformation amazon-ecs docker-container

我在Linux上使用Asterisk处理VOIP项目。我们目前的目标是让几台EC2机器在每台机器上运行Asterisk容器,我们希望能够拥有开发,登台和生产环境。为此,我正在编写CloudFormation模板以使用AWS-ECS。 我的问题是我无法找到将AWS-S3存储桶映射到容器卷的正确方法。我想使用2个不同的桶。一个用于将Asterisk配置文件注入所有容器。另一个保存所有容器的语音消息和日志。

谢谢,

P.S。我已经在AWS-ECR上推送了我的Asterisk映像,并在TaskDefenition中引用了它。我在那里看到MountPoints和Volumes,但它们似乎不是我的解决方案。

2 个答案:

答案 0 :(得分:1)

您可以尝试在任务定义中使用环境变量吗?

CF模板中的

就像这样:

"DefJob":{
     "Type":"AWS::ECS::TaskDefinition",
     "Properties":{
        "ContainerDefinitions":[
           {
              "Name":"integration-jobs",
              "Cpu":"3096",
              "Essential":"true",
              "Image":"828387064194.dkr.ecr.us-east-1.amazonaws.com/poblano:integration",
              "Memory":"6483",
              "Environment":[
                 {
                    "Name":"S3_REGION",
                    "Value":"us-east-1"
                 },
                 {
                     "Name":"S3_BUCKET"
                     "Value":"Name-of-S3"
                  }
                  ........

然后在容器中引用这些环境变量以使用这些S3存储桶。您必须确保您的实例有权使用这些S3存储桶。

谢谢, 和Manish

答案 1 :(得分:0)

我知道它并没有完全回答这个问题,这比Manish的解决方案更基本,但是在ECS容器之间实现共享存储的一种原始方法是依赖弹性文件系统

通过在Docker实例的 User Data 中设置此类脚本,或自动扩展组启动配置,可以将EFS安装在每个Docker实例的/ mnt / efs上,从而共享卷集像/ mnt / efs / something。

为此,此用户数据块执行此任务(我们将其与 Amazon ECS Optimized 图像一起使用)。

Content-Type: multipart/mixed; boundary="==BOUNDARY=="
MIME-Version: 1.0

--==BOUNDARY==
MIME-Version: 1.0
Content-Type: text/text/x-shellscript; charset="us-ascii"
#!/bin/bash
yum install -y nfs-utils
mkdir "/mnt/efs"
echo "us-east-1a.fs-1234567.efs.us-east-1.amazonaws.com:/ /mnt/efs nfs4 nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 0 0" >> /etc/fstab
mount -a
/etc/init.d/docker restart
docker start ecs-agent
--==BOUNDARY==--

最后重新启动Docker,否则它不会看到已安装的卷(仅在创建实例时需要)。

当然,要使其正常工作,必须将安全组设置为允许实例和EFS通过NFS网络端口进行通信(2049)。