在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上部署服务,请务必尝试。