【问题标题】:How to map an AWS S3 Bucket into a container on AWS ECS with AWS CloudFormation template?如何使用 AWS CloudFormation 模板将 AWS S3 存储桶映射到 AWS ECS 上的容器?
【发布时间】:2016-10-19 07:18:21
【问题描述】:

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

谢谢,

附:我已将我的 Asterisk 图像推送到 AWS-ECR 并在 TaskDefenition 中引用它。我在那里看到了 MountPoints 和 Volumes,但它们似乎不是我的解决方案。

【问题讨论】:

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


    【解决方案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 存储桶。

    谢谢, 马尼什

    【讨论】:

    • 嗨,我要将 ECS 卷挂载到 s3 存储桶,以便在不登录服务器的情况下访问日志,我想知道如何在容器中引用这些环境变量?
    【解决方案2】:

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

    通过在 Docker 实例的User Data 中设置这样的脚本,或者自动伸缩组启动配置,EFS 可以挂载到每个 Docker 实例的 /mnt/efs 上,从而共享卷集到 /mnt/efs/something 之类的东西。

    为此,这个 User Data 块完成了这项工作(我们将它与 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) 进行通信。

    【讨论】:

      猜你喜欢
      • 2017-10-19
      • 2017-01-28
      • 1970-01-01
      • 2014-08-22
      • 1970-01-01
      • 2021-08-08
      • 2020-03-03
      • 2019-02-02
      • 1970-01-01
      相关资源
      最近更新 更多