はじめに
WebGL課題が大学であった。そこでNuxtでSSRできたらスマーフォンからでも重い映像を描画できるんじゃないかと思い、見切り発車することにした。その際にCI/CDパイプライン作って、ECS、ECRの自動化チャレンジしたらさらに面白いんじゃないかってことでやってみた。
成果物のgit: https://github.com/yCroma/WebGL.git
内容
- DockerのMultipleCompose
- Makefileでシェルを叩く
- ECR、ECS
- Github ActionsでのCI/CD
- おまけ(Dockerfile,docker-composeの連携)
1. DockerのMultipleCompose
参考は以下の通り。
・docker-compose.ymlをDRYに書くテクニック2選
・Share Compose configurations between files and projects
何ができるかって言うと、複数のcomposeファイルを1つのファイルのようにして処理することができるようになる。
.
├── docker
│ ├── dev
│ │ ├── Dockerfile
│ │ └── docker-compose.dev.yml
│ └── prod
│ ├── Dockerfile
│ └── docker-compose.prod.yml
└── docker-compose.yml
こんなファイル群があったときに、開発用のdev
のcomposeファイルだけ利用したいという場合。
$ docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d
みたいな感じで利用することができる。これにより、ビルド用のファイルと開発環境用のファイルを分けて実行することができるからとても便利。
でも実際こんな長ったらしいコマンドを叩くのは面倒くさい。今回の例だと、Makefileとcommands
のなかに用意したshellファイルを実行することによって避けるようにしている。
2.Makefile
すごくシンプルなもので、長ったらしくなるコマンドをMakefileとshellのみで完結させた話。
.env
ファイル内に環境変数を用意して、shellで読み込み実行できるようにする。用意したshellをMakefileから叩く。
3. ECR、ECS
これはECRへのpushが詰まった。ログインが必要になるのだが、AWS Cli v2
を使っていたのでaws ecs login
みたいなコマンドが使えなかった。クラスメソッドさんの記事のおかげで解決することができた。
記事:[アップデート]AWS CLI v2 で $ aws ecr get-login を使うときの注意点
aws ecr get-login-password | docker login --username AWS --password-stdin https://<< AWSのアカウントID >>.dkr.ecr.<< region >>.amazonaws.com
注意点としては、--usernameはAWSであること。気を利かせて、自分のユーザー名とか入れると失敗する。
ECSに関しては、以下を参考にした。
構成とやり方
・【Nuxt.js】AWS ECR/FargateにデプロイするためのDockerイメージ作成方法
・nuxtプロジェクトを独自ドメインでSSR(CloudFront -> ALB -> Fargate)
タグ付、push
・Nuxt.jsでアプリ作成→Dockerfileを使ってイメージ作成→fargateでデプロイ→ドメイン設定・SSL化まで
4. Github ActionsでのCI/CD
結論から言うと、一回のCI/CDで約10分かかった。ここは更新点。
基本的に参考にしたのは、以下の記事。
・GitHub ActionsからサクッとFargateにデプロイしてみた
・GitHub ActionsからAmazon ECSにアプリをデプロイ
1つだけこだわったとこがあり、task-difinition.jsonをローカルで保存しないようにした。このおかげで、task-difinition.json内にアカウントのIDなど見られたくないものがあった場合でも安心。
task-difinitionの参考:Amazon ECS "Deploy Task Definition" Action for GitHub Actions
おまけ(Dockerfile,docker-composeの連携)
docker-composeからDockerfile内に環境変数を渡す方法が浮かばなかった。答えとしては、ARGで受け取ってENVで宣言すれば良かったらしい。
・docker-composeのビルド中に環境変数が認識されない
・Dockerfileの"ENV"と"ARG"と"環境変数"について
あとdocker-composeで任意のイメージ名を指定する方法。
・Docker Composeでビルド時に任意のイメージ名を指定する方法
おわりに
デプロイに10分かかってしまうのはあれだが、やはり快適だ。いずれは、Terraformを使って完全自動化を目指したい。