在AWS ECS上打开OpenProject 第2部分

OpenProjectが公開しているdocker-compose.ymlをAWS ECSにデプロイしてみました その2

以前OpenProject on AWS ECSという記事で、ecs-cliを使ってECSにOpenProjectをデプロイしてみたんですが、今回は同じことをdockerのECS拡張を使ってやってみました。
OpenProjectのもともとの構成ではmemcachedとpostgresqlもコンテナ動作させてますが、そこは個人の趣味でマネージドサービスを使用しています。

Docker的ECS扩展是什么意思?

AWS和Docker合作以简化开发者体验的扩展功能于2020年7月发布。其核心特点是可以直接通过docker客户端操作ECS上的容器,同时还支持docker-compose。该功能于2020年11月19日正式达到通用可用(GA)状态。

之前的部署方法(ecs-cli)的问题总结

    • ecs-cliがdocker-composeのver3.xに対応していないため、凝った作りのdocker-compose.ymlの場合はかなりの部分を編集しなければならない

 

    • fargateへのデプロイが困難

 

    コンテナ間依存の記述が困難

安装命令执行环境的大致概述。

Deploying Docker containers on ECSの通り作業して、コマンド実行環境を作ります。

AWS命令行接口

我在Ubuntu 20.04上创建了一个命令行执行环境。首先安装了AWS CLI,并进行了凭据设置。
需要以下IAM权限。

    • EC2

 

    • IAM

 

    • ElasticLoadBalancing

 

    • CloudMap

 

    • ElasticFileSystem

 

    CloudFormation

その他に、以下の権限も与えてましたが、docker compose upに必要かどうかは未確認です。

    • ECS

 

    • CodeDeploy

 

    CloudWatchLogsFullAccess

docker-cli

我已经安装了docker-ce和docker-compose。
根据手册,需要设置AWS上下文。

其他AWS环境

PostgreSQL和Memcached

我会在区域内创建一个托管的PostgreSQL和Memcached服务。 PostgreSQL的用户名和密码是使用docker-compose.yml文件中的凭据创建的。连接信息将在docker-compose.yml中进行说明。

默认 VPC

默认的VPC必须存在于该区域中。我认为通常情况下都会存在,但如果由于某种原因被删除,请务必重新创建。

docker-compose.yml 请接替

在Docker的ECS扩展中,我们将docker-compose.yml文件转换为cloudformation格式,通过cloudformation创建ECS环境。

首先,按照OpenProject的手册获取docker-compose.yml文件。

> git clone https://github.com/opf/openproject-deploy --depth=1 --branch=stable/11 openproject

对这个文件进行修正。
最终使用的docker-compose.yml如下。

version: "3.7"                                                                                                                                                                                       

networks:                                                                                                                                                                                            
  frontend:                                                                                                                                                                                          
  backend:                                                                                                                                                                                           

volumes:                                                                                                                                                                                             
  opdata:                                                                                                                                                                                            

x-op-restart-policy: &restart_policy                                                                                                                                                                 
  restart: unless-stopped                                                                                                                                                                            
x-op-image: &image                                                                                                                                                                                   
  image: openproject/community:${TAG:-11}                                                                                                                                                            
x-op-app: &app                                                                                                                                                                                       
  <<: *image                                                                                                                                                                                         
  <<: *restart_policy                                                                                                                                                                                
  environment:                                                                                                                                                                                       
    RAILS_CACHE_STORE: "memcache"                                                                                                                                                                    
    OPENPROJECT_CACHE__MEMCACHE__SERVER: "cache.yyyy.cfg.usw2.cache.amazonaws.com:11211"                                                                                                           
    OPENPROJECT_RAILS__RELATIVE__URL__ROOT: "${OPENPROJECT_RAILS__RELATIVE__URL__ROOT:-}"                                                                                                            
    DATABASE_URL: "postgres://postgres:p4ssw0rd@openproject.xxxxx.us-west-2.rds.amazonaws.com/openproject"                                                                                    
    USE_PUMA: "true"                                                                                                                                                                                 
    # set to true to enable the email receiving feature. See ./docker/cron for more options                                                                                                          
    IMAP_ENABLED: "${IMAP_ENABLED:-false}"                                                                                                                                                           
  volumes:                                                                                                                                                                                           
    - "opdata:/var/openproject/assets"                                                                                                                                                               

services:                                                                                                                                                                                            
  proxy:                                                                                                                                                                                             
    <<: *image                                                                                                                                                                                       
    <<: *restart_policy                                                                                                                                                                              
    command: "./docker/proxy"                                                                                                                                                                        
    ports:                                                                                                                                                                                           
      - "${PORT:-8080}:80"                                                                                                                                                                           
    environment:
      APP_HOST: web
      OPENPROJECT_RAILS__RELATIVE__URL__ROOT: "${OPENPROJECT_RAILS__RELATIVE__URL__ROOT:-}"
    depends_on:
      - web
    networks:
      - frontend

  web:
    <<: *app
    command: "./docker/web"
    networks:
      - frontend
      - backend
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 2048M

  worker:
    <<: *app
    command: "/bin/sh -c './docker/worker && /bin/sh'"
    networks:
      - backend

  cron:
    <<: *app
    command: "./docker/cron"
    networks:
      - backend

使用3.7的写法,使得工作大大简化了。
与原版的差异如下所示。

    • dbコンテナ削除に伴う対応

volume削除
接続先設定変更
依存関係でのdb削除
service dbの削除

cacheコンテナ削除に伴う対応

接続先設定変更
依存関係でのcache削除
service cacheの削除

seederコンテナ削除に伴う対応

service seederの削除
依存関係でのseeder削除

essential設定が出来ないことへの対応

workerコンテナのコマンドを修正

webコンテナの使用リソース設定

CPUとメモリの設定を追加

我将解释以下三个内容。

「seeder容器删除后的处理」

seeder容器是在compose up时执行数据库初始化后退出的非常驻容器。

在ECS环境中,对于这种容器,必须进行essential = false的设置,但是关于如何在docker-compose.yml中设置essential没有在手册或示例中进行说明。

此外,由于seeder进程运行过慢导致整个环境关闭的情况频繁发生,因此我先创建了一个仅运行seeder的docker-compose.yml文件用于进行数据库配置,然后再使用上述引用的docker-compose.yml文件创建最终的环境。

“对于无法进行必要设置的处理”
如上所述,seeder容器不会常驻,但似乎还有一个具有类似功能的容器(worker)。为了避免其意外终止,对命令进行了修改。(可能是不必要的)

「Web容器的资源使用设置」
默认情况下,每个容器都以CPU 256ms/内存 512MB的限制设置启动。然而,由于这样的设置使得Web容器无法正常运行,因此我们为此容器分配了更多的资源。语法如示例所示。

其他

环境变量

默认情况下,代理容器绑定到了8080端口,但在Fargate上无法正常工作,因此在执行docker compose up时,我设置了以下环境变量,以便让容器使用相同的端口。

> set -x PORT 80 

转换

您可以通过以下方法查看您在CloudFormation中使用的文件。

> docker compose convert

总结

尽管对原始内容进行了相当大的修改,但基本上大部分都是为了环境设置而进行的编辑。因此,与使用ecs-cli相比,使用3.x语法比较容易。
我们已经解决了以前部署方法中的一些问题。
如果您想使用docker-compose.yml在ECS上部署服务,请务必尝试。

bannerAds